一、管理容器存儲和網絡資源
使用容器來運行簡單的進程,然后退出。可以配置容連續運行特定服務,如數據庫服務。如果持續運行服務,需要向容器添加更多的資源,如持久存儲或對其他網絡的訪問權限。
- 針對企業容器平臺上的大型部署:使用復雜的存儲解決方案為容器提供存儲,而無需了解底層架構。
- 針對單個容器主機的小型部署:通過在運行的容器上創建要掛載的目錄,從容器主機創建持久存儲。
當Web服務器或數據庫服務器等容器需要為外部客戶端提供服務時,需要客戶端設置通信通道,以訪問容器的內容。可以通過配置端口映射,以啟用與容器的通信。通過端口映射,將容器主機上的端口球球轉發到容器內的端口。
容器的環境變量
容器鏡像允許在創建時傳遞環境變量以自定義容器。可以使用環境變量為容器設置相關參數,根據自己的環境進行定制,無需創建自己的自定義鏡像。通常不會修改容器鏡像,因為這會在鏡像中添加層,使其更加難以維護。
當一個容器需要在創建時指定變量,直接創建容器時會啟動失敗
查看容器鏡像,可以發現存在一個mariadb-105鏡像
podman search registry.lab.example.com/
直接創建并運行容器,因為該鏡像不在本地,podman會先下載鏡像然后才創建容器
podman run -d --name db01 registry.lab.example.com/
查看容器db01的狀態,可以看到狀態為Exited
podman ps -a
查看容器的日志
podman logs db01
podman container logs db01
- MYSQL_USER:要創建的MySQL賬戶的用戶名
- MYSQL_PASSEORD:用戶賬戶的密碼
- MYSQL_DATABASE:數據庫名稱
- MYSQL_ROOT_PASSWORD:root管理員密碼
先刪除剛剛創建的容器
podman rm -f db01
重新創建容器并傳遞環境變量
podman run -d --name db01 -e MYSQL_USER=user -e MYSQL_PASSWORD=redhat -e MYSQL_DATABASE=db1 -e MYSQL_ROOT_PASSWORD=redhat@123 registry.lab.example.com/rhel8/mariadb-105
二、容器持久存儲
在默認情況下,運行容器時,存儲的所有內容都基于容器的鏡像。容器鏡像的壽命比較短,用戶或應用寫入的所有的新數據都會在移除容器后丟失。如果要持久保存數據,通過將容器中的主機系統內容與–volume(-v)選項搭配使用。在容器中使用此卷類型時,必須考慮文件系統級別的權限。
在Mariadb容器鏡像中,mysql用戶必須擁有/var/lib/mysql目錄,等同于Mariadb數據庫在主機上運行。掛載到容器中的目錄必須具有mysql作為用戶或組所有者。如果以root運行容器,則主機上的UID和GID與容器內的UID和GID匹配。意思是,如果要將主機中的目錄掛載到容器中,盡量保證內外的屬主和屬組一致。在Mariadb數據庫中,數據的存儲目錄為/var/lib/mysql。
1、容器存儲的SELinux上下文
如果要在本機上存儲容器數據, 則必須要給主機文件夾設置安全上下文(container_file_t),然后才能將該目錄作為持久存儲掛載到容器中。如果主機目錄沒有設置安全上下文,則容器無法訪問該目錄。通過在-v選項中附加Z
參數,可以自動設置SELinux上下文。
一共有兩種參數,分別是:Z
和:z
:Z
:選項用于將指定的安全上下文設置為掛載點或文件的值。當使用:Z
時,Podman會更改掛載點或文件的安全上下文,以確保容器可以訪問指定的主機文件系統路徑,并具有正確的SELinux權限。會將文件或目錄安全上下文更改為container_file_t:z
:這個選項用于將當前SELinux安全上下文傳播給容器中的掛載點或文件。當使用:z
時,Podman會將主機上的安全上下文直接傳播到容器中的掛載點或文件,以確保容器內的進程具有與宿主機相同的安全上下文。
使用:Z
實際上是指定了:z
選項的默認值(container_file_t),將默認的SELinux安全上下文應用于掛載點或文件。
在大多數情況下,如果你只是想讓容器能夠訪問主機上的目錄或文件,并且不關心具體的安全上下文,那么使用:Z
是一個簡單而安全的選擇。如果你需要更精細地控制安全上下文,或者需要確保容器內的進程具有與主機具有相同的安全上下文,那么可以使用:z
選項。
2、用戶命名空間的UID映射
podman unshare cat /proc/self/uid_map # 獲取用戶命名空間的UID映射
podman unshare cat /proc/self/gid_map # 獲取用戶命名空間的GID映射
可以看到,容器中的root用戶(UID=GID=0)映射到主機計算機上的用戶為(UID=GID=1000);容器中的UID=GID=1映射到主機計算機上為(UID=GID=100000)。
- UID換算規則:容器的UID+99999
- GID換算規則:容器的GID+99999
3、分配端口映射到容器
要提供對容器的網絡訪問權限,客戶端必須連接到容器主機上的端口,這些端口將網絡流量傳遞到容器中的端口。將容器主機上的網絡端口映射到容器中的端口時,容器將接收發送到主機網絡端口的網絡流量。
4、容器中的網絡配置
Podman4.0中支持兩種容器網絡后端,分別是Netavark和CNI。在RedHat9中,系統默認使用Netavark。
podman info --format {{.Host.NetworkBackend}}
創建容器網絡
podman network create --gateway 192.168.10.254 --subnet 192.168.10.0/24 db_net
- podman network create:創建網絡
- –gateway 192.168.10.254:指定網關
- –subnet 192.168.10.0/24:指定網段
- db_net:網絡名稱
列出容器網絡
podman network ls
查看容器網絡的詳細信息
podman network inspect podman
容器持久化存儲的步驟
- 主機建立目錄
- 給主機目錄設置UID和GID
- 創建虛擬網絡
- 新建容器,指定容器的掛載目錄和映射端口,自動調整主機目錄的SELinux安全上下文
先刪除當前存在的所有容器
podman rm -f -a
先在本機新建存儲目錄
如果想要容器可以訪問主機的目錄,則首先需要容器中的用戶具備對主機目錄的訪問權限
mkdir /home/student/mysql_db
先臨時創建一個Mariadb數據庫容器
podman run -d --name db01 -e MYSQL_USER=user -e MYSQL_PASSWORD=redhat -e MYSQL_DATABASE=db -e MYSQL_ROOT_PASSWORD=redhat@123 registry.lab.example.com/rhel8/mariadb-105
查看容器密碼文件中的mysql用戶的UID和GID,得出UID和GID都為27
podman exec -it db01 grep mysql /etc/passwd
查看容器中Mariadb服務的監聽端口號
podman exec -it db01 ss -tlnp
給主機目錄設置屬組和屬主
podman unshare chown 27:27 /home/student/mysql_db
創建Mariadb容器的參考語句可以借鑒容器介紹中的usage字段
skopeo inspect docker://registry.lab.example.com/rhel8/mariadb-105 | grep usage
新建容器,指定容器的掛載目錄和映射端口,自動調整主機目錄的SELinux安全上下文
podman run -d --name db02 -e MYSQL_USER=user -e MYSQL_PASSWORD=redhat -e MYSQL_DATABASE=db -e MYSQL_ROOT_PASSWORD=redhat@123 -v /home/student/mysql_db:/var/lib/mysql:Z -p 13306:3306 registry.lab.example.com/rhel8/mariadb-105
- -v /home/student/mysql_db:/var/lib/mysql:Z
-v
:掛載目錄/home/student/mysql_db
:主機的目錄/var/lib/mysql
:容器中的目錄:Z
:自動為主機目錄添加安全上下文-p 13306:3306
:將主機的13306端口映射到容器中的3306端口
查看主機掛載目錄的安全上下文
ll -dZ /home/student/mysql_db
查看容器的端口映射關系
podman port -a
調整防火墻規則
sudo firewall-cmd --add-port=13306/tcp --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
使用本地主機測試訪問容器數據庫服務
sudo dnf install mariadb -y # 安裝Mariadb軟件
mysql -u user -predhat -h 127.0.0.1 -P 13306
- mysql:登錄數據庫
- -u user:指定登錄用戶名
- -predhat:指定密碼
- -h localhost:指定登錄主機
- -P 13306:指定登錄端口號
使用異地主機遠程訪問容器數據庫服務
sudo dnf install -y mariadb
mysql -u user -predhat -h 172.25.250.10 -P 13306
三、作為系統服務來管理容器
將容器配置為systemd服務,并將容器服務配置為在系統啟動時自動啟動。如果希望可以無限期運行服務的容器,如Web服務器或數據庫,特權用戶通常將這些服務配置為在系統啟動時運行,使用systemctl命令進行管理。作為普通用戶,可以通過創建systemd單元來配置Rootless容器。通過此配置,可以通過systemctl命令將容器作為常規系統服務進行管理。基于systemd單元管理容器主要用于不需要擴展的基本和小型部署。如果存在的容器過多和服務更加復雜,則可以使用Kubernetes的企業編排平臺。
systemd服務分類
- 普通用戶使用systemctl命令來啟動服務,服務會在打開會話時啟動,在關閉最后一個會話時間停止。
- 系統服務則會在系統啟動時啟動,在系統關閉時停止。
首先需要在用戶家目錄下創建單元文件目錄,然后進入目錄
mkdir -p ~/.config/systemd/user/
cd ~/.config/systemd/user/
使用podman generate systemd生成單元文件
podman generate systemd -n ConName -f
- podman generate systemd:生成單元文件
- -n ConName:容器名
- -f:生成文件
使用普通用戶來生成單元文件,如果用戶從系統注銷,systemd服務會在特定時間后停止容器。因為systemd服務單元是使用.user
選項創建的,在用戶登錄時啟動服務,并在用戶注銷時停止服務。可以通過運行loginctl enable-linger命令來更改此默認行為并強制已啟用的服務在服務器啟動時啟動,并在服務器關閉時停止。
創建一個redhat9容器
podman run -d --name redhat9_con registry.lab.example.com/ubi9-beta/ubi:latest
進入用戶家目錄,創建容器服務
cd ~/.config/systemd/user
podman generate systemd -n redhat9_con -f
更改默認行為,為所配置服務的用戶注銷后服務保留
loginctl enable-linger
loginctl show-user student # 驗證命令是否配置成功
驗證:注銷當前student用戶,再次使用student用戶登陸,可以看到redhat9_con容器狀態依舊是Up(我們沒有將該容器你設置為開機自啟)
四、臨時使用容器
如果只是臨時某個容器,在容器使用完就自動刪除,可以添加–rm選項
創建一個redhat9容器,查看完容器的版本號就刪除容器
podman run --rm registry.lab.example.com/ubi9-beta/ubi cat /etc/redhat-release
五、綜合案例–Mariadb數據庫服務
案例說明
1、登錄podman
登錄podman
podman login -u admin -p redhat321 registry.lab.example.com
驗證:查看podman登錄
podman login --get-login
2、創建容器網絡
創建容器網絡
podman network create --subnet 192.168.10.0/24 --gateway 192.168.10.254 ConNet
驗證:查看容器網絡的詳細信息
podman network inspect ConNet
3、創建Mariadb數據庫容器
主機上創建數據存儲目錄
mkdir /home/student/db_data
podman unshare chown 27:27 /home/student/db_data
驗證:查看主機目錄的權限
ll -d /home/student/db_data
查找創建容器模板
podman inspect registry.lab.example.com/rhel8/mariadb-105 | grep usage
創建數據庫容器
podman run -di --name mariadb_con --network ConNet -e MYSQL_USER=mike -e MYSQL_PASSWORD=redhat -e MYSQL_DATABASE=db1 -p 13307:3306 -v /home/student/db_data:/var/lib/mysql:Z registry.lab.example.com/rhel8/mariadb-105
驗證:-查看數據庫容器狀態
podman ps
驗證:查看容器的網絡信息
podman exec -it mariadb_con ip add show eth0
驗證:查看容器的詳細信息
podman inspect mariadb_con # 查看Netwokrs字段內容
4、創建RedHat9容器
先查看容器鏡像倉庫中的容器鏡像
podman search registry.lab.example.com/
創建RedHat9容器
podman會先下載容器鏡像,然后才會創建容器,這里我們只需要容器具有倉庫文件的讀權限,而不需要有寫權限,所以無需修改SELinux安全上下文。
podman run -di --name redhat9_con --network ConNet -v /etc/yum.repos.d/:/etc/yum.repos.d/ registry.lab.example.com/ubi9-beta/ubi
驗證:查看容器狀態
podman ps
查找相關命令的來源包
dnf provides ping
dnf provides ip
容器安裝相關包
podman exec -it redhat9_con dnf install -y iputils iproute
驗證:查看容器的網絡信息
podman exec -it redhat9_con ip add show eth0
podman exec -it redhat9_con ping 192.168.10.1 -c3
驗證:測試DNS解析
podman exec -it redhat9_con ping mariadb_con -c3
主機上調整防火墻策略
sudo firewall-cmd --add-port=13307/tcp --permanent
sudo firewall-cmd --reload
驗證:查看當前防火墻策略
sudo firewall-cmd --list-ports
5、跨容器服務訪問
先在redhat9_con容器中安裝Mariadb服務
podman exec -it redhat9_con dnf install -y mariadb
在redhat9_con容器中訪問mariadb_con容器中的mariadb服務
podman exec -it redhat9_con /bin/bash # 開啟偽終端
mysql -u mike -predhat -h 192.168.10.1
6、給Mariadb容器添加多一個容器網絡
創建容器網絡
podman network create --subnet 192.168.20.0/24 --gateway 192.168.20.254 ConNet2
驗證:查看容器網絡的詳細信息
podman network inspect ConNet2
為Mariadb容器添加網絡
podman network connect ConNet2 mariadb_con
驗證:查看容器的網絡信息
podman inspect mariadb_con
六、綜合案例–Nginx數據庫服務
案例拓撲
先將本地所有的容器刪除
podman rm -f -a
1、登錄podman
登錄podman
podman login registry.lab.example.com
驗證:查看登錄
podman login --get-login
2、主機準備
創建主機的本地掛載目錄
mkdir -p /home/student/appdev-adm/nginx_web
在掛載目錄中添加索引頁
echo nginx_web_page > /home/student/appdev-adm/nginx_web/index.html
3、創建nginx容器
查看容器鏡像倉庫
podman search
創建nginx容器并運行
需要在-v選項中指定:Z
,為掛載目錄添加SELinux安全上下文,否則SELinux 會阻止容器訪問掛載的主機目錄
podman run -d --name nginx_con -v /home/student/appdev-adm/nginx_web/:/usr/share/nginx/html:Z -p 8080:80 registry.lab.example.com/library/nginx
驗證:查看容器狀態
podman ps
驗證:本地訪問nginx_con容器中的nginx服務
curl localhost:8080
4、容器即服務
**新建用戶systemd單元文件存儲目錄 **
mkdir -p ~/.config/systemd/user
cd ~/.config/systemd/user
創建容器單元文件
podman generate systemd -n nginx_con -f
驗證:查看當前目錄下生成的單元文件
驗證:將容器暫停,然后通過systemctl啟動
podman stop nginx_con
systemctl --user start container.nginx_con.service # --user:用戶級別啟動