容器管理


容器管理

本節內容簡介

 回顧加本節內容

容器是Docker的一個基本概念,每個容器中都運行一個應用並為該應用提供完整的運行環境。本實驗將詳細學習Docker容器的創建,運行管理操作。需要依次完成下面幾項任務:

  1. 創建第一個容器
  2. 查看容器信息
  3. 容器創建
  4. 管理容器運行狀態
  5. 容器導出及導入

一、實驗一:創建第一個容器

還記得上一節實驗中我們如何創建一個持續運行的容器嗎?在這里我們回顧下創建的步驟:

如果我們需要一個保持運行的容器呢,最簡單的方法就是給這個容器一個可以保持的應用,比如bash,運行 ubuntu 容器並進入容器的 bash:

  $ docker run -t -i ubuntu /bin/bash

  

上面命令的說明:

  1. -t:分配一個 pseudo-TTY
  2. -i--interactive參數縮寫,表示交互模式,如果沒有 attach 保持 STDIN 打開狀態
  3. ubuntu:運行的鏡像名稱,默認為latest 標簽
  4. /bin/bash:容器中運行的應用

通過這個簡單的命令,我們現在進入了新創建容器的bash中,在bash里執行的任何命令都不會影響到我們的宿主機,可以隨意操作。你可以看到主機名和環境變量 HOSTNAME 都已經顯示為容器的ID了。

在這個bash下,我們可以進行各種Ubuntu系統上的操作,當然因為Docker本身的限制,有些涉及到磁盤、網絡、設備等Linux特權命令是無法執行的,可以試試reboot命令,會提示你shutdown: Unable to shutdown system

如何退出這個bash呢?有兩種方法,兩種方法的效果完全不同:

  1. 直接 exit,這時候 bash 程序終止,容器進入到停止狀態
  2. 使用組合鍵退出,仍然保持容器運行,我們可以隨時回來到這個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 查看容器中對鏡像做了哪些變化。

實驗過程如下:

  1. 先執行docker diff 查看現有的容器中的變化,發現沒有任何文件變化
  2. 連接到容器內部,Ctrl-C中斷先前實驗的死循環
  3. 再創建幾個文件
  4. 退出到宿主機
  5. 再次使用docker diff命令查看是否有新的修改

輸出的信息中A 表示添加,后面的三個新建文件的路徑。可以嘗試下修改或刪除文件會有怎樣的diff輸出。

7、連接到容器中 - docker attach

docker attach 可以進入到容器操作。當我們容器后台運行時,有需要的話也可以再次連接進入到容器中。

這個命令在上述的實驗中已經多次用到了,不再提供單獨的操作。

三、實驗三:創建容器

創建一個容器的命令是 docker run。還記得先前實驗中學習的Hello, Shiyanlou/bin/bash容器如何創建的嗎?在上一節中我們學習了最基本的容器創建方式,本節內容我們將通過實例來學習更詳細的docker run參數。

docker run命令的執行步驟:

  1. 查找鏡像或下載鏡像
  2. 創建容器
  3. 分配文件系統及虛擬網絡(網橋,接口,IP地址),其中容器中的DNS默認掛載宿主機的/etc/resolve.conf/etc/hosts
  4. 執行應用,默認執行鏡像中指定的CMD參數,也可以在docker run后面跟應用來覆蓋CMD命令。

如果容器中的應用執行完成,則容器進入到終止狀態。

docker run 的參數非常多,本實驗中我們設定要創建的容器配置:

  1. 設置容器名稱 shiyanlou(使用--name,如果不加該參數,Docker會隨機產生一個名字)。
  2. 設置容器的主機名 shiyanlou(使用--hostname參數)
  3. 設定網絡信息,這里只使用一個簡單的參數設置MAC地址(--mac-address參數)
  4. 設置資源限制,設置容器中最大的進程數,包括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 服務器上執行導入命令形成新的鏡像,我們在實驗樓的環境中進行測試。

實驗過程:

  1. 查看當前環境中的容器,選擇需要導出的容器
  2. 查看該容器修改的內容
  3. 導出容器到tar包,保存到/home/shiyanlou目錄
  4. 查看導出的tar包

需要注意的是,當容器導出后,容器仍然在Docker環境中運行,只是拷貝了一份內容到tar包。

2、容器導入 docker import

我們執行導入命令,將該文件加載到docker系統中,文件加載后會成為鏡像,命令執行時需要制定導入后生成的鏡像的名字:

  cat shiyanlou.tar | docker import - shiyanlou:1.0

執行導入后,使用docker images 查看是否有新的鏡像產生:

docker import 命令比較靈活,也可以直接從URL鏈接進行導入。所以可以記住這是一種創建鏡像的方式,將容器導出后拷貝到目標服務器然后導入成鏡像。

使用新鏡像創建容器,查看是否與導出的容器內容一致:

六、 總結

  1. 創建第一個容器
  2. 查看容器信息
  3. 容器創建
  4. 管理容器運行狀態
  5. 容器導出及導入

請務必保證自己能夠動手完成整個實驗,只看文字很簡單,真正操作的時候會遇到各種各樣的問題,解決問題的過程才是收獲的過程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM