測試環境為 CentOS 8 x86_64 虛擬機.
參考文章 – https://www.redhat.com/sysadmin/container-networking-podman
Podman 為無背景程序(Daemonless)的容器引擎, Container 可以使用 root 或 非 root 的使用者來執行,相較於 docker 是個 Daemon ,且需要操作的使用者要有 root 相同權限才能執行.
預設使用 Podman 為 Rootless networking , Container 容器本身是沒有 IP地址, 可以使用 -P 或是 -p (下面說明) 來指定,其中 Rootless 與 Rootfull networking 的最大差別是 Rootfull networking 可以使用 < 1024 的埠 (已經定義好功能的埠,如 http 為 TCP port 80 )
使用一般使用者 ben (非 sudo user)登入並操作.
下面使用 Nginx (http server) rootfull container 的網路與 Host 之間進行溝通.
[ben@localhost ~]$ podman search nginx docker.io docker.io/library/nginx Official build of Nginx. 14935 [OK] ...
[root@localhost ~]# podman pull docker.io/library/nginx Trying to pull docker.io/library/nginx:latest... Getting image source signatures Copying blob 8283eee92e2f done Copying blob febe5bd23e98 done Copying blob 69692152171a done Copying blob 30afc0b18f67 done Copying blob 351ad75a6cfa done Copying blob 596b1d696923 done Copying config d1a364dc54 done Writing manifest to image destination Storing signatures d1a364dc548d5357f0da3268c888e1971bbdb957ee3f028fe7194f1d61c6fdee
[root@localhost ~]# podman images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/library/nginx latest d1a364dc548d 6 days ago 137 MB
前面有說到 Rootfull networking 可以使用 < 1024 的埠 (已經定義好具有指定功能的,如 http 為 TCP port 80 ),但使用者 ben (非 sudo user) 在操作時會有問題.
[ben@localhost ~]$ podman run -dt --rm -p 192.168.111.28:80:80/tcp docker.io/library/nginx 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 192.168.111.28:80: bind: permission denied
[ben@localhost ~]$ sudo podman run -dt --rm -p 192.168.111.28:80:80/tcp docker.io/library/nginx 我們相信您已經從本機系統管理員取得 日常注意事項。注意事項通常可以歸結為三件事情: #1) 尊重他人隱私。 #2) 輸入指令前先三思。 #3) 權力越大則責任越大。 [sudo] ben 的密碼: ben 不在 sudoers 檔案中。此事件將會回報。
這邊要先把 ben 變成執行 podman 時身份轉換為 super user.
需要用 root 使用 visudo 指令 – https://benjr.tw/295 去新增使用者 ben 並開 podman 的 sudo 權限.
[root@localhost ~]# visudo ben ALL=/usr/bin/podman
回到 ben 使用者.
[ben@localhost ~]$ sudo -l [sudo] ben 的密碼: 比較 %2$s 上 %1$s 的預設條目: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin 使用者 ben 可以在 localhost 上執行以下指令: (root) /usr/bin/podman
[ben@localhost ~]$ sudo podman run -dt --rm -p 192.168.111.28:80:80/tcp docker.io/library/nginx fafa86d869adc69f08e590d8aa5d207831251af8056add16c71f24441823ca02
使用參數:
- –detach, -d=true|false
Detached mode: run the container in the background and print the new container ID. - –tty, -t=true|false
Allocate a pseudo-TTY. The default is false. - –rm=true|false
Automatically remove the container when it exits. The default is false. - –publish, -p=ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort
Publish a container’s port, or range of ports, to the host.
參數範例 -p 192.168.111.28(IP):80(hostPort):80(containerPort)/tcp
[ben@localhost ~]$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 10047c8e29cb docker.io/library/nginx nginx -g daemon o... 3 minutes ago Created 192.168.111.28:80->80/tcp fervent_solomon
這是後就可以透過預設的 80 port 來連線.
[ben@localhost ~]$ curl http://192.168.111.28 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
前面有下 -rm 所以當我們把 container stop 之後,該 container 有就消失了.
[ben@localhost ~]$ podman stop fervent_solomon fervent_solomon
[ben@localhost ~]$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES