Nginxを題材に、Docker Compose風運用をPodmanでする

Posted by 雅楽斎 on Saturday, August 19, 2023

TOC

DockerからPodmanへの移行第一歩

コンテナ実行環境としてデファクトスタンダードと言っていいDockerでしたが、実行がDockerd経由で何らかの脆弱性を突かれるとDocker自体がSPOFになりかねないという設計とDockerHubが潰れるとドメイン名を省略しているコンテナが全てメンテナンスされなくなる設計とrootlessへの取り組みが遅かったので、個人的には可能な限りコンテナの実行はPodmanでやりたいなぁという思いがあります。

ということでPodmanを使っていくわけですが、動作確認はOrange Pi 5をJoshua Riek氏のビルドしたUbuntu 22.04で行っています。以下の記事の続きです。

久しぶりにPodmanとUbuntuでの現状(2023年7月)

HTTPサーバーとしてのNginx

リバースプロキシとして取り上げられることの多いNginxですが、ここではHTTPサーバーとして扱います。Raspberry PiやOrange PiといったSBCで作業を行った結果を取り出す場合、標準状態と言っていいsshでログインができればSFTPでファイルの取得を行えますが、それはSFTPクライアントがある端末(PCとか)からアクセスできるという条件のもとであって、もっと簡単に!というかブラウザで!ファイルを取り出したい!スマホから手軽にファイル見たいんだよ!という需要があると仮定します。

というよりSFTPログインを頻繁にする場合に手間なのはクライアントが必要というのもそうですが基本的にログインの認証が都度必要になるというのが大きいですね。今回は一般ユーザーのホームディレクトリをHTTP経由で取得できるようにNginxで公開するというユースケースです。当然LAN内からのアクセスだけを想定しています。

基本的には以前Docker用にまとめた内容と一緒です。

かんたんHTTPサーバー構築3選(Python/Java/BusyBox)+α

PodmanでDocker composeっぽくするとは

複数のコンテナを順序を付けて起動・終了するDocker composeはコンテナを実行中にOSを再起動すると再起動後にもコンテナを実行した状態にできますが、私が試した限りでは今の所Podmanでこれを実現することはできません。

で、OSの再起動をまたいだ実行状態の保持をPodmanでどうやるかというとSystemdのユニットとしてpodを管理する方法があります。

いやめんどくさいな!という印象しか持たないのが普通だと思いますが、一応PodmanコマンドはSystemdのユニットファイルを生成する機能を内包していて、ある程度の雛形は生成してくれます。

ということで、以下の順序で作業をします。

  1. docker-compose.ymlを作る
  2. podman-composeでpodmanコンテナとして実行を確認
  3. podmanでsystemdのユニットファイルを生成
  4. 生成したユニットファイルをsystemdに登録、動作確認

Podman実行ユーザーをlinger指定

podmanの実行ユーザーがログアウトしてもコンテナを実行できるように、linger指定します。

# loginctl enable-linger hogehoge

podman-composeのインストール

pipでpodman-composeをインストールします。1pipはインストール済みとします。(Ubuntu 22.04ではpython3-pipをインストールすると使えるようになります)

$ pip install podman-compose
Defaulting to user installation because normal site-packages is not writeable
Collecting podman-compose
  Downloading podman_compose-1.0.6-py2.py3-none-any.whl (34 kB)
Collecting python-dotenv
  Downloading python_dotenv-1.0.0-py3-none-any.whl (19 kB)
Requirement already satisfied: pyyaml in /usr/lib/python3/dist-packages (from podman-compose) (5.4.1)
Installing collected packages: python-dotenv, podman-compose
  WARNING: The script dotenv is installed in '/home/hogehoge/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
  WARNING: The script podman-compose is installed in '/home/hogehoge/.local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed podman-compose-1.0.6 python-dotenv-1.0.0

初めて端末でpipでコマンドをインストールすると~/.local/bin/にインストールしたけどPATHに入ってないよというWARNINGが出ますが、Ubuntuの場合はこのディレクトリを作った後にログインするとPATHが通されるので問題ありません。sshの場合一回切断して再度ログインするとPATHが通ります。 というわけでdocker-compose.ymlのあるディレクトリに移動して正しくコンテナが起動するか試してみます。

docker-compose用準備

こんなディレクトリ構成でファイルを格納します。

/home/hogehoge/podmancompose/nginx-home/
├── default.conf
└── docker-compose.yml

docker-compose.ymlを作る

version: "3"
services:
  nginx:
    image: docker.io/library/nginx:stable
    container_name: nginx-home
    ports:
      - "28080:80"
    restart: unless-stopped
    volumes:
      - ./default.conf:/etc/nginx/conf.d/default.conf
      - /home/hogehoge:/usr/share/nginx/html

以前の記事から変更しているのは4箇所です。

  • imageを「nginx:stable」から「docker.io/library/nginx:stable」にdockerhubのホスト名を含めるように変更
  • container_nameを「nginx00」から「nginx-home」に変更(わかりやすさ重視)
  • 開放する物理ポート番号を8080から28080に変更(他のコンテナで使うので)
  • volumes行を「/mnt/usbhdd1/var/docker-nginx:/usr/share/nginx/html」から「/home/hogehoge:/usr/share/nginx/html」に変更(ホームディレクトリをドキュメントルートとして読ませる)

default.confを作る

以下の内容でdefault.confを作ります。

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

以前の記事からの変更はなく、index.htmlがない場合にディレクトリリストを表示するという設定です。

podman-composeの実行→バグを踏むので対応

docker-compose.ymlのある場所に移動してpodman-composeを実行します。

$ podman-compose up
podman-compose version: 1.0.6
['podman', '--version', '']
using podman version: 3.4.4
** excluding:  set()
['podman', 'ps', '--filter', 'label=io.podman.compose.project=nginx-home', '-a', '--format', '{{ index .Labels "io.podman.compose.config-hash"}}']
['podman', 'network', 'exists', 'nginx-home_default']
['podman', 'network', 'create', '--label', 'io.podman.compose.project=nginx-home', '--label', 'com.docker.compose.project=nginx-home', 'nginx-home_default']
['podman', 'network', 'exists', 'nginx-home_default']
WARN[0000] Error validating CNI config file /home/hogehoge/.config/cni/net.d/nginx-home_default.conflist: [plugin bridge does not support config version "1.0.0" plugin portmap does not support config version "1.0.0" plugin firewall does not support config version "1.0.0" plugin tuning does not support config version "1.0.0"] 
podman create --name=nginx-home --label io.podman.compose.config-hash=8c142fa5cc4ecfb2b623dcc0b2ed58a8665b3a480717144a094e1f4a8f947f05 --label io.podman.compose.project=nginx-home --label io.podman.compose.version=1.0.6 --label PODMAN_SYSTEMD_UNIT=podman-compose@nginx-home.service --label com.docker.compose.project=nginx-home --label com.docker.compose.project.working_dir=/home/hogehoge/podmancompose/nginx-home --label com.docker.compose.project.config_files=docker-compose.yml --label com.docker.compose.container-number=1 --label com.docker.compose.service=nginx -v /home/hogehoge/podmancompose/nginx-home/default.conf:/etc/nginx/conf.d/default.conf -v /home/hogehoge:/usr/share/nginx/html --net nginx-home_default --network-alias nginx -p 28080:80 --restart unless-stopped docker.io/library/nginx:stable
WARN[0000] Error validating CNI config file /home/hogehoge/.config/cni/net.d/nginx-home_default.conflist: [plugin bridge does not support config version "1.0.0" plugin portmap does not support config version "1.0.0" plugin firewall does not support config version "1.0.0" plugin tuning does not support config version "1.0.0"] 
Trying to pull docker.io/library/nginx:stable...
Getting image source signatures
Copying blob d5cb97591f78 done  
Copying blob f813ca0a2a69 done  
Copying blob 50eb042e2421 done  
Copying blob 49517beb8043 done  
Copying blob 3f2dadcfad7b done  
Copying blob d1ec037414f8 done  
Copying config 72b215b5ab done  
Writing manifest to image destination
Storing signatures
5234a3336ac97b56b56c7663a25fc3a110b982128c3d02fcbd0c784cfa53f755
exit code: 0
podman start -a nginx-home
WARN[0000] Error validating CNI config file /home/hogehoge/.config/cni/net.d/nginx-home_default.conflist: [plugin bridge does not support config version "1.0.0" plugin portmap does not support config version "1.0.0" plugin firewall does not support config version "1.0.0" plugin tuning does not support config version "1.0.0"] 
WARN[0000] Error validating CNI config file /home/hogehoge/.config/cni/net.d/nginx-home_default.conflist: [plugin bridge does not support config version "1.0.0" plugin portmap does not support config version "1.0.0" plugin firewall does not support config version "1.0.0" plugin tuning does not support config version "1.0.0"] 
ERRO[0000] error loading cached network config: network "nginx-home_default" not found in CNI cache 
WARN[0000] falling back to loading from existing plugins on disk 
WARN[0000] Error validating CNI config file /home/hogehoge/.config/cni/net.d/nginx-home_default.conflist: [plugin bridge does not support config version "1.0.0" plugin portmap does not support config version "1.0.0" plugin firewall does not support config version "1.0.0" plugin tuning does not support config version "1.0.0"] 
ERRO[0000] Error tearing down partially created network namespace for container 5234a3336ac97b56b56c7663a25fc3a110b982128c3d02fcbd0c784cfa53f755: CNI network "nginx-home_default" not found 
Error: unable to start container 5234a3336ac97b56b56c7663a25fc3a110b982128c3d02fcbd0c784cfa53f755: error configuring network namespace for container 5234a3336ac97b56b56c7663a25fc3a110b982128c3d02fcbd0c784cfa53f755: CNI network "nginx-home_default" not found
exit code: 125

既知のバグで、Ubuntu 22.04のlibpodがバグっているそうです。

Bug #2024394 “Ubuntu 22.04.1 LTS libpod (package podman 3.4.4+ds…” : Bugs : libpod package : Ubuntu

Ubuntu 22.04環境ではcontainernetworking-pluginsのバージョンが古いらしいので、とりあえず現時点で一番タイムスタンプの新しいパッケージを持ってきてインストールします。 http://ports.ubuntu.com/ubuntu-ports/pool/universe/g/golang-github-containernetworking-plugins/

$ wget http://ports.ubuntu.com/ubuntu-ports/pool/universe/g/golang-github-containernetworking-plugins/containernetworking-plugins_1.1.1+ds1-1ubuntu0.22.10.1_arm64.deb
$ sudo apt install ./containernetworking-plugins_1.1.1+ds1-1ubuntu0.22.10.1_arm64.deb 

もう一度実行します。

$ podman-compose up
podman-compose version: 1.0.6
['podman', '--version', '']
using podman version: 3.4.4
** excluding:  set()
['podman', 'ps', '--filter', 'label=io.podman.compose.project=nginx-home', '-a', '--format', '{{ index .Labels "io.podman.compose.config-hash"}}']
['podman', 'network', 'exists', 'nginx-home_default']
podman create --name=nginx-home --label io.podman.compose.config-hash=8c142fa5cc4ecfb2b623dcc0b2ed58a8665b3a480717144a094e1f4a8f947f05 --label io.podman.compose.project=nginx-home --label io.podman.compose.version=1.0.6 --label PODMAN_SYSTEMD_UNIT=podman-compose@nginx-home.service --label com.docker.compose.project=nginx-home --label com.docker.compose.project.working_dir=/home/hogehoge/podmancompose/nginx-home --label com.docker.compose.project.config_files=docker-compose.yml --label com.docker.compose.container-number=1 --label com.docker.compose.service=nginx -v /home/hogehoge/podmancompose/nginx-home/default.conf:/etc/nginx/conf.d/default.conf -v /home/hogehoge:/usr/share/nginx/html --net nginx-home_default --network-alias nginx -p 28080:80 --restart unless-stopped docker.io/library/nginx:stable
Error: error creating container storage: the container name "nginx-home" is already in use by "5234a3336ac97b56b56c7663a25fc3a110b982128c3d02fcbd0c784cfa53f755". You have to remove that container to be able to reuse that name.: that name is already in use
exit code: 125
podman start -a nginx-home
[nginx] | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
[nginx] | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
[nginx] | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
[nginx] | 10-listen-on-ipv6-by-default.sh: info: IPv6 listen already enabled
[nginx] | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
[nginx] | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
[nginx] | /docker-entrypoint.sh: Configuration complete; ready for start up
2023/07/22 09:13:13 [notice] 1#1: using the "epoll" event method
2023/07/22 09:13:13 [notice] 1#1: nginx/1.24.0
2023/07/22 09:13:13 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) 
2023/07/22 09:13:13 [notice] 1#1: OS: Linux 5.10.160-rockchip
2023/07/22 09:13:13 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2023/07/22 09:13:13 [notice] 1#1: start worker processes
2023/07/22 09:13:13 [notice] 1#1: start worker process 17
2023/07/22 09:13:13 [notice] 1#1: start worker process 18
2023/07/22 09:13:13 [notice] 1#1: start worker process 19
2023/07/22 09:13:13 [notice] 1#1: start worker process 20
2023/07/22 09:13:13 [notice] 1#1: start worker process 21
2023/07/22 09:13:13 [notice] 1#1: start worker process 22
2023/07/22 09:13:13 [notice] 1#1: start worker process 23
2023/07/22 09:13:13 [notice] 1#1: start worker process 24

コンテナは上がったので、この状態からブラウザで http://192.168.1.106:28080/ にアクセスすると403 Forbidden。コンテナ側のログは

[nginx] | 10.89.0.2 - - [22/Jul/2023:09:14:46 +0000] "GET / HTTP/1.1" 403 555 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" "-"
2023/07/22 09:14:46 [error] 17#17: *1 "/usr/share/nginx/html/index.html" is forbidden (13: Permission denied), client: 10.89.0.2, server: localhost, request: "GET / HTTP/1.1", host: "192.168.1.106:28080"
2023/07/22 09:14:46 [error] 17#17: *1 open() "/usr/share/nginx/html/favicon.ico" failed (13: Permission denied), client: 10.89.0.2, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.1.106:28080", referrer: "http://192.168.1.106:28080/"
[nginx] | 10.89.0.2 - - [22/Jul/2023:09:14:46 +0000] "GET /favicon.ico HTTP/1.1" 403 555 "http://192.168.1.106:28080/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" "-"

一旦Ctrl+cでコンテナ止めてpodman-compose down

暫定でセキュリティガバガバに

セキュリティ上おすすめしませんが、今回は一般ユーザーのホームディレクトリを読み込みだけできるように。

$ chmod o+rx /home/hogehoge

やり直し→確認

[nginx] | 10.89.0.2 - - [22/Jul/2023:09:35:51 +0000] "GET / HTTP/1.1" 200 654 "http://192.168.1.106:28080/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" "-"

無事にブラウザからHTTPサーバーの構築を確認できました。

Systemdユニットファイル生成

podman-composeでpodmanコンテナを起動した状態にします。

$ podman-compose ps
podman-compose version: 1.0.6
['podman', '--version', '']
using podman version: 3.4.4
podman ps -a --filter label=io.podman.compose.project=nginx-home
CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS            PORTS                  NAMES
4e788a4577b9  docker.io/library/nginx:stable  nginx -g daemon o...  7 minutes ago  Up 7 minutes ago  0.0.0.0:28080->80/tcp  nginx-home
exit code: 0

podman generate systemdコマンドでユニットファイルを生成します。このサブコマンドは--newを付ける場合と付けない場合で違いがあります。

–newありのsystemdユニットファイル生成

--name引数の後にユニットファイル名を指定します。まずは--newあり。

$ podman generate systemd --new --files --name nginx-home
/home/hogehoge/podmancompose/nginx-home/container-nginx-home.service

中身はこうなっています。

# container-nginx-home.service
# autogenerated by Podman 3.4.4
# Sat Aug 19 12:54:05 JST 2023

[Unit]
Description=Podman container-nginx-home.service
Documentation=man:podman-generate-systemd(1)
Wants=network-online.target
After=network-online.target
RequiresMountsFor=%t/containers

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=always
TimeoutStopSec=70
ExecStartPre=/bin/rm -f %t/%n.ctr-id
ExecStart=/usr/bin/podman run --cidfile=%t/%n.ctr-id --cgroups=no-conmon --rm --sdnotify=conmon --replace --name=nginx-home -d --label io.podman.compose.config-hash=8c142fa5cc4ecfb2b623dcc0b2ed58a8665b3a480717144a094e1f4a8f947f05 --label io.podman.compose.project=nginx-home --label io.podman.compose.version=1.0.6 --label PODMAN_SYSTEMD_UNIT=podman-compose@nginx-home.service --label com.docker.compose.project=nginx-home --label com.docker.compose.project.working_dir=/home/hogehoge/podmancompose/nginx-home --label com.docker.compose.project.config_files=docker-compose.yml --label com.docker.compose.container-number=1 --label com.docker.compose.service=nginx -v /home/hogehoge/podmancompose/nginx-home/default.conf:/etc/nginx/conf.d/default.conf -v /home/hogehoge:/usr/share/nginx/html --net nginx-home_default --network-alias nginx -p 28080:80 docker.io/library/nginx:stable
ExecStop=/usr/bin/podman stop --ignore --cidfile=%t/%n.ctr-id
ExecStopPost=/usr/bin/podman rm -f --ignore --cidfile=%t/%n.ctr-id
Type=notify
NotifyAccess=all

[Install]
WantedBy=default.target

–newなしのsystemdユニットファイル生成

今度は--newなし。

$ podman generate systemd --files --name nginx-home
/home/hogehoge/podmancompose/nginx-home/container-nginx-home.service

生成されたファイルはこれ。

# container-nginx-home.service
# autogenerated by Podman 3.4.4
# Sat Aug 19 13:02:41 JST 2023

[Unit]
Description=Podman container-nginx-home.service
Documentation=man:podman-generate-systemd(1)
Wants=network-online.target
After=network-online.target
RequiresMountsFor=/run/user/1001

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=on-failure
TimeoutStopSec=70
ExecStart=/usr/bin/podman start nginx-home
ExecStop=/usr/bin/podman stop -t 10 nginx-home
ExecStopPost=/usr/bin/podman stop -t 10 nginx-home
PIDFile=/run/user/1001/overlay-containers/4e788a4577b9fac5c6de2298c61e6f81ffe90dcfc3dffde76fdf9f1b6620f8cd/userdata/conmon.pid
Type=forking

[Install]
WantedBy=default.target

–newの有無での違い

パッと見で長い短いの違いはありますが、それ以外にExecStart・ExecStopを見ると

  • --newありだとpodman run / rm、なしだとpodman start / stop相当の操作になる
  • docker-compose up -ddocker-compose downの代わりとして使うなら--newは付けた方が良さそう

という感想を持ちました(個人の感想です)

また、--newなしで生成した方のファイルのPIDFileに書かれているディレクトリはコンテナIDなので、start stopを繰り返すだけでは変わりませんがrun rmの度に変わります。イメージに変更がなければその運用もできますが、イメージが更新されてpodman-compose pullをした場合には元のコンテナが使えなくなるので必然的にユニットファイルの更新が必要となり、結果--newなしは無理なのではと思います。

Systemdユニットファイル登録・起動

生成したSystemdのユニットファイルを~/.config/systemd/user/に移動します。

$ mkdir -p ~/.config/systemd/user/
$ mv container-nginx-home.service ~/.config/systemd/user/

systemdに登録します。

$ systemctl --user enable container-nginx-home.service 
Created symlink /home/hogehoge/.config/systemd/user/default.target.wants/container-nginx-home.service → /home/hogehoge/.config/systemd/user/container-nginx-home.service.
$ systemctl --user start container-nginx-home.service 
$ systemctl --user status container-nginx-home.service 
● container-nginx-home.service - Podman container-nginx-home.service
     Loaded: loaded (/home/hogehoge/.config/systemd/user/container-nginx-home.s>
     Active: active (running) since Sat 2023-08-19 14:09:24 JST; 44s ago
       Docs: man:podman-generate-systemd(1)
    Process: 8718 ExecStartPre=/bin/rm -f /run/user/1001/container-nginx-home.s>
   Main PID: 9242 (conmon)
     CGroup: /user.slice/user-1001.slice/user@1001.service/app.slice/container->
             ├─9115 /usr/bin/fuse-overlayfs -o ,lowerdir=/var/containers/storag>
             ├─9117 /usr/bin/slirp4netns --disable-host-loopback --mtu=65520 -->
             ├─9217 /usr/sbin/dnsmasq -u root --conf-file=/run/user/1001/contai>
             ├─9218 containers-rootlessport
             ├─9230 containers-rootlessport-child
             ├─9242 /usr/bin/conmon --api-version 1 -c 0838de8d29ed928058d2c8ee>
             ├─9245 "nginx: master process nginx -g daemon off;"
             ├─9262 "nginx: worker process"
             ├─9263 "nginx: worker process"
             ├─9264 "nginx: worker process"
             ├─9265 "nginx: worker process"
             ├─9266 "nginx: worker process"
             ├─9267 "nginx: worker process"
             ├─9268 "nginx: worker process"
             └─9269 "nginx: worker process"

Aug 19 14:09:24 ubuntu conmon[9242]: 2023/08/19 05:09:24 [notice] 1#1: getrlimi>
Aug 19 14:09:24 ubuntu conmon[9242]: 2023/08/19 05:09:24 [notice] 1#1: start wo>
Aug 19 14:09:24 ubuntu conmon[9242]: 2023/08/19 05:09:24 [notice] 1#1: start wo>
Aug 19 14:09:24 ubuntu conmon[9242]: 2023/08/19 05:09:24 [notice] 1#1: start wo>
Aug 19 14:09:24 ubuntu conmon[9242]: 2023/08/19 05:09:24 [notice] 1#1: start wo>
Aug 19 14:09:24 ubuntu conmon[9242]: 2023/08/19 05:09:24 [notice] 1#1: start wo>
Aug 19 14:09:24 ubuntu conmon[9242]: 2023/08/19 05:09:24 [notice] 1#1: start wo>
Aug 19 14:09:24 ubuntu conmon[9242]: 2023/08/19 05:09:24 [notice] 1#1: start wo>
Aug 19 14:09:25 ubuntu conmon[9242]: 2023/08/19 05:09:24 [notice] 1#1: start wo>
Aug 19 14:09:25 ubuntu conmon[9242]: 2023/08/19 05:09:24 [notice] 1#1: start wo>

これでもうNginxコンテナはsystemdで管理されることになったので、起動している方のNginxは落としましょう。systemd側では落としてもsystemdでは上がってなければ起動、落ちたら再度起動となり、別のコンテナIDで勝手に起動します。

$ podman-compose down
podman-compose version: 1.0.6
['podman', '--version', '']
using podman version: 3.4.4
** excluding:  set()
podman stop -t 10 nginx-home
nginx-home
exit code: 0
podman rm nginx-home
Error: no container with name or ID "nginx-home" found: no such container
exit code: 1
$ podman-compose ps
podman-compose version: 1.0.6
['podman', '--version', '']
using podman version: 3.4.4
podman ps -a --filter label=io.podman.compose.project=nginx-home
CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS            PORTS                  NAMES
bc0af30e325f  docker.io/library/nginx:stable  nginx -g daemon o...  6 seconds ago  Up 7 seconds ago  0.0.0.0:28080->80/tcp  nginx-home
exit code: 0

これでOSの再起動をしても最初からpodmanコンテナが起動するようになります。

Nginxイメージの更新

実行しているコンテナのイメージが更新された場合は、docker-compose.ymlのあるディレクトリでpodman-compose pullで更新します。

$ podman-compose pull
podman-compose version: 1.0.6
['podman', '--version', '']
using podman version: 3.4.4
podman pull docker.io/library/nginx:stable
Trying to pull docker.io/library/nginx:stable...
Getting image source signatures
Copying blob 41f92d5a73b9 done  
Copying blob c467aa040164 done  
Copying blob d31b23c6eaa8 done  
Copying blob fb44128000d3 done  
Copying blob 4f91fc58fb1d done  
Copying blob 7c0bc23811c5 done  
Copying config 2f36e38369 done  
Writing manifest to image destination
Storing signatures
2f36e38369656b647cecbc29bb408766c86279381bbb17fa9786ec6537f52ebf
exit code: 0

Systemdで実行しているコンテナを再起動します。

$ systemctl --user restart container-nginx-home.service 

更新されたことがわかるログ等があればそこで確認可能です。(Nginxの場合は見当たりませんでした)

podman-composeからSystemdへの運用変更

当初podman-composeでコンテナを実行していた時は当然podman-composeコマンドでコンテナを実行したわけですが、既にSystemdでの運用に変わっているため、これからはSystemdでコンテナの実行を制御します。

  • コンテナの起動→systemctl --user start ユニットファイル名
  • コンテナの終了→systemctl --user stop ユニットファイル名
  • コンテナの有効化→systemctl --user enable ユニットファイル名
  • コンテナの無効化→systemctl --user disable ユニットファイル名
  • コンテナのsystemdへの登録→mv ユニットファイル名 ~/.config/systemd/user/ systemctl --user enable ユニットファイル名
  • コンテナのsystemdからの削除→systemctl --user disable ユニットファイル名 mv ~/.config/systemd/user/ユニットファイル名 どこか(または削除)

スポンサーリンク


  1. docker-composeをpodmanのUNIXドメインソケットに送ることでも実行できますが、今回は元からDockerもdocker-composeもインストールしてないのでpodman-composeを使います。 [return]

comments powered by Disqus