執行一個容器
如果想要找到一個現有的映象,可以在公開的 Docker Hub 上搜尋,這裡可以找到它的介紹和用法,就像在 GitHub 上找一個開源專案一樣。
如果你是第一次使用 Docker Hub,可以先註冊一個賬號,在最頂上的搜尋方塊裡輸入 ubuntu ,找到的第一個結果就是官方的 ubuntu 映象,點開可以看到上圖的頁面。
這個頁面上有映象的一些基本資訊和用法介紹,右邊的 docker pull ubuntu 命令用來在本地拉取映象。在上一篇已經說過,當我們範例化一個容器時,如果 Docker 在本地找不到指定的映象,它會自動進行拉取,因此,我們可以直接在本地執行:
docker run -i -t ubuntu /bin/bash
這個命令比上次的範例多了一些引數,下面解釋一下:
-i 可以保證容器中開啟 STDIN
-t 會為容器分配一個偽 TTY 終端
ubuntu 是映象的名稱,相當於上個範例中的 hello-world
/bin/bash 是啟動後要在容器中執行的命令
其中 -i 和 -t 兩個引數可以使容器執行起來之後,我們可以與之互動。當容器建立完成,Docker 就會執行容器中的 /bin/bash 命令,因此,容器執行後我們的終端會附著到容器上:
此時,你可以在開啟一個終端,輸入 docker ps 命令,檢視已經啟動的容器,得到的結果如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 402c5d3468d7 ubuntu "/bin/bash" 4 hours ago Up 4 hours reverent_wu
這裡展示了容器的 ID、映象、最後執行的命令、建立時間、狀態、名稱。這裡的名稱 reverent_wu 是 Docker 自動生成的,如果需要在建立容器時指定名稱,可以使用 --name 來給容器命名。
深入容器內部
當前的狀態下,我們可以在附著到容器的終端執行任何 ubuntu 系統下支援的命令。比如,輸入 hostname 命令,發現容器的 hostname 就是它的容器 ID。
接著,可以看一下 /etc/hosts 檔案:
root@402c5d3468d7:/# cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 402c5d3468d7
你也可以自己嘗試在容器中檢視程序,甚至使用 apt-get 安裝軟體包。
最後,可以輸入 exit 命令,推出容器,返回宿主機的命令提示字元。注意,此時再執行 docker ps 時發現,容器的列表中,已經沒有剛剛建立的 ubuntu 容器了。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
當我們退出的時候,容器就停止執行了。不過,容器並沒有被刪除,可以通過 docker ps -a 命令,檢視所有建立的容器,無論容器啟動與否:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 402c5d3468d7 ubuntu "/bin/bash" 4 hours ago Exited (0) 2 minutes ago reverent_wu
這時,它的狀態變成了 Exited (0) 2 minutes ago ,表示它在 2 分鐘之前推出,退出的狀態碼是 0,表示正常退出。
我們可以通過一下的命令重新啟動這個容器:
docker start 402c5d3468d7
這個命令中,docker start 後面跟的是容器的 ID,也可以使用容器的名稱。執行成功後,再通過 docker ps 命令即可看到容器處於啟動狀態,通過 docker start 命令讓容器重新啟動後,會沿用 docker run 命令指定的引數,也就是啟動後會執行 /bin/bash 啟動一個 shell,但是我們並沒有進入到容器的命令列當中。可以通過 docker attach 命令再次進入:
docker attach 402c5d3468d7
此時,就可以繼續在容器中執行命令。
如果一個容器不再使用了,可以使用 docker rm 命令將它刪除。
docker rm 402c5d3468d7
提供持續的服務
更多的時候,我們使用容器來執行應用程式和服務,並希望它在後臺持續提供服務,這時候就需要以分離模式(或者叫守護模式)來執行容器。只需要在 docker run 後面增加一個 -d 引數,就可以讓容器放到後臺執行。
接下來,我們通過下面的命令再次執行一個容器:
docker run --name detached_mode -d ubuntu /bin/sh -c "while true; do echo Docker YYDS; sleep 1; done"
這一次,我們給這個容器明明叫 detached_mode,通過 -d 讓它以分離模式執行,並通過執行一段指令碼,每隔 1 秒鐘列印一行 Docker YYDS 。
因為它是以分離模式執行的,所以啟動後我們並不能在命令列看到列印的內容。但是可以通過 docker ps 命令看到容器在執行。
如果想讓他停止執行,可以使用 docker stop 命令。
docker stop detached_mode
同樣可以通過 docker start 命令再次啟動它,或者,可以通過 docker restart 重新啟動執行中的容器。
容器的執行狀態
在 detached_mode 容器執行的時候,可以通過 docker logs 命令獲取容器的紀錄檔。也可以增加 -f 來持續監控紀錄檔,類似於 tail -f 命令。
docker logs -f detached_mode
此時就可以看到一直有 Docker YYDS 被列印。
除了監控容器的紀錄檔,也可以使用 docker top 命令,檢視容器內的程序。
docker top detached_mode
使用 docker stats 命令,可以檢視容器的CPU、記憶體、網路I/O、儲存I/O的效能和指標。
另外,docker exec 命令可以在容器內部執行程序。
docker exec detached_mode cat /etc/hosts
以上命令可以讓我們直接檢視容器中的 hosts 檔案的內容,如果需要執行一個後臺程序,在指令後面增加 -d 引數就可以了。
容器的詳細資訊
使用 docker inspect 命令可以檢視容器的詳細資訊,其結果是一個 JSON 結構,包含的資訊非常豐富。可以通過 -f 或者 --format 來選定想要檢視的部分。
docker inspect --format '{{ .NetworkSettings.IPAddress }}' detached_mode
執行以上的命令,只會在命令列展示容器的 IP 地址。
推薦學習:《》
以上就是完全掌握Docker學習之容器的使用的詳細內容,更多請關注TW511.COM其它相關文章!