目前主流架構是前後端分離,先Demo一個前端的容器服務。我在a2a-web目錄下有以下檔案及子目錄:
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]
docker run -d --tmpfs /tmp my-image而其它標籤有的有帶.target的值,這是Linux引進新核心systemd來取代舊核心SysV的RunLevel,已屬作業系統層級的技術。RedHat透過podman quadlet將容器運行環境整合到systemd,所以目前先做這樣的設置。
寫好.container檔之後,如同前一章所提,執行:
systemctl --user daemon-reload
systemctl --user start a2a-web
這時候不管用systemctl --user status a2a-web或podman quadlet list查a2a-web的STATUS,正常的話就是active/running狀態。在外面瀏覽器就可以測試用http://RedHatIP:8080