Podman – Rootfull networking

測試環境為 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 指令 – http://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
沒有解決問題,試試搜尋本站其他內容

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料