Docker 第三章 容器
操作 Docker 容器
容器是docker 的核心概念,容器是一個(gè)或一組獨(dú)立運(yùn)行的應(yīng)用,以及它們的運(yùn)行環(huán)境。對應(yīng)的,虛擬機(jī)可以理解為模擬運(yùn)行的一整套操作系統(tǒng)(提供了運(yùn)行態(tài)環(huán)境和其他系統(tǒng)環(huán)境)和跑在上面的應(yīng)用。
1.啟動容器
啟動容器有兩種方式,一種是基于鏡像新建一個(gè)容器并啟動,另外一個(gè)是將在終止?fàn)顟B(tài)(stopped)的容器重新啟動。
2.新建并啟動
所需要的命令主要為?docker run。
?
新建并啟動
Unable to find image 'ubuntu:18.04' locally 18.04: Pulling from library/ubuntu 6abc03819f3e: Pulling fs layer 6abc03819f3e: Pull complete 05731e63f211: Pull complete 0bd67c50d6be: Pull complete Digest: sha256:f08638ec7ddc90065187e7eabdfac3c96e5ff0f6b2f1762cf31a4f49b53000a5 Status: Downloaded newer image for ubuntu:18.04root@71f93fa546e3:/# root@71f93fa546e3:/# psPID TTY TIME CMD1 pts/0 00:00:00 bash10 pts/0 00:00:00 ps root@71f93fa546e3:/#?
?
其中,-t?選項(xiàng)讓Docker分配一個(gè)偽終端(pseudo-tty)并綁定到容器的標(biāo)準(zhǔn)輸入上,?-i?則讓容器的標(biāo)準(zhǔn)輸入保持打開。
?
當(dāng)利用 docker run 來創(chuàng)建容器時(shí),Docker 在后臺運(yùn)行的標(biāo)準(zhǔn)操作包括:檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載 利用鏡像創(chuàng)建并啟動一個(gè)容器 分配一個(gè)文件系統(tǒng),并在只讀的鏡像層外面掛載一層可讀寫層 從宿主主機(jī)配置的網(wǎng)橋接口中橋接一個(gè)虛擬接口到容器中去 從地址池配置一個(gè) ip 地址給容器 執(zhí)行用戶指定的應(yīng)用程序 執(zhí)行完畢后容器被終止?
?
啟動已終止容器
可以利用?docker container start?命令,直接將一個(gè)已經(jīng)終止的容器啟動運(yùn)行。
容器的核心為所執(zhí)行的應(yīng)用程序,所需要的資源都是應(yīng)用程序運(yùn)行所必需的。除此之外,并沒有其它的資源。可以在偽終端中利用?ps?或?top?來查看進(jìn)程信息。
root@localhost ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 71f93fa546e3 ubuntu:18.04 "/bin/bash" 2 minutes ago Up 2 minutes silly_gauss 11713cdf0b36 dockerpracticecn/docker_practice "nginx -g 'daemon of…" 19 minutes ago Up 19 minutes 0.0.0.0:4000->80/tcp priceless_borg [root@localhost ~]# docker container ls?
?
?
后臺運(yùn)行
更多的時(shí)候,需要讓 Docker 在后臺運(yùn)行而不是直接把執(zhí)行命令的結(jié)果輸出在當(dāng)前宿主機(jī)下。此時(shí),可以通過添加?-d?參數(shù)來實(shí)現(xiàn)。
下面舉兩個(gè)例子來說明一下。
如果不使用?-d?參數(shù)運(yùn)行容器。
[root@localhost ~]# docker run ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" hello world hello world hello world hello world hello world hello world hello world hello world hello world ^C[root@localhost ~]# ^C [root@localhost ~]# docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" 68dd6ebc3dd6d1ff03e551762e5c0b18815e7566ce292795892eccb044370c05 [root@localhost ~]# [root@localhost ~]#此時(shí)容器會在后臺運(yùn)行并不會把輸出的結(jié)果 (STDOUT) 打印到宿主機(jī)上面(輸出結(jié)果可以用?docker logs?查看)。
[root@localhost ~]# docker container logs 68dd6ebc3dd6 hello world hello world hello world hello world hello world hello world hello world?
注:?容器是否會長久運(yùn)行,是和?docker run?指定的命令有關(guān),和?-d?參數(shù)無關(guān)。
使用?-d?參數(shù)啟動后會返回一個(gè)唯一的 id,也可以通過?docker container ls?命令來查看容器信息。
[root@localhost ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 11713cdf0b36 dockerpracticecn/docker_practice "nginx -g 'daemon of…" 30 minutes ago Up 30 minutes 0.0.0.0:4000->80/tcp priceless_borg [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# docker container start 68dd6ebc3dd6 68dd6ebc3dd6 [root@localhost ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 68dd6ebc3dd6 ubuntu:18.04 "/bin/sh -c 'while t…" 3 minutes ago Up 2 seconds angry_haslett 11713cdf0b36 dockerpracticecn/docker_practice "nginx -g 'daemon of…" 30 minutes ago Up 30 minutes 0.0.0.0:4000->80/tcp priceless_borg [root@localhost ~]# docker container stop 68dd6ebc3dd668dd6ebc3dd6 [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 11713cdf0b36 dockerpracticecn/docker_practice "nginx -g 'daemon of…" 31 minutes ago Up 31 minutes 0.0.0.0:4000->80/tcp priceless_borg [root@localhost ~]#?
終止容器
可以使用?docker container stop?來終止一個(gè)運(yùn)行中的容器。
此外,當(dāng) Docker 容器中指定的應(yīng)用終結(jié)時(shí),容器也自動終止。
例如對于上一章節(jié)中只啟動了一個(gè)終端的容器,用戶通過?exit?命令或?Ctrl+d?來退出終端時(shí),所創(chuàng)建的容器立刻終止。
終止?fàn)顟B(tài)的容器可以用?docker container ls -a?命令看到。例如
[root@localhost ~]# docker container ls #列出活動的容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 11713cdf0b36 dockerpracticecn/docker_practice "nginx -g 'daemon of…" 34 minutes ago Up 34 minutes 0.0.0.0:4000->80/tcp priceless_borg [root@localhost ~]# [root@localhost ~]# docker container ls -a #列出所有容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 68dd6ebc3dd6 ubuntu:18.04 "/bin/sh -c 'while t…" 7 minutes ago Exited (137) 3 minutes ago angry_haslett 74d05a9b6bfd ubuntu:18.04 "/bin/sh -c 'while t…" 7 minutes ago Exited (0) 7 minutes ago objective_chaum 71f93fa546e3 ubuntu:18.04 "/bin/bash" 17 minutes ago Exited (0) 8 minutes ago silly_gauss 11713cdf0b36 dockerpracticecn/docker_practice "nginx -g 'daemon of…" 34 minutes ago Up 34 minutes 0.0.0.0:4000->80/tcp priceless_borg 6603c0996cb7 nginx "nginx -g 'daemon of…" 3 days ago Exited (255) 4 hours ago 80/tcp angry_gates 785c1b8f6469 nginx "/bin/bash/echo test" 3 days ago Created 80/tcp reverent_bassi 517422f3ebb2 nginx "nginx -g 'daemon of…" 12 days ago Exited (255) 10 days ago 80/tcp web1 a14868c3b1ec fce289e99eb9 "/hello" 2 weeks ago Exited (0) 2 weeks ago tender_wilbur [root@localhost ~]#?
?
處于終止?fàn)顟B(tài)的容器,可以通過?docker container start?命令來重新啟動。
此外,docker container restart?命令會將一個(gè)運(yùn)行態(tài)的容器終止,然后再重新啟動它。
?
進(jìn)入容器
在使用?-d?參數(shù)時(shí),容器啟動后會進(jìn)入后臺。
某些時(shí)候需要進(jìn)入容器進(jìn)行操作,包括使用?docker attach?命令或?docker exec?命令,推薦大家使用?docker exec?命令,原因會在下面說明。
?
attach?命令
[root@localhost ~]# docker run -dit ubuntu 5da48ce5974710e5bcc173a889d992983b8eb0365cb55210e678d72debfa0553 [root@localhost ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5da48ce59747 ubuntu "/bin/bash" 7 seconds ago Up 5 seconds heuristic_taussig 756e0df1467d ubuntu "/bin/bash" About a minute ago Up About a minute nifty_shamir e958909dcdc4 ubuntu "/bin/bash" About a minute ago Up About a minute vigorous_hypatia 11713cdf0b36 dockerpracticecn/docker_practice "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:4000->80/tcp priceless_borg [root@localhost ~]# docker attach 5da4 root@5da48ce59747:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@5da48ce59747:/# psPID TTY TIME CMD1 pts/0 00:00:00 bash11 pts/0 00:00:00 ps root@5da48ce59747:/##注意:?如果從這個(gè) stdin 中 exit,會導(dǎo)致容器的停止。
?
exec?命令
-i -t 參數(shù)
docker exec?后邊可以跟多個(gè)參數(shù),這里主要說明?-i?-t?參數(shù)。
只用?-i?參數(shù)時(shí),由于沒有分配偽終端,界面沒有我們熟悉的 Linux 命令提示符,但命令執(zhí)行結(jié)果仍然可以返回。
當(dāng)?-i?-t?參數(shù)一起使用時(shí),則可以看到我們熟悉的 Linux 命令提示符。
[root@localhost ~]# docker exec -i 756e bash #不顯示登錄終端 df Filesystem 1K-blocks Used Available Use% Mounted on overlay 9959424 2368420 7591004 24% / tmpfs 65536 0 65536 0% /dev tmpfs 498980 0 498980 0% /sys/fs/cgroup /dev/mapper/centos-root 9959424 2368420 7591004 24% /etc/hosts shm 65536 0 65536 0% /dev/shm tmpfs 498980 0 498980 0% /proc/asound tmpfs 498980 0 498980 0% /proc/acpi tmpfs 498980 0 498980 0% /proc/scsi tmpfs 498980 0 498980 0% /sys/firmware exit [root@localhost ~]# docker exec -it 756e bash #顯示登錄終端 root@756e0df1467d:/# df Filesystem 1K-blocks Used Available Use% Mounted on overlay 9959424 2368420 7591004 24% / tmpfs 65536 0 65536 0% /dev tmpfs 498980 0 498980 0% /sys/fs/cgroup /dev/mapper/centos-root 9959424 2368420 7591004 24% /etc/hosts shm 65536 0 65536 0% /dev/shm tmpfs 498980 0 498980 0% /proc/asound tmpfs 498980 0 498980 0% /proc/acpi tmpfs 498980 0 498980 0% /proc/scsi tmpfs 498980 0 498980 0% /sys/firmware root@756e0df1467d:/#?
如果從這個(gè) stdin 中 exit,不會導(dǎo)致容器的停止。這就是為什么推薦大家使用?docker exec?的原因。
更多參數(shù)說明請使用?docker exec --help?查看。
?
導(dǎo)出和導(dǎo)入容器
導(dǎo)出容器
如果要導(dǎo)出本地某個(gè)容器,可以使用?docker export?命令。
[root@localhost ~]# docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3b176a3a61d5 dockerpracticecn/docker_practice "nginx -g 'daemon of…" 17 minutes ago Up 17 minutes 0.0.0.0:4000->80/tcp xenodochial_mcclintock 5da48ce59747 ubuntu "/bin/bash" 18 minutes ago Exited (0) 14 minutes ago heuristic_taussig 756e0df1467d ubuntu "/bin/bash" 19 minutes ago Exited (0) 4 minutes ago nifty_shamir e958909dcdc4 ubuntu "/bin/bash" 19 minutes ago Up 19 minutes vigorous_hypatia 68dd6ebc3dd6 ubuntu:18.04 "/bin/sh -c 'while t…" About an hour ago Exited (137) 44 minutes ago angry_haslett 74d05a9b6bfd ubuntu:18.04 "/bin/sh -c 'while t…" About an hour ago Exited (0) About an hour ago objective_chaum 71f93fa546e3 ubuntu:18.04 "/bin/bash" About an hour ago Exited (0) About an hour ago silly_gauss 6603c0996cb7 nginx "nginx -g 'daemon of…" 3 days ago Exited (255) 5 hours ago 80/tcp angry_gates 785c1b8f6469 nginx "/bin/bash/echo test" 3 days ago Created 80/tcp reverent_bassi 517422f3ebb2 nginx "nginx -g 'daemon of…" 12 days ago Exited (255) 10 days ago 80/tcp web1 a14868c3b1ec fce289e99eb9 "/hello" 2 weeks ago Exited (0) 2 weeks ago tender_wilbur [root@localhost ~]# docker export 5da > ubuntu.tar [root@localhost ~]# ls anaconda-ks.cfg ubuntu.tar [root@localhost ~]# ll ubuntu.tar -rw-r--r-- 1 root root 72332800 May 27 03:37 ubuntu.tar [root@localhost ~]# #導(dǎo)出容器快照到本地文件?
?
導(dǎo)入容器快照
可以使用?docker import?從容器快照文件中再導(dǎo)入為鏡像,例如
[root@localhost ~]# cat ubuntu.tar | docker import - test/ubuntu:v1.0 sha256:fe4eda56cd374133a7f3a6ce6b12bc13d26fe78a5083f63171ecfbd5b005dead [root@localhost ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE test/ubuntu v1.0 fe4eda56cd37 13 seconds ago 69.9MB ubuntu 18.04 7698f282e524 11 days ago 69.9MB ubuntu latest 7698f282e524 11 days ago 69.9MB dockerpracticecn/docker_practice latest b6bfd54275de 13 days ago 41.8MB nginx latest 53f3fd8007f7 2 weeks ago 109MB iganarix/base-ubuntu-18.04 latest 0ffa5d899369 5 weeks ago 558MB progrium/busybox latest a67699e37dbd 7 months ago 4.8MB [root@localhost ~]#?
注:用戶既可以使用?docker load?來導(dǎo)入鏡像存儲文件到本地鏡像庫,也可以使用?docker import?來導(dǎo)入一個(gè)容器快照到本地鏡像庫。這兩者的區(qū)別在于容器快照文件將丟棄所有的歷史記錄和元數(shù)據(jù)信息(即僅保存容器當(dāng)時(shí)的快照狀態(tài)),而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導(dǎo)入時(shí)可以重新指定標(biāo)簽等元數(shù)據(jù)信息。
刪除容器
可以使用?docker container rm?來刪除一個(gè)處于終止?fàn)顟B(tài)的容器。例如
[root@localhost /]# docker container rm 5da4 5da4 [root@localhost /]# docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3b176a3a61d5 dockerpracticecn/docker_practice "nginx -g 'daemon of…" 42 minutes ago Up 42 minutes 0.0.0.0:4000->80/tcp xenodochial_mcclintock 756e0df1467d ubuntu "/bin/bash" 44 minutes ago Exited (0) 30 minutes ago nifty_shamir e958909dcdc4 ubuntu "/bin/bash" 45 minutes ago Up 45 minutes vigorous_hypatia 68dd6ebc3dd6 ubuntu:18.04 "/bin/sh -c 'while t…" About an hour ago Exited (137) About an hour ago angry_haslett 74d05a9b6bfd ubuntu:18.04 "/bin/sh -c 'while t…" About an hour ago Exited (0) About an hour ago objective_chaum 71f93fa546e3 ubuntu:18.04 "/bin/bash" About an hour ago Exited (0) About an hour ago silly_gauss 6603c0996cb7 nginx "nginx -g 'daemon of…" 3 days ago Exited (255) 5 hours ago 80/tcp angry_gates 785c1b8f6469 nginx "/bin/bash/echo test" 3 days ago Created 80/tcp reverent_bassi 517422f3ebb2 nginx "nginx -g 'daemon of…" 12 days ago Exited (255) 10 days ago 80/tcp web1 a14868c3b1ec fce289e99eb9 "/hello" 2 weeks ago Exited (0) 2 weeks ago tender_wilbur [root@localhost /]#
清理所有處于終止?fàn)顟B(tài)的容器
用?docker container ls -a?命令可以查看所有已經(jīng)創(chuàng)建的包括終止?fàn)顟B(tài)的容器,如果數(shù)量太多要一個(gè)個(gè)刪除可能會很麻煩,用下面的命令可以清理掉所有處于終止?fàn)顟B(tài)的容器。
[root@localhost /]# docker container prune WARNING! This will remove all stopped containers. Are you sure you want to continue? [y/N] y Deleted Containers: 756e0df1467d54351555c9cd43f061ef653b506b7b9b67b8a320b1398f071a24 68dd6ebc3dd6d1ff03e551762e5c0b18815e7566ce292795892eccb044370c05 74d05a9b6bfd2d6e1bed801b030d2d2c0005096c91f2566fc3ad02ee6117f254 71f93fa546e30f0b6da59015feda84c6d18a0a92fae92984649f196e9ce38a89 6603c0996cb7caae8b8f54900239e2c3f02ec01b23a6c17708739caa0bc5bbfe 785c1b8f6469b44dde63fe153c1888ec927c36bfc29f4d84f58ecf104ab273b7 517422f3ebb2a0b81e1e0fc056caafaee8f886236176cdcbd5aac5d90c044aea a14868c3b1ec6901f45987ddd2919675b9aa3ee117402a1b2a73ec49d3572dbfTotal reclaimed space: 82B [root@localhost /]#?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/zy09/p/10913304.html
總結(jié)
以上是生活随笔為你收集整理的Docker 第三章 容器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Codeforces Round #74
- 下一篇: 2021年35个最佳WordPress企