官术网_书友最值得收藏!

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即可。

主站蜘蛛池模板: 江孜县| 剑河县| 璧山县| 漳州市| 翼城县| 德安县| 临夏县| 双江| 都安| 南川市| 于田县| 东乌珠穆沁旗| 灵山县| 红安县| 祁门县| 鄂尔多斯市| 长垣县| 砚山县| 来凤县| 蚌埠市| 武清区| 错那县| 祁阳县| 郴州市| 云梦县| 简阳市| 湛江市| 绍兴县| 泊头市| 四川省| 外汇| 凌云县| 嘉善县| 自贡市| 临泽县| 阿尔山市| 商南县| 兴城市| 宜州市| 陇川县| 卓尼县|