[转]Docker 大势已去,Podman 即将崛起
Podman
- Podman
-
- 什么是Podman?
- Podman和Docker的主要區(qū)別是什么?
- Podman的使用與docker有什么區(qū)別?
- Podman 常用命令
-
- 容器
- 鏡像
- 部署 Podman
- Podman 加速器
- 使用 Podman
-
- 運行一個容器
- 列出運行的容器
- 檢查正在運行的容器
- 查看一個運行中容器的日志
- 查看一個運行容器中的進程資源使用情況
- 停止一個運行中的容器
- 刪除一個容器
- 上傳鏡像
- 配置別名
- 用戶操作
-
- 安裝slirp4netns和fuse-overlayfs
- / etc / subuid和/ etc / subgid配置
- 用戶配置文件
- 普通用戶是無法看見root用戶的鏡像的
- 卷
-
- 使用卷
- 在主機上查看
- 容器里查看
Podman
什么是Podman?
Podman 是一個開源的容器運行時項目,可在大多數(shù) Linux 平臺上使用。Podman 提供與 Docker 非常相似的功能。正如前面提到的那樣,它不需要在你的系統(tǒng)上運行任何守護進程,并且它也可以在沒有 root 權(quán)限的情況下運行。
Podman 可以管理和運行任何符合 OCI(Open Container Initiative)規(guī)范的容器和容器鏡像。Podman 提供了一個與 Docker 兼容的命令行前端來管理 Docker 鏡像。
Podman 官網(wǎng)地址:https://podman.io/
Podman和Docker的主要區(qū)別是什么?
- dockers在實現(xiàn)CRI的時候,它需要一個守護進程,其次需要以root運行,因此這也帶來了安全隱患。
- podman不需要守護程序,也不需要root用戶運行,從邏輯架構(gòu)上,比docker更加合理。
- 在docker的運行體系中,需要多個daemon才能調(diào)用到OCI的實現(xiàn)RunC。
- 在容器管理的鏈路中,Docker Engine的實現(xiàn)就是dockerd
- daemon,它在linux中需要以root運行,dockerd調(diào)用containerd,containerd調(diào)用containerd-shim,然后才能調(diào)用runC。顧名思義shim起的作用也就是“墊片”,避免父進程退出影響容器的運訓(xùn)
- podman直接調(diào)用OCI,runtime(runC),通過common作為容器進程的管理工具,但不需要dockerd這種以root身份運行的守護進程。
- 在podman體系中,有個稱之為common的守護進程,其運行路徑通常是/usr/libexec/podman/conmon,它是各個容器進程的父進程,每個容器各有一個,common的父則通常是1號進程。podman中的common其實相當(dāng)于docker體系中的containerd-shim。
圖中所體現(xiàn)的事情是,podman不需要守護進程,而dorker需要守護進程。在這個圖的示意中,dorcker的containerd-shim與podman的common被歸在Container一層。
Podman的使用與docker有什么區(qū)別?
podman的定位也是與docker兼容,因此在使用上面盡量靠近docker。在使用方面,可以分成兩個方面來說,一是系統(tǒng)構(gòu)建者的角度,二是使用者的角度。
在系統(tǒng)構(gòu)建者方面,用podman的默認(rèn)軟件,與docker的區(qū)別不大,只是在進程模型、進程關(guān)系方面有所區(qū)別。如果習(xí)慣了docker幾個關(guān)聯(lián)進程的調(diào)試方法,在podman中則需要適應(yīng)。可以通過pstree命令查看進程的樹狀結(jié)構(gòu)。總體來看,podman比docker要簡單。由于podman比docker少了一層daemon,因此重啟的機制也就不同了。
在使用者方面,podman與docker的命令基本兼容,都包括容器運行時(run/start/kill/ps/inspect),本地鏡像(images/rmi/build)、鏡像倉庫(login/pull/push)等幾個方面。因此podman的命令行工具與docker類似,比如構(gòu)建鏡像、啟停容器等。甚至可以通過alias
docker=podman可以進行替換。因此,即便使用了podman,仍然可以使用docker.io作為鏡像倉庫,這也是兼容性最關(guān)鍵的部分。
Podman 常用命令
容器
podman run 創(chuàng)建并啟動容器 podman start 啟動容器 podman ps 查看容器 podman stop 終止容器 podman restart 重啟容器 podman attach 進入容器 podman exec 進入容器 podman export 導(dǎo)出容器 podman import 導(dǎo)入容器快照 podman rm 刪除容器 podman logs 查看日志鏡像
podman search 檢索鏡像 podman pull 獲取鏡像 podman images 列出鏡像 podman image Is 列出鏡像 podman rmi 刪除鏡像 podman image rm 刪除鏡像 podman save 導(dǎo)出鏡像 podman load 導(dǎo)入鏡像 podmanfile 定制鏡像(三個)podman build 構(gòu)建鏡像podman run 運行鏡像podmanfile 常用指令(四個)COPY 復(fù)制文件ADD 高級復(fù)制CMD 容器啟動命令ENV 環(huán)境變量EXPOSE 暴露端口部署 Podman
//安裝podman [root@localhost ~]# yum -y install podmanPodman 加速器
版本7配置加速器
//倉庫配置 [root@localhost ~]# vim /etc/containers/registries.conf [registries.search] #registries = ["registry.access.redhat.com", "registry.redhat.io", "docker.io"] #這個是查找,從這三個地方查找registries = ["docker.io"] #如果只留一個,則只在一個源里查找 [[docker.io]] location="j3m2itm3.mirror.aliyuncs.com"版本8配置加速器
#unqualified-search-registries = ["registry.fedoraproject.org", "registry.access.redhat.com", "registry.centos.org", "docker.io"] #直接注釋掉 unqualified-search-registries = ["docker.io"] #添加一個docker.io [[registry]] prefix = "docker.io" location = "j3m2itm3.mirror.aliyuncs.com" (不用加https:// 直接加地址)使用 Podman
使用 Podman 非常的簡單,Podman 的指令跟 Docker 大多數(shù)都是相同的。下面我們來看幾個常用的例子:
運行一個容器
[root@localhost ~]# podman run -d --name httpd docker.io/library/httpd Trying to pull docker.io/library/httpd... Getting image source signatures Copying blob e5ae68f74026 done Copying blob d3576f2b6317 done Copying blob bc36ee1127ec done Copying blob f1aa5f54b226 done Copying blob aa379c0cedc2 done Copying config ea28e1b82f done Writing manifest to image destination Storing signatures 0492e405b9ecb05e6e6be1fec0ac1a8b6ba3ff949df259b45146037b5f355035//查看鏡像 [root@localhost ~]# podman images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/library/httpd latest ea28e1b82f31 11 days ago 148 MB列出運行的容器
[root@localhost ~]# podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0492e405b9ec docker.io/library/httpd:latest httpd-foreground About a minute ago Up About a minute ago httpd注意:如果在ps命令中添加-a,Podman 將顯示所有容器。
檢查正在運行的容器
您可以“檢查”正在運行的容器的元數(shù)據(jù)和有關(guān)其自身的詳細(xì)信息。我們甚至可以使用 inspect 子命令查看分配給容器的 IP 地址。由于容器以無根模式運行,因此未分配 IP 地址,并且該值將在檢查的輸出中列為“無”。
[root@localhost ~]# podman inspect -l | grep IPAddress\": "SecondaryIPAddresses": null, "IPAddress": "10.88.0.5",[root@localhost ~]# curl 10.88.0.5 <html><body><h1>It works!</h1></body></html>注意: -l 是最新容器的便利參數(shù)。您還可以使用容器的 ID 代替 -l。
查看一個運行中容器的日志
選項--latest #最近的[root@localhost ~]# podman logs --latest AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.88.0.5. Set the 'ServerName' directive globally to suppress this message AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.88.0.5. Set the 'ServerName' directive globally to suppress this message [Mon Dec 13 15:17:53.690844 2021] [mpm_event:notice] [pid 1:tid 140665160166720] AH00489: Apache/2.4.51 (Unix) configured -- resuming normal operations [Mon Dec 13 15:17:53.690946 2021] [core:notice] [pid 1:tid 140665160166720] AH00094: Command line: 'httpd -D FOREGROUND' 10.88.0.1 - - [13/Dec/2021:15:19:48 +0000] "GET / HTTP/1.1" 200 45 10.88.0.1 - - [13/Dec/2021:15:20:47 +0000] "GET / HTTP/1.1" 200 45查看一個運行容器中的進程資源使用情況
可以使用top觀察容器中的 nginx pid
語法:podman top <container_id> [root@localhost ~]# podman top httpd USER PID PPID %CPU ELAPSED TTY TIME COMMAND root 1 0 0.000 15m38.599711321s ? 0s httpd -DFOREGROUND www-data 7 1 0.000 15m38.599783256s ? 0s httpd -DFOREGROUND www-data 8 1 0.000 15m38.599845342s ? 0s httpd -DFOREGROUND www-data 9 1 0.000 15m38.599880444s ? 0s httpd -DFOREGROUND停止一個運行中的容器
[root@localhost ~]# podman stop --latest 2f3edf712621d3a41e03fa8c7f6a5cdba56fbbad43a7a59ede26cc88f31006c4 [root@localhost ~]# podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES刪除一個容器
[root@localhost ~]# podman rm --latest 2f3edf712621d3a41e03fa8c7f6a5cdba56fbbad43a7a59ede26cc88f31006c4 [root@localhost ~]# podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES以上這些特性基本上都和 Docker 一樣,Podman 除了兼容這些特性外,還支持了一些新的特性。
上傳鏡像
例如,如果我們想在 docker.io 上分享我們新建的 Nginx 容器鏡像,這很容易。首先登錄碼頭:
[root@localhost nginx]# tree . ├── Dockerfile └── files└── nginx-1.20.1.tar.gz[root@localhost nginx]# cat Dockerfile FROM docker.io/library/centosENV PATH /usr/local/nginx/sbin:$PATH ADD files/nginx-1.20.1.tar.gz /usr/src RUN useradd -r -M -s /sbin/nologin nginx && \yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++ make && \mkdir -p /var/log/nginx && \cd /usr/src/nginx-1.20.1 && \./configure \--prefix=/usr/local/nginx \--user=nginx \--group=nginx \--with-debug \--with-http_ssl_module \--with-http_realip_module \--with-http_image_filter_module \--with-http_gunzip_module \--with-http_gzip_static_module \--with-http_stub_status_module \--http-log-path=/var/log/nginx/access.log \--error-log-path=/var/log/nginx/error.log && \make && make installCMD ["nginx","-g","daemon off"] [root@localhost nginx]# podman build -t nginx .// 修改鏡像名[root@localhost ~]# podman tag docker.io/library/nginx:latest docker.io/1314444/test:latest// 登錄并上傳鏡像 [root@localhost ~]# podman login docker.io // 需要告訴其要登錄到docker倉庫 [root@localhost ~]# podman login docker.io Username: 1314444 #賬戶 Password: ******** #密碼 Login Succeeded![root@localhost nginx]# podman push docker.io/1314444/test:latest //上傳鏡像 Getting image source signatures Copying blob 38c40d6c2c85 done Copying blob fee76a531659 done Copying blob c2adabaecedb done Copying config 7f3589c0b8 done Writing manifest to image destination Copying config 7f3589c0b8 done Writing manifest to image destination Storing signatures//請注意,我們將四層推送到我們的注冊表,現(xiàn)在可供其他人共享。快速瀏覽一下: [root@localhost ~]# podman inspect 1314444/test:nginx //輸出: [{"Id": "7f3589c0b8849a9e1ff52ceb0fcea2390e2731db9d1a7358c2f5fad216a48263","Digest": "sha256:7822b5ba4c2eaabdd0ff3812277cfafa8a25527d1e234be028ed381a43ad5498","RepoTags": ["docker.io/1314444/test:nginx",......總而言之,Podman 使查找、運行、構(gòu)建和共享容器變得容易。
配置別名
如果習(xí)慣了使用 Docker 命令,可以直接給 Podman 配置一個別名來實現(xiàn)無縫轉(zhuǎn)移。你只需要在 .bashrc 下加入以下行內(nèi)容即可:
[root@localhost ~]# echo "alias docker=podman" >> .bashrc source .bashrc [root@localhost ~]# alias alias cp='cp -i' alias docker='podman' .......用戶操作
在允許沒有root特權(quán)的用戶運行Podman之前,管理員必須安裝或構(gòu)建Podman并完成以下配置
cgroup V2Linux內(nèi)核功能允許用戶限制普通用戶容器可以使用的資源,如果使用cgroupV2啟用了運行Podman的Linux發(fā)行版,則可能需要更改默認(rèn)的OCI運行時。某些較舊的版本runc不適用于cgroupV2,必須切換到備用OCI運行時crun。
安裝slirp4netns和fuse-overlayfs
在普通用戶環(huán)境中使用Podman時,建議使用fuse-overlayfs而不是VFS文件系統(tǒng),至少需要版本0.7.6。現(xiàn)在新版本默認(rèn)就是了。
[root@localhost ~]# yum -y install slirp4netns[root@localhost ~]# yum -y install fuse-overlayfs [root@localhost ~]# vi /etc/containers/storage.conf 77 mount_program = "/usr/bin/fuse-overlayfs" //取消注釋/ etc / subuid和/ etc / subgid配置
Podman要求運行它的用戶在/ etc / subuid和/ etc / subgid文件中列出一系列UID,shadow-utils或newuid包提供這些文件
[root@localhost ~]# yum -y install shadow-utils可以在/ etc / subuid和/ etc / subgid查看,每個用戶的值必須唯一且沒有任何重疊。[root@localhost ~]# useradd zz [root@localhost ~]# cat /etc/subuid zz:100000:65536 [root@localhost ~]# cat /etc/subgid zz:100000:65536// 啟動非特權(quán)ping [root@localhost ~]# sysctl -w "net.ipv4.ping_group_range=0 200000" //大于100000這個就表示tom可以操作podman net.ipv4.ping_group_range = 0 200000-
這個文件的格式是 USERNAME:UID:RANGE
- 中/etc/passwd或輸出中列出的用戶名getpwent。
- 為用戶分配的初始 UID。
- 為用戶分配的 UID 范圍的大小。
該usermod程序可用于為用戶分配 UID 和 GID,而不是直接更新文件。
[root@localhost ~]# usermod --add-subuids 200000-201000 --add-subgids 200000-201000 hh grep hh /etc/subuid /etc/subgid /etc/subuid:hh:200000:1001 /etc/subgid:hh:200000:1001用戶配置文件
三個主要的配置文件是container.conf、storage.conf和registries.conf。用戶可以根據(jù)需要修改這些文件。
container.conf
如果它們以該順序存在。每個文件都可以覆蓋特定字段的前一個文件。
配置storage.conf文件
1./etc/containers/storage.conf 2.$HOME/.config/containers/storage.conf在普通用戶中/etc/containers/storage.conf的一些字段將被忽略
[root@localhost ~]# vi /etc/containers/storage.conf [storage]# Default Storage Driver, Must be set for proper operation. driver = "overlay" #此處改為overlay ....... mount_program = "/usr/bin/fuse-overlayfs" #取消注釋[root@localhost ~]# sysctl user.max_user_namespaces=15000 #如果版本為8以下,則需要做以下操作:在普通用戶中這些字段默認(rèn)
graphroot="$HOME/.local/share/containers/storage" runroot="$XDG_RUNTIME_DIR/containers"registries.conf
配置按此順序讀入,這些文件不是默認(rèn)創(chuàng)建的,可以從/usr/share/containers或復(fù)制文件/etc/containers并進行修改。
授權(quán)文件
此文件里面寫了docker賬號的密碼,以加密方式顯示
普通用戶是無法看見root用戶的鏡像的
//root用戶 [root@localhost ~]# podman images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/library/httpd latest ea28e1b82f31 11 days ago 146 MB//普通用戶 [root@localhost ~]# su - zz [zz@localhost ~]$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE卷
- 容器與root用戶一起運行,則root容器中的用戶實際上就是主機上的用戶。
- UID GID是在/etc/subuid和/etc/subgid等中用戶映射中指定的第一個UID GID。
- 如果普通用戶的身份從主機目錄掛載到容器中,并在該目錄中以根用戶身份創(chuàng)建文件,則會看到它實際上是你的用戶在主機上擁有的。
使用卷
[root@localhost ~]# su - zz [zz@localhost ~]$ pwd /home/zz [zz@localhost ~]$ mkdir /home/zz/data[zz@localhost ~]$ podman run -it -v "$(pwd)"/data:/data docker.io/library/busybox /bin/sh Trying to pull docker.io/library/busybox:latest... Getting image source signatures Copying blob 3cb635b06aa2 done Copying config ffe9d497c3 done Writing manifest to image destination Storing signatures / # ls bin data dev etc home proc root run sys tmp usr var / # cd data/ /data # ls /data # touch 123 /data # ls -l total 0 -rw-r--r-- 1 root root 0 Dec 13 00:17 123在主機上查看
[zz@localhost ~]$ ll data/ 總用量 0 -rw-r--r-- 1 zz zz 0 12月 13 00:17 123//寫入文件 [zz@localhost ~]$ echo "hell world" >> 123 [zz@localhost ~]$ cat 123 hell world容器里查看
/data # cat 123 hell world//我們可以發(fā)現(xiàn)在容器里面的文件的屬主和屬組都屬于root,那么如何才能讓其屬于tom用戶呢?下面告訴你答案 /data # ls -l total 4 -rw-rw-r-- 1 root root 12 Dec 13 00:20 123//只要在運行容器的時候加上一個--userns=keep-id即可。 [zz@localhost ~]$ podman run -it --name test -v "$(pwd)"/data:/data --userns=keep-id docker.io/library/busybox /bin/sh ~ $ cd data/ /data $ ls -l total 4 -rw-r--r-- 1 zz zz 11 Dec 13 00:21 123使用普通用戶映射容器端口時會報“ permission denied”的錯誤
[zz@localhost ~]$ podman run -d -p 80:80 httpd Error: rootlessport cannot expose privileged port 80, you can add 'net.ipv4.ip_unprivileged_port_start=80' to /etc/sysctl.conf (currently 1024), or choose a larger port number (>= 1024): listen tcp 0.0.0.0:80: bind: permission denied普通用戶可以映射>= 1024的端口
[zz@localhost ~]$ podman run -d -p 1024:80 httpd 58613a6bdc70d4d4f9f624583f795a62a610596d166f0873bdff8fb26aa15092 [zz@localhost ~]$ ss -anlt State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 128 0.0.0.0:22 0.0.0.0:* LISTEN 0 128 *:1024 *:* LISTEN 0 128 [::]:22 [::]:*配置echo ‘net.ipv4.ip_unprivileged_port_start=80’ >> /etc/sysctl.conf后可以映射大于等于80的端口
[root@localhost ~]# echo 'net.ipv4.ip_unprivileged_port_start=80' >> /etc/sysctl.conf [root@localhost ~]# sysctl -p net.ipv4.ip_unprivileged_port_start = 80[zz@localhost ~]$ podman run -d -p 80:80 httpd 1215455a0c300d78e7bf6afaefc9873f818c6b0f26affeee4e2bc17954e72d8e [zz@localhost ~]$ ss -anlt State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 128 0.0.0.0:22 0.0.0.0:* LISTEN 0 128 *:1024 *:* LISTEN 0 128 *:80 *:* LISTEN 0 128 [::]:22 [::]:*
---------------------
作者:1314444
來源:CSDN
原文:https://blog.csdn.net/qq_48289488/article/details/121905018
版權(quán)聲明:本文為作者原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!
內(nèi)容解析By:CSDN,CNBLOG博客文章一鍵轉(zhuǎn)載插件
總結(jié)
以上是生活随笔為你收集整理的[转]Docker 大势已去,Podman 即将崛起的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 达摩院年终预测出炉:2022 十大科技趋
- 下一篇: mpvue开发小程序分享朋友圈无法自定义