- CKA/CKAD應試教程:從Docker到Kubernetes完全攻略
- 段超飛編著
- 2224字
- 2025-03-17 18:51:27
1.5 容器的管理
【必知必會】創建及刪除容器,了解容器的生命周期。
容器就是鏡像在物理機上運行的一個實例,可以把容器理解為一個氣球,氣球里運行了一個進程,這個進程透過氣球吸收物理機的內存和CPU資源。
查看當前有多少個正在運行的容器。

這個命令顯示的僅僅是正在運行的容器,如果要查看所有的(正在運行的和沒有運行的)容器,則使用docker ps -a命令,這里需要加上-a選項表示所有的。
在nerdctl里查看容器,如果要查看所有的容器,則使用nerdctl ps -a命令。

1.5.1 創建容器
運行一個最簡單的容器。

以上命令在vms101上同樣可以執行,只需把Docker命令換成nerdctl即可。
可以看到,已經創建出了一個容器,容器的ID為bfa8fa89f288,容器名是隨機產生的名稱,為confident_curie,所使用的鏡像是hub.c.163.com/library/centos,容器里運行的進程為/bin/bash(也就是鏡像里CMD指定的)。
docker ps看不到,docker ps -a能看到,且狀態為Exited,說明容器是關閉狀態。容器運行的一瞬間就關閉了,為什么?下面來了解一下容器的生命周期問題。
1.5.2 容器的生命周期
我們把容器理解為人的肉體,里面運行的進程理解為人的靈魂。如果人的靈魂宕機了,則肉體也就宕掉了,只有靈魂正常運行,肉體才能正常運行,如圖1-14所示。

圖1-14 容器和進程之間的關系
同理,只有容器里的進程正常運行,容器才能正常運行,容器里的進程掛掉了,則容器也就掛掉了。因為沒有終端的存在,/bin/bash就像執行ls命令一樣一下就執行完了,所以容器的生命周期也就結束了。
如果把這個bash附著到一個終端上,這個終端一直存在,則bash就一直存在,那么是不是容器就能一直存活了呢?
刪除容器的語法如下。

如果刪除正在運行的容器,可以使用-f選項。

刪除剛才的容器。

重新創建容器,加上-i -t選項,可以寫作-it或-i -t。
(1)-t:模擬一個終端。
(2)-i:可以讓用戶進行交互,否則用戶看到一個提示符之后就卡住不動了。
第1步 創建一個容器。

創建出容器之后會自動進入容器里,可以通過exit退出容器。

但是,一旦通過exit退出容器,容器就不再運行了。
第2步 刪除此容器。

上述命令在vms101上用nerdctl執行,只要把關鍵字docker換成nerdctl即可。
如果希望創建好容器之后不自動進入容器里,可以加上-d選項。
第3步 再次創建一個容器。

因為加了-d選項,所以創建好容器之后并沒有自動進入容器里。
注意
在nerdctl里-d和-i不能同時使用,否則會報錯,寫成如下形式即可。
上面的命令里,容器的ID是4aa86357a3df,進入容器里。

可以看到,只要退出來,容器就會自動關閉。
第4步 刪除此容器。

在運行容器時加上--restart=always選項,可以解決退出容器自動關閉的問題。
第5步 創建容器,增加--restart=always選項。

進入容器里并退出。

可以看到,容器依然是存活的。
第6步 刪除此容器。

因為容器是活躍的,所以無法直接刪除,需要加上-f選項。

每次刪除容器時都使用容器ID的方式比較麻煩,在創建容器時可以使用--name指定容器名。
第7步 創建容器,使用--name指定容器的名稱。

這樣容器的名稱為c1,以后管理起來比較方便,比如切換到容器,然后退出。

第8步 刪除此容器。

1.5.3 創建臨時容器
如果要臨時創建一個測試容器,又怕用完忘記刪除它,可以加上--rm選項。
創建臨時容器。

在創建容器時加了--rm選項,退出容器之后,容器會被自動刪除。

可以看到,此容器被自動刪除了,注意--rm和--restart=always不可以同時使用。
上述命令在vms101上用nerdctl執行,只要把關鍵字docker換成nerdctl即可。
1.5.4 指定容器里運行的命令
前面在創建容器時,容器里運行的進程是由鏡像里的CMD定義好的,關于如何構建鏡像,后面有專門章節詳細講解。如果想自定義容器里運行的進程,可以在創建容器的命令最后面指定,比如:


這里就是以sh方式運行,而不是以bash方式運行的。
在容器里運行sleep 10。

容器里運行的命令是sleep 10,10秒之后命令結束,則容器也會關閉,此時容器的生命周期也就是10秒。
注意
此時容器里運行的是sleep 10,不是bash或sh,所以如果執行docker attach c1命令會卡住,因為想要看到提示符,必須保證bash或sh運行才行,而此時在容器里根本沒有bash或sh運行。
上述命令在vms101上用nerdctl執行,只要把關鍵字docker換成nerdctl即可。
1.5.5 創建容器時使用變量
在使用一些鏡像創建容器時需要傳遞變量,比如在使用MySQL鏡像、WordPress鏡像創建容器時,都需要通過變量來指定一些必備的信息。使用-e選項來指定變量,可以多次使用-e選項來指定多個變量。
創建一個容器c1,里面傳遞兩個變量。

在創建容器時,通過-e選項指定了兩個變量aa和bb,進入容器里可以看到有這兩個變量。
上述命令在vms101上用nerdctl執行,只要把關鍵字docker換成nerdctl即可。
1.5.6 把容器的端口映射到物理機上
外部主機(本機之外的其他主機)是不能和容器進行通信的,如果希望外部主機能訪問到容器的內容,就需要使用-p選項把容器的端口映射到物理機上,以后訪問物理機對應的端口就可以訪問到容器了,如圖1-15所示。

圖1-15 把容器的端口映射到物理機上
語法如下。
(1)-p N:物理機隨機生成一個端口映射到容器的端口N上。
(2)-p M:N:把容器的端口N映射到物理機指定的端口M上。
第1步 創建一個容器,把容器的端口80映射到物理機的一個隨機端口上。

這里把容器web的端口80映射到物理機的隨機端口上,這個端口號可以通過如下命令來查詢。
第2步 查詢容器映射到物理機的端口。

或者通過如下命令來查看。

可以看到,映射到物理機的端口32770上了,訪問物理機的端口32770,即可訪問到web容器,如圖1-16所示。

圖1-16 訪問物理機的端口32770
第3步 刪除此容器。

如果想映射到物理機指定的端口上,請使用如下命令。
第4步 把容器的端口映射到物理機指定的端口上。

此處把容器的端口80映射到物理機的端口88上(可以自行指定端口,比如80),那么訪問物理機的端口88即可訪問到web容器的端口80,如圖1-17所示。

圖1-17 訪問物理機的端口88
第5步 刪除此容器。

上述命令在vms101上用nerdctl執行,只要把關鍵字docker換成nerdctl即可。