docker的平替--podman

前言

我們都知道,docker這個東西,是CaaS(Container as a Service,容器即服務)的通常解法。我們使用docker來管理容器的生命週期,比如鏡像的生成、容器的管理和定製(Dockerfile)、倉庫的上傳和下載等。

但是docker存在很多不方便使用的地方,所以我們可以使用podman來做平替。
 

podman介紹

Podman(Pod Manager), 是由RedHat公司推出的容器管理工具。它可以做爲docker的平替,使用上也非常相似。但其實二者之間也存在非常顯著的差別,相比起來podman會比docker更加完善一些。
 

podman與docker的差異

1. 底層CRI

  • 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等。

    preview

 

2. 守護進程

  • docker:後臺有docker-daemon,需要root權限

  • podman:沒有daemon,不需要root權限

 

3. 安全性

  • docker:如果你在容器外有一些文件無法訪問,在啓動鏡像映射文件的時候,你將此文件映射到容器中時,使用docker exec進入容器後,就可以編輯了。

  • podman:即使你將容器外無法訪問的文件映射到容器中時,也無法編輯此文件。

    因此,podman比docker安全性更好。

 

podman安裝

1. ubuntu

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

 

2. centos

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起來了。
image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章