容器管理
本節內容簡介
回顧加本節內容
容器是Docker的一個基本概念,每個容器中都運行一個應用並為該應用提供完整的運行環境。本實驗將詳細學習Docker容器的創建,運行管理操作。需要依次完成下面幾項任務:
- 創建第一個容器
- 查看容器信息
- 容器創建
- 管理容器運行狀態
- 容器導出及導入
一、實驗一:創建第一個容器
還記得上一節實驗中我們如何創建一個持續運行的容器嗎?在這里我們回顧下創建的步驟:
如果我們需要一個保持運行的容器呢,最簡單的方法就是給這個容器一個可以保持的應用,比如bash
,運行 ubuntu 容器並進入容器的 bash:
$ docker run -t -i ubuntu /bin/bash
上面命令的說明:
-t
:分配一個pseudo-TTY
-i
:--interactive
參數縮寫,表示交互模式,如果沒有attach
保持 STDIN 打開狀態ubuntu
:運行的鏡像名稱,默認為latest
標簽/bin/bash
:容器中運行的應用
通過這個簡單的命令,我們現在進入了新創建容器的bash中,在bash里執行的任何命令都不會影響到我們的宿主機,可以隨意操作。你可以看到主機名和環境變量 HOSTNAME
都已經顯示為容器的ID了。
在這個bash下,我們可以進行各種Ubuntu系統上的操作,當然因為Docker本身的限制,有些涉及到磁盤、網絡、設備等Linux特權命令是無法執行的,可以試試reboot
命令,會提示你shutdown: Unable to shutdown system
。
如何退出這個bash呢?有兩種方法,兩種方法的效果完全不同:
- 直接
exit
,這時候 bash 程序終止,容器進入到停止狀態 - 使用組合鍵退出,仍然保持容器運行,我們可以隨時回來到這個bash中來,組合鍵是
Ctrl-p Ctrl-q
,你沒有看錯,是兩組組合鍵,先同時按下Ctrl
和p,再按Ctrl
和q。就可以退出到我們的宿主機了。
上述第二種方法比較常用,此時使用 docker ps
查看,能看到容器仍然在運行中:
Ctrl+p和ctrl+q 離開容器,暫時退出容器但不關閉。
如果想再次回到剛才的bash中,只需要使用 docker attach
命令就可以再次連接到運行的bash里:
注意: 命令后面的參數是容器的ID,並不需要輸入完整的數字,只要能唯一定位這個容器即可,通常輸入4位就足夠了。
我們創建了第一個容器后,將會先實踐一些容器信息查看的命令。通過這些命令我們可以在宿主機上了解到容器的運行情況。
注意:下面的命令都是針對該容器執行的,參數中的容器ID請替換成你實際實驗中創建的容器ID。
二、實驗二:查看容器信息
1、查看容器列表 - docker ps
docker ps
命令最常用,可以列出所有容器的信息,默認情況下只顯示運行狀態的容器。
必要的參數在上一節實驗中已經介紹過了,這里可以進行回顧。
幾個最常用的參數:
-a
:查看所有容器,含停止運行的-l
:查看剛啟動的容器-q
:只顯示容器ID
我們查看所有容器的ID列表:
2、查看容器內進程信息 - docker top
docker top
命令查看容器中運行的進程信息,顯示容器中進程的PID,UID,PPID,時間,tty等信息。
上圖中的輸出結果由於終端大小限制,造成列表壓縮到兩行。
3、查看容器輸出信息 - docker logs
獲取容器的輸出信息可以使用 docker logs
命令,我們使用 docker attach
回到剛才創建的/bin/bash
容器中,寫一個循環輸出信息的腳本,然后再使用Ctrl-P Ctrl-Q
組合鍵退出。
在宿主機的終端中,我們可以用docker logs
命令查看輸出信息。
docker logs
只會顯示截止到當前的所有輸出,如果想動態查看實時輸出,也可以加-f
參數,類似tail
命令:
4、查看容器詳細信息 - docker inspect
docker inspect
查看容器的細節信息,包括創建時間,操作命令,端口映射信息,IP地址等等。
這個命令不只可以查看容器的詳細信息,也支持鏡像的詳細信息。默認輸出JSON格式的信息,可以通過-f
指定輸出的項目。
上述命令中我們查看了網絡配置信息中的IP地址和Gateway地址。
5、查看容器的運行信息 - docker stats
docker stats
可以查看到運行狀態容器的CPU,內存及網絡使用率。在實際工作中,我們通常會把這個命令的輸出連接到類似Logstash一類的服務用來分析。
這個命令的輸出是實時刷新的(類似Linux上的top
命令),如果需要退出可以使用Ctrl-C
組合鍵。
6、查看容器中的修改 - docker diff
docker diff
查看容器中對鏡像做了哪些變化。
實驗過程如下:
- 先執行
docker diff
查看現有的容器中的變化,發現沒有任何文件變化 - 連接到容器內部,
Ctrl-C
中斷先前實驗的死循環 - 再創建幾個文件
- 退出到宿主機
- 再次使用
docker diff
命令查看是否有新的修改
輸出的信息中A
表示添加,后面的三個新建文件的路徑。可以嘗試下修改或刪除文件會有怎樣的diff
輸出。
7、連接到容器中 - docker attach
docker attach
可以進入到容器操作。當我們容器后台運行時,有需要的話也可以再次連接進入到容器中。
這個命令在上述的實驗中已經多次用到了,不再提供單獨的操作。
三、實驗三:創建容器
創建一個容器的命令是 docker run
。還記得先前實驗中學習的Hello, Shiyanlou
及/bin/bash
容器如何創建的嗎?在上一節中我們學習了最基本的容器創建方式,本節內容我們將通過實例來學習更詳細的docker run
參數。
docker run
命令的執行步驟:
- 查找鏡像或下載鏡像
- 創建容器
- 分配文件系統及虛擬網絡(網橋,接口,IP地址),其中容器中的DNS默認掛載宿主機的
/etc/resolve.conf
和/etc/hosts
。 - 執行應用,默認執行鏡像中指定的CMD參數,也可以在
docker run
后面跟應用來覆蓋CMD命令。
如果容器中的應用執行完成,則容器進入到終止狀態。
docker run
的參數非常多,本實驗中我們設定要創建的容器配置:
- 設置容器名稱
shiyanlou
(使用--name
,如果不加該參數,Docker會隨機產生一個名字)。 - 設置容器的主機名
shiyanlou
(使用--hostname
參數) - 設定網絡信息,這里只使用一個簡單的參數設置MAC地址(
--mac-address
參數) - 設置資源限制,設置容器中最大的進程數,包括soft和hard兩個限制值(使用
-ulimit nproc=...
等參數)
創建容器過程中也可以掛載數據卷,數據卷在下一節實驗中會詳細介紹。這里不過多涉及。
根據上述的需求我們通過查詢 docker run --help
,使用相關參數,創建符合要求的容器:
docker run --name shiyanlou --hostname shiyanlou --mac-address 00:01:02:03:04:05 --ulimit nproc=1024:2048 -t -i ubuntu /bin/bash
進入容器中我們可以對一些參數進行驗證:
容器中的 ulimit
不會有任何輸出,查看實際的ulimit
信息可以在宿主機上使用docker inspect
查看:
四、實驗四:容器運行狀態
1、守護狀態
首先需要了解的概念是容器的守護狀態,類似於守護進程,需要為run
命令增加參數-d
,此時容器在后台以守護狀態(Daemonized)形式運行。
創建一個守護狀態的容器:
docker run -d ubuntu /bin/bash -c "while true; do echo 'hello shiyanlou'; sleep 1; done"
會啟動一個守護狀態的容器在后台運行,使用 docker attach
登錄上去可以看到循環輸出 hello shiyanlou
的字符串。
2、容器運行管理
本節實驗中,我們需要練習啟動,停止,重啟容器的若干命令。這些命令用來管理從容器創建后到刪除的整個生命周期。
停止容器 docker stop
停止運行狀態的容器,進入到終止狀態。停止狀態的容器可以通過 docker ps -a
查看到。
首先使用 docker stop shiyanlou
命令停止名稱為shiyanlou的容器:
使用docker ps -a
查看容器狀態:
啟動容器 docker start
啟動停止狀態的容器。再次啟動名稱為shiyanlou的容器:
重啟容器 docker restart
可以將運行狀態的容器終止,然后重新啟動。
殺死容器 docker kill
跟進程相同,有的時候正常的終止操作不起作用時,我們需要使用 kill
命令殺死進程,在docker kill
可以處理異常的運行狀態的容器,強制退出:
暫停和恢復容器 docker pause/unpause
類似Windows操作系統的睡眠,我們可以先臨時將容器的運行掛起,不再使用CPU資源,當需要的時候再恢復成正常的運行狀態。
先啟動shiyanlou容器,再執行pause
操作:
恢復shiyanlou容器:
刪除容器 docker rm
當一個容器不再需要時,我們可以刪除這個容器。對於停止的容器直接執行docker rm 容器ID
,對於運行狀態的容器也可以執行docker rm -f 容器ID強制刪除
。
五、實驗五:導出和導入容器
導出和導入容器操作可以將容器導出到壓縮包,並可將壓縮包導入到Docker系統中成為鏡像,為容器的遷移和鏡像的制作提供支持。
1、容器導出 docker export
導出容器快照到本地的tar包。導出后的文件可以拷貝到其他 Docker 服務器上執行導入命令形成新的鏡像,我們在實驗樓的環境中進行測試。
實驗過程:
- 查看當前環境中的容器,選擇需要導出的容器
- 查看該容器修改的內容
- 導出容器到tar包,保存到
/home/shiyanlou
目錄 - 查看導出的tar包
需要注意的是,當容器導出后,容器仍然在Docker環境中運行,只是拷貝了一份內容到tar包。
2、容器導入 docker import
我們執行導入命令,將該文件加載到docker系統中,文件加載后會成為鏡像,命令執行時需要制定導入后生成的鏡像的名字:
cat shiyanlou.tar | docker import - shiyanlou:1.0
執行導入后,使用docker images
查看是否有新的鏡像產生:
docker import 命令比較靈活,也可以直接從URL鏈接進行導入。所以可以記住這是一種創建鏡像的方式,將容器導出后拷貝到目標服務器然后導入成鏡像。
使用新鏡像創建容器,查看是否與導出的容器內容一致:
六、 總結
- 創建第一個容器
- 查看容器信息
- 容器創建
- 管理容器運行狀態
- 容器導出及導入
請務必保證自己能夠動手完成整個實驗,只看文字很簡單,真正操作的時候會遇到各種各樣的問題,解決問題的過程才是收獲的過程。