利用這 8 個命令可以學習 Docker 容器的基本管理方式。這是一個為 Docker 初學者準備的,帶有示範命令輸出的指南。
在這篇文章中,我們將帶你學習 8 個基本的 Docker 容器命令,它們操控著 Docker 容器的基本活動,例如 執行run、 列舉list、 停止stop、 檢視歷史紀錄logs、 刪除delete 等等。如果你對 Docker 的概念很陌生,推薦你看看我們的 介紹指南,來了解 Docker 的基本內容以及 如何 在 Linux 上安裝 Docker。 現在讓我們趕快進入要了解的命令:
如何執行 Docker 容器?
眾所周知,Docker 容器只是一個執行於宿主作業系統host OS上的應用程式,所以你需要一個映象來執行它。Docker 映象以程式的方式執行時就叫做 Docker 容器。你可以載入本地 Docker 映象,也可以從 Docker Hub 上下載。Docker Hub 是一個提供公有和私有映象來進行拉取pull操作的集中倉庫。官方的 Docker Hub 位於 hub.docker.com。 當你指示 Docker 引擎執行容器時,它會首先搜尋本地映象,如果沒有找到,它會從 Docker Hub 上拉取相應的映象。
讓我們執行一個 Apache web 伺服器的 Docker 映象,比如 httpd 程式。你需要執行 docker container run
命令。舊的命令為 docker run
, 但後來 Docker 新增了子命令部分,所以新版本支援下列命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
root@kerneltalks # docker container run -d -p 80:80 httpd Unable to find image 'httpd:latest' locally latest: Pulling from library/httpd 3d77ce4481b1: Pull complete 73674f4d9403: Pull complete d266646f40bd: Pull complete ce7b0dda0c9f: Pull complete 01729050d692: Pull complete 014246127c67: Pull complete 7cd2e04cf570: Pull complete Digest: sha256:f4610c3a1a7da35072870625733fd0384515f7e912c6223d4a48c6eb749a8617 Status: Downloaded newer image for httpd:latest c46f2e9e4690f5c28ee7ad508559ceee0160ac3e2b1688a61561ce9f7d99d682 |
Docker 的 run
命令將映象名作為強制引數,另外還有很多可選引數。常用的引數有:
-d
:從當前 shell 脫離容器-p X:Y
:繫結容器的埠 Y 到宿主機的埠 X--name
:命名你的容器。如果未指定,它將被賦予隨機生成的名字-e
:當啟動容器時傳遞環境編輯及其值
通過以上輸出你可以看到,我們將 httpd
作為映象名來執行容器。接著,本地映象沒有找到,Docker 引擎從 Docker Hub 拉取了它。注意,它下載了映象 httpd:latest
, 其中 :
後面跟著版本號。如果你需要執行特定版本的容器,你可以在映象名後面註明版本名。如果不提供版本名,Docker 引擎會自動拉取最新的版本。
輸出的最後一行顯示了你新執行的 httpd 容器的唯一 ID。
如何列出所有執行中的 Docker 容器?
現在,你的容器已經執行起來了,你可能想要確認這一點,或者你想要列出你的機器上執行的所有容器。你可以使用 docker container ls
命令。在舊的 Docker 版本中,對應的命令為 docker ps
。
1 2 3 4 |
root@kerneltalks # docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c46f2e9e4690 httpd "httpd-foreground" 11 minutes ago Up 11 minutes 0.0.0.0:80->80/tcp cranky_cori |
列出的結果是按列顯示的。每一列的值分別為:
- Container ID :一開始的幾個字元對應你的容器的唯一 ID
- Image :你執行容器的映象名
- Command :容器啟動後執行的命令
- Created :建立時間
- Status :容器當前狀態
- Ports :與宿主埠相連線的埠資訊
- Names :容器名(如果你沒有命名你的容器,那麼會隨機建立)
如何檢視 Docker 容器的歷史紀錄?
在第一步我們使用了 -d
引數來將容器,在它一開始執行的時候,就從當前的 shell 中脫離出來。在這種情況下,我們不知道容器裡面發生了什麼。所以為了檢視容器的歷史紀錄,Docker 提供了 logs
命令。它採用容器名稱或 ID 作為引數。
1 2 3 4 5 6 |
root@kerneltalks # docker container logs cranky_cori AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message [Thu May 31 18:35:07.301158 2018] [mpm_event:notice] [pid 1:tid 139734285989760] AH00489: Apache/2.4.33 (Unix) configured -- resuming normal operations [Thu May 31 18:35:07.305153 2018] [core:notice] [pid 1:tid 139734285989760] AH00094: Command line: 'httpd -D FOREGROUND' |
這裡我使用了容器名稱作為引數。你可以看到在我們的 httpd 容器中與 Apache 相關的歷史紀錄。
如何確定 Docker 容器的程式?
容器是一個使用宿主資源來執行的程式。這樣,你可以在宿主系統的程式表中定位容器的程式。讓我們在宿主系統上確定容器程式。
Docker 使用著名的 top
命令作為子命令的名稱,來檢視容器產生的程式。它採用容器的名稱或 ID 作為引數。在舊版本的 Docker 中,只可執行 docker top
命令。在新版本中,docker top
和 docker container top
命令都可以生效。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
root@kerneltalks # docker container top cranky_cori UID PID PPID C STIME TTY TIME CMD root 15702 15690 0 18:35 ? 00:00:00 httpd -DFOREGROUND bin 15729 15702 0 18:35 ? 00:00:00 httpd -DFOREGROUND bin 15730 15702 0 18:35 ? 00:00:00 httpd -DFOREGROUND bin 15731 15702 0 18:35 ? 00:00:00 httpd -DFOREGROUND root@kerneltalks # ps -ef |grep -i 15702 root 15702 15690 0 18:35 ? 00:00:00 httpd -DFOREGROUND bin 15729 15702 0 18:35 ? 00:00:00 httpd -DFOREGROUND bin 15730 15702 0 18:35 ? 00:00:00 httpd -DFOREGROUND bin 15731 15702 0 18:35 ? 00:00:00 httpd -DFOREGROUND root 15993 15957 0 18:59 pts/0 00:00:00 grep --color=auto -i 15702 |
在第一個輸出中,列出了容器產生的程式的列表。它包含了所有細節,包括使用者號uid、程式號pid,父程式號ppid、開始時間、命令,等等。這裡所有的程式號你都可以在宿主的程式表裡搜尋到。這就是我們在第二個命令裡做得。這證明了容器確實是宿主系統中的程式。
如何停止 Docker 容器?
只需要 stop
命令!同樣,它採用容器名稱或 ID 作為引數。
1 2 3 |
root@kerneltalks # docker container stop cranky_cori cranky_cori |
如何列出停止的或不活動的 Docker 容器?
現在我們停止了我們的容器,這時如果我們使用 ls
命令,它將不會出現在列表中。
1 2 3 |
root@kerneltalks # docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
所以,在這種情況下,如果想要檢視停止的或不活動的容器,你需要在 ls
命令裡同時使用 -a
引數。
1 2 3 4 |
root@kerneltalks # docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c46f2e9e4690 httpd "httpd-foreground" 33 minutes ago Exited (0) 2 minutes ago cranky_cori |
有了 -a
引數,現在我們可以檢視已停止的容器。注意這些容器的狀態被標註為 已退出exited。既然容器只是一個程式,那麼用“退出”比“停止”更合適!
如何(重新)啟動 Docker 容器?
現在,我們來啟動這個已停止的容器。這和執行一個容器有所區別。當你執行一個容器時,你將啟動一個全新的容器。當你啟動一個容器時,你將開始一個已經停止並儲存了當時執行狀態的容器。它將以停止時的狀態重新開始執行。
1 2 3 4 5 6 7 |
root@kerneltalks # docker container start c46f2e9e4690 c46f2e9e4690 root@kerneltalks # docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c46f2e9e4690 httpd "httpd-foreground" 35 minutes ago Up 8 seconds 0.0.0.0:80->80/tcp cranky_cori |
如何移除 Docker 容器?
我們使用 rm
命令來移除容器。你不可以移除執行中的容器。移除之前需要先停止容器。你可以使用 -f
引數搭配 rm
命令來強制移除容器,但並不推薦這麼做。
1 2 3 4 5 |
root@kerneltalks # docker container rm cranky_cori cranky_cori root@kerneltalks # docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
你看,一旦移除了容器,即使再使用 ls -a
命令也檢視不到容器了。