Contents

Linux - 容器管理工具 - Podman

輕巧且快速部署應用程式的方式,可以透過容器化( Containerd )來達成,最普遍的為使用 Docker 管理工具,另外 RHEL 有另外一套更安全且好用的工具 - Podman。

1. 容器介紹

容器化是應用程序各自獨立,允許單個內核上有多個獨立的用戶空間實體,容器化並不是虛擬化的一種。拿租屋來比喻,虛擬化等同於套房 ( 每一個 VM 都有自己的獨立 OS,跟自己的房間 ) ,容器化等同於雅房 ( 共用 OS ,不過每一間雅房是獨立互相不干擾 )。

容器的好處:

  1. 輕便 - 容器佔用的伺服器空間比虛擬機少,幾秒鐘即可啟動。
  2. 彈性 - 容器具有高彈性,不需要分配給定數量的資源。
  3. 性能 - 共用同一個 OS ,僅需要一個 OS 資源的消耗。

2. Docker Vs Podman

市場上較為熱門且熟悉的容器管理工具是 Docker ,然而 Podman 與 Docker 最大的差異是,不需要像是 Docker 中的 daemon 背景常駐程式( 圖一 ),而是直接使用 OCI 直接執行核心的 continer ( 圖二 ),不會有 daemon 異常停止導致所有容器一併關閉的問題,另外 Podman 執行容器是 rootless ,不需要具備 root 權限也能執行。

https://i.imgur.com/Lx3Gh64.png
https://developers.redhat.com/ - (圖一)

https://i.imgur.com/cuVm2vz.png
https://developers.redhat.com/ - (圖二)

預設環境
RHEL 8 一般安裝就會預設使用 podman ,如果是最小安裝可以直接 yum install podman 進行安裝。

3. Podman 用法

Podman 用法與 Docker 幾乎一模一樣,只要把 Docker 更換成 Podman 就可以使用。

3.1 啟動容器

與操作 Docker 方式一樣,使用 podman run 。

1
podman run [options] <image name>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
[student@servera ~]$ podman run -d --name my-nginx nginx
✔ docker.io/library/nginx:latest
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
Copying blob 2215908dc0a2 done  
Copying blob 08c3cb2073f1 done  
Copying blob c4ffe9532b5f done  
Copying blob 18f38162c0ce done  
Copying blob c229119241af done  
Copying blob 10e2168f148a done  
Copying config 12766a6745 done  
Writing manifest to image destination
Storing signatures
a2ca71137977c101ec989e4c490467b0b4a2672d80ca542563759f03956e130b
[student@servera ~]$ podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED         STATUS             PORTS       NAMES
a2ca71137977  docker.io/library/nginx:latest  nginx -g daemon o...  11 seconds ago  Up 10 seconds ago              my-nginx

常用的參數:

  1. -d : 背景執行
  2. --name : 自訂易容器名稱
  3. -p : 定義輸出的 port ( <target port>:<source port>)
  4. -v : 定義掛載的目錄 ( <target dir>:<source dir>)

3.2 進入容器

與操作 Docker 方式一樣,使用 podman exec 。

1
podman exec  [options] <container name> <command>

常用的參數:

  1. -i : 互動式
  2. -t : 取得tty

3.3 開機後自動啟動容器 ( 一般 user )

在 Docker 會使用 –restart=always 透過 Daemon 程序自動拉起 ( 前提是 Daemon 有託管給 systemd ) , Podman 是直接將容器服務包成 systemd。

3.3.1 創建一個容器變確保服務可以訪問

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[student@servera ~]$ podman run -d --name restart-nginx -p 8080:80 nginx
✔ docker.io/library/nginx:latest
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
Copying blob 18f38162c0ce done  
Copying blob c4ffe9532b5f done  
Copying blob 08c3cb2073f1 done  
Copying blob 10e2168f148a done  
Copying blob 2215908dc0a2 done  
Copying blob c229119241af done  
Copying config 12766a6745 done  
Writing manifest to image destination
Storing signatures
0f08d4f8e218a76ec4f4e68eb5bf04df518ee685825e6b49017f12ef718f4b7a
[student@servera ~]$ curl 127.0.0.1:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
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>

3.3.2 產生 User 的 systemd 目錄

1
2
3
4
5
[student@servera ~]$ mkdir -pv ~/.config/systemd/user/
mkdir: created directory '/home/student/.config'
mkdir: created directory '/home/student/.config/systemd'
mkdir: created directory '/home/student/.config/systemd/user/'
[student@servera ~]$ cd ~/.config/systemd/
systemd
可以參考 man systemd.unit 內容說明,介紹 user systemd 目錄的位置。

3.3.3 產生 systemd unit

1
2
3
4
[student@servera user]$ podman generate systemd --name restart-nginx  --new -f
/home/student/.config/systemd/user/container-restart-nginx.service
[student@servera user]$ ls
container-restart-nginx.service

3.3.4 Podman 停止及刪除容器

1
2
3
4
5
6
[student@servera user]$ podman stop restart-nginx
restart-nginx
[student@servera user]$ podman rm restart-nginx
0f08d4f8e218a76ec4f4e68eb5bf04df518ee685825e6b49017f12ef718f4b7a
[student@servera user]$ podman ps
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES

3.3.5 改用 systemd 啟動容器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[student@servera user]$ systemctl --user enable container-restart-nginx.service --now
Created symlink /home/student/.config/systemd/user/multi-user.target.wants/container-restart-nginx.service → /home/student/.config/systemd/user/container-restart-nginx.service.
Unit /home/student/.config/systemd/user/container-restart-nginx.service is added as a dependency to a non-existent unit multi-user.target.
Created symlink /home/student/.config/systemd/user/default.target.wants/container-restart-nginx.service → /home/student/.config/systemd/user/container-restart-nginx.service.
[student@servera user]$ curl 127.0.0.1:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
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>

3.3.6 使用者不需登入也會啟動服務

除了 root 之外的服務,都必須要使用者 login 後 systemd 才會自動拉起該 user 的服務,不過可以透過 enable-linger 不需要登入也可以啟動服務。

1
2
3
[student@servera user]$ loginctl enable-linger 
[student@servera user]$ loginctl show-user  student | grep Linger
Linger=yes
loginctl
可以參考 man loginctl 內容說明,介紹 enable-linger 內容。

3.3.7 重啟機器並檢查服務有正常啟動

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[student@servera ~]$ curl 127.0.0.1:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
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>

4. Docker 轉換 Podman 小技巧

如果 Docker 習慣已久不好改過來,可以直接安裝 podman-docker 套件( yum install podman-docker ),可以繼續使用 docker 指令,不過 cli 背後是執行 podman。


5. 小結

Podman 使用上越來越多人使用,在不需要擁有 root 權限也能執行容器在安全性上面優勢遠遠勝過 Docker 。



如果你還沒有註冊 Like Coin,你可以在文章最下方看到 Like 的按鈕,點下去後即可申請帳號,透過申請帳號後可以幫我的文章按下 Like,而 Like 最多可以點五次,而你不用付出任何一塊錢,就能給我寫這篇文章的最大的回饋!