iT邦幫忙

2026 iThome 鐵人賽

DAY 5
0
IT Operation

Podman Quadlet-容器服務化(在單體系統到微服務之間)系列 第 5

建個前端容器感受一下Podman Quadlet

  • 分享至 

  • xImage
  •  

目前主流架構是前後端分離,先Demo一個前端的容器服務。我在a2a-web目錄下有以下檔案及子目錄:

  • html/:網頁子目錄
  • modules/:模組子目錄
  • nginx.conf:Nginx配置檔
  • Dockerfile
FROM registry.suse.com/suse/nginx:latest

# 清掉預設網站內容
RUN rm -rf /srv/www/htdocs/*

# 複製 React build 輸出
COPY html/ /srv/www/htdocs/
COPY modules/ /srv/www/htdocs/modules/

# 自訂 nginx 設定
COPY nginx.conf /etc/nginx/nginx.conf

EXPOSE 80

STOPSIGNAL SIGQUIT

CMD ["nginx", "-g", "daemon off;"]

從Dockerfile可以看出我是用SUSE版的Nginx,有別於常見的docker.io/library/nginx版。
好處是有SUSE是有法人機構維護,壞處是更新版本比docker.io慢很多,若弱掃出版本太舊又急需新版,就得考慮docker.io版本了。
接著進行包成image並匯出tar檔。

podman build --arch amd64 -t localhost/a2a-web:20260812-01 .
podman save -o a2a-web.tar localhost/a2a-web:20260812-01

先前說過我本機CPU是Apple M4,要包成支援x86架構CPU的image,就得加--arch amd64參數。
隨後上RedHat VM:scp ./a2a-web.tar appuser@RedHatIP:.
這時後就用appuser遠端上傳,然後ssh appuser@RedHatIP登入遠端做匯入及編寫.container檔。

# 匯入image
$ podman load -i a2a-web.tar
# 確認image有成功匯入
$ podman images | grep a2a-web 
REPOSITORY           TAG          IMAGE ID      CREATED       SIZE
localhost/a2a-web    20260812-01  59987120e930  1  hours ago  232 MB

再來用vi編寫a2a-web.container檔:vi .config/containers/systemd/a2a-web.container。這時是用appuser登入,所在路徑是在/home/appuser下。

[Unit]
Description=React static site on SUSE NGINX
After=network-online.target
Wants=network-online.target

[Container]
Image=localhost/a2a-web:20260812-01
ContainerName=a2a-web
PublishPort=8080:80
Network=a2a-net.network
VolatileTmp=true

[Service]
Restart=no
TimeoutStartSec=900

[Install]
WantedBy=default.target

與應用程式有關的當屬[Container]與[Service]:
[Container]

  • Image:指定image名稱與Tag
  • ContaienrName:本容器名稱,最好與服務名稱相同以免搞混,藉由指定相同的Network,別的容器若呼叫本容器,可以發http://a2a-web:8080
  • PublishPort:這裡設定等於docker啟動容器的port mapping,在nginx.conf裡是聽80 port,對外聽8080
  • VolatileTmp:設為true是指將記憶體當作暫存區,相當於docker run -d --tmpfs /tmp my-image
    [Service]
  • Restart:之前設為always,但有發生過容器裡AP寫得不好,啟動失敗又不斷重啟,所以設為no表示啟動失敗就不重啟了。
  • TimeoutStartSec:這裡設900秒,啟動時間超過900秒就判斷逾時啟動失敗。

而其它標籤有的有帶.target的值,這是Linux引進新核心systemd來取代舊核心SysV的RunLevel,已屬作業系統層級的技術。RedHat透過podman quadlet將容器運行環境整合到systemd,所以目前先做這樣的設置。

寫好.container檔之後,如同前一章所提,執行:

systemctl --user daemon-reload
systemctl --user start a2a-web

這時候不管用systemctl --user status a2a-webpodman quadlet list查a2a-web的STATUS,正常的話就是active/running狀態。在外面瀏覽器就可以測試用http://RedHatIP:8080


上一篇
離線安裝Podman
下一篇
在容器裡的Volume
系列文
Podman Quadlet-容器服務化(在單體系統到微服務之間)11
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言