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のユニットファイルを生成する機能を内包していて、ある程度の雛形は生成してくれます。
ということで、以下の順序で作業をします。
- docker-compose.ymlを作る
- podman-composeでpodmanコンテナとして実行を確認
- podmanでsystemdのユニットファイルを生成
- 生成したユニットファイルを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 -d
とdocker-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/ユニットファイル名 どこか(または削除)
スポンサーリンク
- docker-composeをpodmanのUNIXドメインソケットに送ることでも実行できますが、今回は元からDockerもdocker-composeもインストールしてないのでpodman-composeを使います。 [return]
comments powered by Disqus