小說網(wǎng)站開發(fā)思路鄭州網(wǎng)絡(luò)推廣公司
本章主要介紹使用 podman 管理容器。
- 了解什么是容器,容器和鏡像的關(guān)系
- 安裝和配置podman
- 拉取和刪除鏡像
- 給鏡像打標簽
- 導出和導入鏡像
- 創(chuàng)建和刪除鏡像
- 數(shù)據(jù)卷的使用
- 管理容器的命令
- 使用普通用戶管理容器
使用普通用戶管理容器
對于初學者來說,不太容易理解什么是容器,這里舉一個例子。想象一下,我們把系統(tǒng)安裝在一個U盤中,此系統(tǒng)中安裝好了MySQL。
然后我們把這個U盤插人一臺正在運行的物理機上,這個物理機上并沒有安裝MySQL,如圖27-1所示。
然后把U盤中的mysqld進程“曳”到物理機上運行。但是這個mysqld進程只能適應(yīng)U盤中的系統(tǒng),不一定能適應(yīng)物理機上的系統(tǒng)。所
以,我們找一個類似氣球的東西把 mysqld進程在物理機中包裹保護起來,這個mysqld進程依然適應(yīng)U盤中的生態(tài)環(huán)境(系統(tǒng)),卻可以從
物理機上吸收CPU和內(nèi)存作為維持mysqld進程運行的“養(yǎng)分”。
那么,這個類似氣球的東西就是容器,U盤就是鏡像。
在Linux中安裝軟件包時經(jīng)常會遇到各種包依賴,或者有人不會在 Linux系統(tǒng)(如Ubuntu、CentOS)中安裝軟件包。這樣以后我們就不
需要安裝和配置MySQL了,直接把這個“U盤”插到電腦上,然后運行一個容器出來,這樣就有MySQL這個服務(wù)了。
所謂鏡像,就是安裝了系統(tǒng)的硬盤文件,這個系統(tǒng)中安裝了想要運行的程序,如 MySQL.Nginx,并規(guī)定好使用這個鏡像所生成的容器
里面運行什么進程。這里假設(shè)有一個安裝了MySQL的鏡像,如圖27-2所示。

在服務(wù)器上有一個MySQL 的鏡像(已經(jīng)安裝好了MySQL),然后使用這個鏡像生成一個容器。這個容器中只運行一個mysqld進程,容器
中的mysqld進程直接從物理機上吸收CPU和內(nèi)存以維持它的正常運行。
以后需要什么應(yīng)用,就直接拉取什么鏡像下來,然后使用這個鏡像生成容器。例如,需要對外提供
MySQL服務(wù),那么就拉取一個MySQL鏡像,然后生成一個MySQL容器。如果需要對外提供 Web服
務(wù),那么就拉取一個Nginx鏡像,然后生成一個Nginx容器。

一個鏡像是可以生成很多個容器的,如圖27-3所示。
27.1 安裝及配置podman
前面已經(jīng)配置了yum源,所以這里直接使用yum install podman -y命令安裝,命令如下。
[root@pp ~]# yum -y install podman
查看現(xiàn)在系統(tǒng)中有多少鏡像,命令如下。
[root@pp ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@pp ~]#
查看系統(tǒng)中有多少容器,命令如下。
[root@pp ~]# podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@pp ~]#
沒有任何輸出,說明當前沒有容器。 如果要拉取鏡像,一般是從國外網(wǎng)站的鏡像倉庫中拉取,速度會很慢。默認podman從以下倉庫中拉取鏡
像:registry.access.redhat.com、registry.redhat.io、docker.io。下面配置加速器,提高從docker.io中拉取鏡像的速度。
登錄阿里云控制臺,找到容器鏡像服務(wù),單擊鏡像工具→鏡像加速器,找到自己的加速器地址,這里使用的是
https://frz7i079.mirror.aliyuncs.com.
修改 podman 的配置文件/etc/containers/registries.conf,修改內(nèi)容
[root@pp ~]# cat /etc/containers/registries.conf
unqualified-search-registries = ["docker.io"]
[[registry]]
prefix = "docker.io"
location = "frz7i079.mirror.aliyuncs.com"
這里的意思是從 docker.io中拉取鏡像時使用加速器frz7i079.mirror.aliyuncs.com,注意這里不需要加https,配置好之后不需要重啟什
么服務(wù)。
下面開始拉取docker.io/nginx鏡像,命令如下。
[root@pp ~]# podman pull docker.io/nginx
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
Copying blob 186b1aaa4aa6 done
Copying blob b4df32aa5a72 done
Copying blob a0bcbecc962e done
Copying blob 589b7251471a done
Copying blob a9edb18cadd1 done
Copying blob a2abf6c4d29d done
Copying config 605c77e624 done
Writing manifest to image destination
Storing signatures
605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85
拉取MySQL鏡像docker.io/mysql,命令如下。
[root@pp ~]# podman pull mysql
Resolving "mysql" using unqualified-search registries (/etc/containers/registries.conf)
Trying to pull docker.io/library/mysql:latest...
Getting image source signatures
Copying blob 93619dbc5b36 done
Copying blob 37d5d7efb64e done
Copying blob 99da31dd6142 done
Copying blob ac563158d721 done
Copying blob 72a69066d2fe done
Copying blob 626033c43d70 done
Copying blob 688ba7d5c01a done
Copying blob d2ba16033dad done
Copying blob 4d7cfa90e6ea done
Copying blob 00e060b6d11d done
Copying blob 1c04857f594f done
Copying blob e0431212d27d done
Copying config 3218b38490 done
Writing manifest to image destination
Storing signatures
3218b38490cec8d31976a40b92e09d61377359eab878db49f025e5d464367f3b
[root@pp ~]#
網(wǎng)易倉庫地址是https://c.163yun.com/hub#/home,在瀏覽器中打開此界面需要登錄,然后搜索需要的鏡像即可。下面從網(wǎng)易倉庫中
拉取 CentOS鏡像,命令如下。
[root@pp ~]# podman pull hub.c.163.com/library/centos
Trying to pull hub.c.163.com/library/centos:latest...
Getting image source signatures
Copying blob a3ed95caeb02 done
Copying blob a3ed95caeb02 done
Copying blob 2409c3878ba1 done
Writing manifest to image destination
Storing signatures
328edcd84f1bbf868bc88e4ae37afe421ef19be71890f59b4b2d8ba48414b84d
27.2 鏡像管理
前面講了要想創(chuàng)建容器必須有鏡像,本節(jié)主要講解鏡像的管理。
27.2.1鏡像的命名
一般情況下,鏡像的命名格式如下。
1 服務(wù)器IP: 端口 /分類 /鏡像名 :tag
如果不指定端口則默認為80,如果不指定 tag則默認為latest。
例如,192.168.248.45:5000/cka/centos:v2。 再如,hub.c.163.com/library/mysql:latest。
分類也是可以不寫的,如docker.io/nginx:latest。
在把鏡像上傳(push)到倉庫時,鏡像必須按這種格式命名,因為倉庫地址就是由鏡像前面的IP決定的。如果只是在本機使用鏡像,命名
可以隨意。
查看當前系統(tǒng)有多少鏡像,命令如下。
[root@pp ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/nginx latest 605c77e624dd 23 months ago 146 MB
docker.io/library/mysql latest 3218b38490ce 24 months ago 521 MB
hub.c.163.com/library/centos latest 328edcd84f1b 6 years ago 200 MB
[root@pp ~]#
27.2.2 對鏡像重新做標簽
如果想給本地已經(jīng)存在的鏡像起一個新的名稱,可以用tag來做,語法如下。
1 podman tag 舊的鏡像名 新的鏡像名
tag之后,新的鏡像名和舊的鏡像名是同時存在的。
步驟①:給鏡像做新標簽,命令如下。
[root@pp ~]# podman tag docker.io/library/mysql 192.168.248.45/rhce/mysql:v2
這里是為docker.io/library/mysq1重新做個tag,名稱為192.168.26.101/rhce/mysql,標簽為2,這樣命名的目的是讓大家看到命名的
隨意性,建議tag 可以設(shè)置為版本號、日期等有意義的字符。
步驟②:再次查看鏡像,命令如下。
[root@pp ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/nginx latest 605c77e624dd 23 months ago 146 MB
docker.io/library/mysql latest 3218b38490ce 24 months ago 521 MB
192.168.248.45/rhce/mysql v2 3218b38490ce 24 months ago 521 MB
hub.c.163.com/library/centos latest 328edcd84f1b 6 years ago 200 MB
[root@pp ~]#
可以看到,b05128b000dd對應(yīng)的本地文件依然是存在的,因為它(ID為b05128b000dd)有兩個名稱,現(xiàn)在只是刪除了一個名稱而已,所
以在硬盤上仍然是存在的。
只有刪除最后一個名稱,本地文件才會被刪除。
[root@pp ~]# podman rmi 192.168.248.45/rhce/mysql:v2
Untagged: 192.168.248.45/rhce/mysql:v2
[root@pp ~]
27.2.4 查看鏡像的層結(jié)構(gòu)
雖然我們所用的鏡像都是從網(wǎng)上下載下來的,但這些鏡像在制作過程中都是一點點修改、一步步做出來的。如果我們要看某鏡像的這些
步驟,可以用podman history命令,語法如下。
1 podman history鏡像名
27.2.5 導出和導入鏡像
一些服務(wù)器是無法連接到互聯(lián)網(wǎng)的,所以無法從互聯(lián)網(wǎng)上下載鏡像。在還沒有私有倉庫的情況下,如何把現(xiàn)有的鏡像傳輸?shù)狡渌麢C器上
呢?這里就需要把本地已經(jīng)pull下來的鏡像導出為一個本地文件,這樣就可以很容易地傳輸?shù)狡渌麢C器。導出鏡像的語法如下
1 podman save 鏡像名 > file.tar
步驟①:把 docker.io/nginx:latest 導出為nginx.tar,命令如下
[root@pp ~]# podman save docker.io/library/nginx > nginx.tar
[root@pp ~]#
刪除 Nginx這個鏡像,命令如下
[root@pp ~]# podman rmi docker.io/library/nginx
Untagged: docker.io/library/nginx:latest
Deleted: 605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85
[root@pp ~]#
既然上面已經(jīng)把鏡像導出為一個文件了,那么需要把這個文件導入,語法如下。
[root@pp ~]# podman load -i nginx.tar
Getting image source signatures
Copying blob d874fd2bc83b done
Copying blob e379e8aedd4d done
Copying blob 2edcec3590a4 done
Copying blob f1db227348d0 done
Copying blob b8d6e692a25e done
Copying blob 32ce5f6a5106 done
Copying config 605c77e624 done
Writing manifest to image destination
Storing signatures
Loaded image(s): docker.io/library/nginx:latest
27.3.1 創(chuàng)建一個簡單的容器
運行一個最簡單的容器,命令如下。
[root@pp ~]# podman run hub.c.163.com/library/centos
[root@pp ~]# podman ps
\CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@pp ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5aa772f744c3 hub.c.163.com/library/centos:latest /bin/bash 14 seconds ago Exited (0) 14 seconds ago sleepy_kare
[root@pp ~]#
可以看到,創(chuàng)建了一個容器,容器ID為455391081738,容器名是隨機產(chǎn)生的,名稱為kind_elgamal,所使用的鏡像是
hub.c.163.com/library/centos,容器中運行的進程為/bin/bash(也就是鏡像中的CMD指定的)。
podman ps看不到,podman ps -a能看到,且狀態(tài)為Exited,說明容器是關(guān)閉狀態(tài)。容器運行的一瞬間就關(guān)閉了,為什么?
27.3.2 容器的生命期
把容器理解為人的肉體,里面運行的進程理解為人的靈魂。如果人的靈魂宕機了,肉體也就宕機了,只有靈
魂正常運行,肉體才能正常運行
同理,只有容器中的進程正常運行,容器才能正常運行,容器中的進程宕機了,容器也就宕機了。因為沒有終
端的存在,/bin/bash就像執(zhí)行l(wèi)s命令一樣一下就執(zhí)行完了,所以容器生命期也就到期了。
如果把這個bash附著到一個終端上,這個終端一直存在,bash就一直存在,那么是不是容器就能一直存活了
呢?
刪除容器的語法如下
1 podman rm 容器ID/容器名
如果刪除正在運行的容器,可以使用-f選項。
1 podman rm ‐f 容器ID/容器名
步驟①:刪除剛才的容器,命令如下。
[root@pp ~]# podman rm 5aa772f744c3
5aa772f744c31875f10e83d1f5ffab7f69e4064ac5102596d4a88d1bdbbe3895
[root@pp ~]#
重新創(chuàng)建新的容器,加上-i -t選項,可以寫作-it或-i-t。
(1)-t:模擬一個終端。
(2)-i:可以讓用戶進行交互,否則用戶看到一個提示符之后就卡住不動了。
步驟②:創(chuàng)建一個容器,命令如下。
[root@pp ~]# podman run -it hub.c.163.com/library/centos
[root@fe4465083ddb /]# exit
exit
[root@pp ~]#
創(chuàng)建好容器之后就自動進入容器中了,可以通過exit退出容器,命令如下。
[root@pp ~]# podman ps ‐q #‐q選項可以只顯示容器ID,不會顯示太多信息
[root@pp ~]# podman ps -a -q
fe4465083ddb
[root@pp ~]#
但是一旦退出容器,容器就不再運行了。
如果希望創(chuàng)建好容器之后不自動進入容器中,可以加上-d選項。
27.3.3 創(chuàng)建臨時容器
如果要臨時創(chuàng)建一個測試容器,又怕用完忘記刪除它,可以加上--rm選項。
創(chuàng)建臨時容器,命令如下。
[root@pp ~]# podman run -it --name=c1 --rm hub.c.163.com/library/centos
[root@10386f6b4e99 /]# exit
exit
[root@pp ~]#
此容器被自動刪除了,注意--rm和--restart=always選項不可以同時使用。
27.3.4 指定容器中運行的命令
創(chuàng)建容器時,容器中運行的是什么進程,都是由鏡像中的CMD指定的。如果想自定義容器中運行的進程,可以在創(chuàng)建容器的命令最后指
定,如下所示。
[root@pp ~]# podman run -it --name=c1 --rm hub.c.163.com/library/centos sh
sh-4.2# exit
exit
[root@pp ~]#
這里就是以sh的方式運行,而不是以 bash的方式運行。
27.3.5 創(chuàng)建容器時使用變量
在利用一些鏡像創(chuàng)建容器時需要傳遞變量,例如,使用MySQL 的鏡像、WordPress的鏡像創(chuàng)建容器時都需要通過變量來指定一些必備
的信息。需要變量用-e選項來指定,可以多次使用-e選項來指定多個變量。
創(chuàng)建一個名稱為c1的容器,里面?zhèn)鬟f兩個變量,命令如下。
[root@pp ~]# podman run -it --name=c1 --rm -e aa=123 -e bb=456 hub.c.163.com/library/centos
[root@8490fc4960c7 /]# echo $aa
123
[root@8490fc4960c7 /]# echo $bb
456
[root@8490fc4960c7 /]# exit
exit
[root@pp ~]#
在創(chuàng)建容器時,通過-e選項指定了兩個變量aa和 bb,然后進入容器之后可以看到具有這兩個變量。
27.3.6 把容器的端口映射到物理機上
外部主機(本機之外的其他主機)是不能和容器進行通信的,如果希望外部主機能訪問到容器的內(nèi)容,就
需要使用-p選項將容器的端口映射到物理機上,以后訪問物理機對應(yīng)的端口就可以訪問到容器了,如圖
27-5所示。
語法如下。
-p N:物理機隨機生成一個端口映射到容器的端口N上。? ??

-p M:N:把容器的端口N映射到物理機指定的端口M上。
步驟①:創(chuàng)建一個名稱為web的容器,把容器的端口80映射到物理機的一個隨機端口上,命令如
下。
[root@pp ~]# podman run -d --name=web --restart=always -p 80 docker.io/library/nginx
90813bcc5819e67e527d8abb715f083f2aa488a7aca853d288e29c985295c671
[root@pp ~]#
這里把 web容器的端口80映射到物理機的隨機端口上,這個端口號可以通過如下命令來查詢。
[root@pp ~]# podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
90813bcc5819 docker.io/library/nginx:latest nginx -g daemon o... 37 seconds ago Up 37 seconds ago 0.0.0.0:46327->80/tcp web
[root@pp ~]#
可以看到,映射到物理機的46327上了,訪問物理機的端口46327即可訪問到web容器,結(jié)果如圖。

刪除此容器,命令如下。
[root@pp ~]# podman rm -f web
90813bcc5819e67e527d8abb715f083f2aa488a7aca853d288e29c985295c671
27.5 管理容器的命令
容器如同一臺沒有顯示器的電腦,如何查看容器中的內(nèi)容呢,又如何在容器中執(zhí)行命令呢?可以使用
podman exec命令來實現(xiàn),如圖27-8所示。


27.5.1 在容器中執(zhí)行指定的命令
語法如下
1 podman exec 容器名 命令
注意
有的鏡像中不存在bash,可以使用sh替代。
27.5.2 物理機和容器互相拷貝文件
有時我們需要讓物理機和容器之間互相拷貝一些文件,拷貝文件的語法如下。
1 podman cp /path/file 容器:/path2 把物理機中的/path/f1e拷貝到容器的/path2中
2 podman cp 容器:/path2/file /path/ 把容器中的/path2/l1e拷貝到物理機的/path2中
27.5.3 關(guān)閉、啟動、重啟容器
一般情況下,在操作系統(tǒng)中重啟某個服務(wù),可以通過“systemctl restart服務(wù)名”來重啟,容器中一般是無法使用systemctl命令的。如果
要重啟容器中的程序,直接重啟容器就可以了。下面演示如何關(guān)閉、啟動、重啟容器。
步驟①:關(guān)閉、啟動、重啟容器
27.5.4 查看容器中的輸出
當容器無法正常運行時,需要查看容器中的輸出來進行排錯。如果要查看容器中的日志信息,可以通過如下命令來查看。
1 podman logs 容器名
如果想不間斷地查看輸出,可以使用如下命令。
1 podman logs ‐f 容器名
27.5.5 數(shù)據(jù)卷的使用
當容器創(chuàng)建出來之后,會映射到物理機的某個目錄(這個目錄叫作容器層)中,在容器中寫的數(shù)據(jù)實
際都存儲在容器層,所以只要容器不被刪除,在容器中寫的數(shù)據(jù)就會一直存在。但是一旦刪除容器,對
應(yīng)的容器層也會被刪除。
如果希望數(shù)據(jù)能永久保存,則需要配置數(shù)據(jù)卷,把容器中的指定目錄掛載到物理機的某目錄上
這里把容器中的目錄aa掛載到物理機的目錄bb上,當往容器目錄aa中寫數(shù)據(jù)時,實際上是往物理
機的目錄bb中寫的。這樣即使刪除了容器,物理機目錄bb中的數(shù)據(jù)仍然是存在的,就實現(xiàn)了數(shù)據(jù)的永
久保留(除非手動刪除)。
在創(chuàng)建容器時,用-v選項指定數(shù)據(jù)卷,用法如下。
1 ‐v /dirl 把物理機的一個隨機目錄映射到容器的/dir1目錄中
2 ‐v /dir2:/dirl:Z 把物理機的指定目錄/dir2映射到容器的/dir1目錄中
記住,冒號左邊的/dir2是物理機的目錄,此目錄需要提前創(chuàng)建出來;冒號右邊的/dir1是容器中的目錄,如果此目錄不存在則會自動創(chuàng)
建。這里大寫Z的意思是把物理機的目錄/dir2的上下文改成container_file_t。
步驟①:創(chuàng)建一個名稱為c1的容器,把物理機的一個隨機目錄映射到容器的/data目錄中,命令如下。
[root@pp ~]# podman run -dit --name=c1 --restart=always -v /data/ hub.c.163.com/library/centos
47a66e083be7982719257a535f580b955c989c7531ee4d5ef19c138821959d84
[root@pp ~]#
在此命令中,v后面只指定了一個目錄/data,指的是在容器中創(chuàng)建/data,掛載到物理機的一個隨機目錄上。
步驟②:查看對應(yīng)物理機是哪個目錄,命令如下。
[root@pp ~]# podman inspect c1 | grep -A5 Mounts"Mounts": [{"Type": "volume","Name": "cff4773d81248cef9997322c9de263f1ec680966735345305216b30642b690a7","Source": "/var/lib/containers/storage/volumes/cff4773d81248cef9997322c9de263f1ec680966735345305216b30642b690a7/_data","Destination": "/data",
[root@pp ~]#
上面有兩個參數(shù),其中 Destination指的是容器中的目錄, Source指的是物理機對應(yīng)的目錄。得到的結(jié)論就是容器中的目錄/data對應(yīng)物
理機
先查看c1容器的目錄/data中的數(shù)據(jù)和物理機對應(yīng)目錄的數(shù)據(jù),命令如下。
[root@pp ~]# podman exec c1 ls /data/
[root@pp ~]# ls /var/lib/containers/storage/volumes/cff4773d81248cef9997322c9de263f1ec680966735345305216b30642b690a7/_data/
[root@pp ~]#
可以看到,目錄是空的,如下所示。
[root@pp ~]# podman cp /etc/hosts c1:/data/
[root@pp ~]# podman exec c1 ls /data/
hosts
[root@pp ~]# ls /var/lib/containers/storage/volumes/cff4773d81248cef9997322c9de263f1ec680966735345305216b30642b690a7/_data/
hosts
[root@pp ~]#
如果想在物理機中也指定目錄而非隨機掛載目錄,則使用-v /xx:/data,此處冒號左邊是物理機的目錄,冒號右邊是容器中的目錄,這里
要提前在物理機上把目錄/xx創(chuàng)建出來。
步驟④:創(chuàng)建一個名稱為c1的容器,把物理機的目錄/xx映射到容器的/data目錄中,命令如下。
[root@pp ~]# mkdir /xx
[root@pp ~]# podman run -dit --name=c1 --restart=always -v /xx:/data/:z hub.c.163.com/library/centos7ecb9da861817aded61a29cf6aa2ab9a9d11005a213bf204335ac38416cc2ceb
[root@pp ~]#
這里大寫Z的意思是把物理機的目錄/xx的上下文改成container_file_t。查看/xx的上下文,命令如下。
[root@pp ~]# ls -dZ /xx
system_u:object_r:container_file_t:s0 /xx
[root@pp ~]#
查看此容器的屬性,命令如下。
[root@pp ~]# podman inspect c1 | grep -A5 Mounts"Mounts": [{"Type": "bind","Source": "/xx","Destination": "/data","Driver": "",
[root@pp ~]#
步驟⑤:拷貝一些測試文件過去并觀察一下,命令如下。
[root@pp ~]# podman exec c1 ls /data/
[root@pp ~]# ls /xx/
[root@pp ~]# podman cp /etc/hosts c1:/data/
[root@pp ~]# podman exec c1 ls /data/
hosts
[root@pp ~]# ls /xx/
hosts
[root@pp ~]#
步驟⑥:刪除此容器,命令如下。
[root@pp ~]# podman rm -f c1
7ecb9da861817aded61a29cf6aa2ab9a9d11005a213bf204335ac38416cc2ceb
[root@pp ~]#
在重啟系統(tǒng)后,所創(chuàng)建的容器并不會隨著系統(tǒng)自動運行,可把容器創(chuàng)建為一個服務(wù),然后設(shè)置這個服務(wù)開機自動啟動,那么這個容器也
就可以實現(xiàn)開機自動啟動了。
下面使用iu用戶創(chuàng)建一個容器,然后實現(xiàn)開機自動啟動。
27.6 使用普通用戶對容器進行管理
使用iu用戶通過ssh登錄到server,切記這里不能通過其他用戶用su命令切換到iu用戶。
不同用戶對鏡像和容器的管理都是獨立的,所以root拉取的鏡像并不能給lduan用戶使用。
[iu@pp ~]$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
[iu@pp ~]$
可以看到,使用iu用戶查詢時是沒有任何鏡像的,所以先拉取Nginx鏡像,命令如下。
[iu@pp ~]$ podman pull docker.io/library/nginx
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
Copying blob 186b1aaa4aa6 done
Copying blob a0bcbecc962e done
Copying blob 589b7251471a done
Copying blob b4df32aa5a72 done
Copying blob a2abf6c4d29d done
Copying blob a9edb18cadd1 done
Copying config 605c77e624 done
Writing manifest to image destination
Storing signatures
605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85
為了使用數(shù)據(jù)卷,先使用root用戶創(chuàng)建一個目錄/yy并把所有者和所屬組改為iu,命令如下。
[root@pp ~]# mkdir /yy
[root@pp ~]# chown iu.iu /yy/
[root@pp ~]#
然后使用iu用戶創(chuàng)建一個名稱為web的容器,把物理機的目錄/yy映射到容器的/data目錄中,命令如下。
[iu@pp ~]$ podman run -dit --name=web --restart=always -v /yy:/data/:Z docker.io/library/nginx
78aab24e798696415f31617adb43edfb6a06214bafb0c4cccbfefe90c1eb06ff
[iu@pp ~]$
現(xiàn)在容器創(chuàng)建好了,但是這個容器在系統(tǒng)重啟時并不會隨著系統(tǒng)一起啟動,所以下面設(shè)置允許開機自動運行容器。要讓容器跟著系統(tǒng)一
起啟動,需要為這個容器創(chuàng)建一個服務(wù)。
首先設(shè)置blab用戶創(chuàng)建的服務(wù)在系統(tǒng)啟動時能自動啟動,命令如下。
[iu@pp ~]$ loginctl enable-linger iu
[iu@pp ~]$
如果這里沒有開啟,或者通過loginctl disable-linger iu關(guān)閉了,那么系統(tǒng)啟動之后iu用戶創(chuàng)建的服務(wù)是不會自動啟動的,只有
iu用戶通過ssh或控制臺登錄之后,服務(wù)才會啟動起來。
這里設(shè)置了logincd enable-linger iu,當系統(tǒng)啟動之后,iu用戶即使沒有通過ssh或控制臺登錄,iu用戶創(chuàng)建的服務(wù)也會自動啟
動。是開啟還是關(guān)閉可以通過loginctl show-user iu?| grep Linger來查看。
因為要為容器創(chuàng)建出來一個服務(wù),所以先創(chuàng)建存儲服務(wù)文件的目錄,命令如下。
[iu@pp ~]$ mkdir -p ~/.config/systemd/user ; cd ~/.config/systemd/user
[iu@pp user]$ ls
[iu@pp user]$
為web容器生成一個服務(wù)文件,命令如下。
[iu@pp user]$ podman generate systemd --name web --files --new
/home/iu/.config/systemd/user/container-web.service
[iu@pp user]$
這里--new的意思是,即使現(xiàn)在把web容器刪除,那么重啟系統(tǒng)時也會自動創(chuàng)建這個容器。
其中--name可以簡寫為-n,--files可以簡寫為-f,--new可以省略,所以整個命令可以簡寫如下。
1 podman generate systemd ‐n web ‐f
重新加載這個服務(wù)文件,這里要加上--user選項,命令如下。
[iu@pp user]$ systemctl --user daemon-reload
[iu@pp user]$
設(shè)置這個服務(wù)開機自動啟動,命令如下。
[iu@pp user]$ systemctl --user enable container-web.service
Created symlink /home/iu/.config/systemd/user/multi-user.target.wants/container-web.service → /home/iu/.config/systemd/user/container-web.service.
Unit /home/iu/.config/systemd/user/container-web.service is added as a dependency to a non-existent unit multi-user.target.
Created symlink /home/iu/.config/systemd/user/default.target.wants/container-web.service → /home/iu/.config/systemd/user/container-web.service.
[iu@pp user]$ ls
container-web.service default.target.wants multi-user.target.wants
[iu@pp user]$
然后重啟操作系統(tǒng)進行驗證,命令如下。
[iu@pp ~]$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
78aab24e7986 docker.io/library/nginx:latest nginx -g daemon o... 15 minutes ago Up 15 minutes ago web
[iu@pp ~]$
等系統(tǒng)啟動之后發(fā)現(xiàn) web容器跟著系統(tǒng)啟動起來了。