我們都知道,docker這個東西,是CaaS(Container as a Service,容器即服務)的通常解法。我們使用docker來管理容器的生命週期,比如映象的生成、容器的管理和客製化(Dockerfile)、倉庫的上傳和下載等。
但是docker存在很多不方便使用的地方,所以我們可以使用podman來做平替。
Podman(Pod Manager), 是由RedHat公司推出的容器管理工具。它可以做為docker的平替,使用上也非常相似。但其實二者之間也存在非常顯著的差別,相比起來podman會比docker更加完善一些。
docker:使用的是docker-shim, 這個CRI(Container Runtime Interface, 容器執行介面)並不是docker實現的,而是kubernetes幫它實現的。由於早期沒有docker平替工具,故kubernetes開發了一個api呼叫docker管理下的容器資源。後來由於有了其他的平替工具,所以kubernetes在1.20版本正式停止維護docker-shim這個CRI,使用其餘CRI(可以由其他容器管理工具實現,例如CRI-O等)。這也就是當時講的「kubernetes停止對docker維護」的意思。
podman:使用的是CRI-O,該介面來自於開放容器計劃(OCI), 可以讓kubelet來呼叫下層的容器資源,而不需要人為管理,如圖所示。
其餘比較知名的CRI還有containerd、lxd等。
docker:後臺有docker-daemon,需要root許可權
podman:沒有daemon,不需要root許可權
docker:如果你在容器外有一些檔案無法存取,在啟動映象對映檔案的時候,你將此檔案對映到容器中時,使用docker exec進入容器後,就可以編輯了。
podman:即使你將容器外無法存取的檔案對映到容器中時,也無法編輯此檔案。
因此,podman比docker安全性更好。
1) ubuntu22.04,可直接apt安裝
apt install -y podman
2)ubuntu18.04和20.04,需要新增源
. /etc/os-release
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
curl -L "https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/Release.key" | sudo apt-key add -
apt install -y podman
1)cent8可以直接yum安裝docker,預設裝的是podman
yum install -y docker
2)cent7,可以安裝epel-release, 然後yum安裝podman
yum install -y epel-release
yum install -y podman
如果非root使用者來使用podman,可能會遇到namespace沒許可權的問題:
user namespaces are not enabled in /proc/sys/user/max_user_namespaces
此功能是Centos3.8新增進去的,預設關閉,需要開啟。
[root@node2 ~]# cat /proc/sys/user/max_user_namespaces
0
# 臨時開啟
[root@node2 ~]# echo 200 > /proc/sys/user/max_user_namespaces
# kernel 設定
[root@node2 ~]# grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
# 寫入組態檔
[root@node2 ~]# echo "user.max_user_namespaces=200" >> /etc/sysctl.conf
# 生效
[root@node2 ~]# sysctl -p
# 關閉namespace
[root@node2 ~]# grubby --remove-args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
當然,如果你敲docker上癮,也可以使用alias修改別名。
echo "alias docker=podman" >> ~/.bashrc
source ~/.bashrc
如果podman使用預設的倉庫源,可能會pull不下來,所以需要修改倉庫源。
由於podman不需要root許可權,任何人都可以使用,所以每個人可以設定自己的源,就像環境變數一樣,每人一個。
全域性設定: /etc/containers/registries.conf
個人設定: ~/.config/containers/registries.conf
設定方法:
unqualified-search-registries = ["docker.io", "registry.access.redhat.com"]
[[registry]]
prefix = "docker.io"
location = "docker.io"
[[registry.mirror]]
location = "docker.mirrors.ustc.edu.cn"
[[registry.mirror]]
location = "registry.docker-cn.com"
podman pull的時候,比docker多了一個映象選擇的過程
young@home:/opt$ podman pull nginx
✔ docker.io/library/nginx:latest
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
Copying blob 589b7251471a done
Copying blob 186b1aaa4aa6 done
Copying blob a0bcbecc962e done
Copying blob b4df32aa5a72 done
Copying blob a9edb18cadd1 done
Copying blob a2abf6c4d29d done
Copying config 605c77e624 done
Writing manifest to image destination
Storing signatures
605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85
young@home:/opt$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/nginx latest 605c77e624dd 6 months ago 146 MB
young@home:/opt$ podman run -d -p 8000:80 docker.io/library/nginx
6e898573edec454699c760b9d5f23091cb22143563e038e8d2cdf0d5277c03dc
young@home:/opt$
young@home:/opt$ docker container ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6e898573edec docker.io/library/nginx:latest nginx -g daemon o... 4 seconds ago Up 5 seconds ago 0.0.0.0:8000->80/tcp hopeful_brattain
然後存取ip:8000, 發現run起來了。