Contents

Openshift - Podman 管理容器基礎

輕巧且快速部署應用程式的方式,可以透過容器化( Containerd )來達成,RHEL 中安全且好用的工具 - Podman。

1. 容器介紹

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

容器的好處:

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

https://hackmd.io/_uploads/S17Xi0Nhs.png
容器與虛擬機區別

1.1 Podman 管理容器

Podman 是一個開園的工具,用於管理容器與容器Image檔,並能與Image 倉庫作互動,具備下列能力:

  • 使用 OCI 格式定義 - https://opencontainers.org/
  • 在本機上儲存本地 Image ,下載或載入後隨時開箱啟用
  • Podman 遵循與 Docker 相同的操作模式,可以無痛轉移

1.2 容器功能

  1. Namespaces
    • 隔離網路 interface、 程序執行PID、 掛載點 、主機名稱等資源隔離。
  2. Control groups (cgroups)
    • 透過 Cgroups 限制每個容器可以使用資源上限,避免使用主機上過多資源。
  3. Seccomp
    • Seccomp 可以限制系統參數、呼叫等,增加安全性。
  4. SELinux
    • Slinux 保護宿主機器,現在容器存取及訪問宿主機權限。

2 啟動容器

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. 進入容器

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

常用的參數:

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

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

4.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>

4.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 目錄的位置。

4.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

4.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

4.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>

4.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 內容。

4.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>

5. 小結

Podman 是非常好用的小工具,輕量且無須要求 root 就能操作, 除了上述基礎操作還可以針對容器目錄掛載、映像檔操拉取等進階操作。



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