はじめに
Podmanではpodman generate systemd
でsystemdユニットファイルを生成ができますが、同じようにdockerでも手動でファイルを作成すればsystemctlでコンテナを操作できます。
本記事ではRHELにて特定コンテナを自動起動するための手順をメモしました。尚、ユーザはrootで実行しています。
環境情報
- Docker 18.09
- Red Hat Enterprise Linux Server 7.5
事前確認
docker.serviceが動いていることを以下コマンドで確認し
# systemctl status docker ▒▒ docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled) Active: active (running) since xx ...
自動起動する対象として以下のコンテナを作成します。
# docker run -d -it --name="draw" -p 8888:8080 fjudith/draw.io:latest
確かに起動していることが確認できます。
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES XX fjudith/draw.io:latest "/docker-entrypoint.▒c" 10 days ago Up 10 days 8443/tcp, 0.0.0.0:8888->8080/tcp draw
一度起動すれば以下のように--name
で指定した値で落とし上げが可能です。
# docker stop draw draw # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
systemd用ファイルを用意する
/etc/systemd/system
に保管されているファイル群を参考に以下のようなテキストファイルをdraw-container.serviceという名前で用意します。
[Unit] Description=Docker my-container.service Wants=docker.service After=docker.service [Service] Restart=on-failure ExecStart=/usr/bin/docker start -a draw ExecStop=/usr/bin/docker stop -t 10 draw ExecStopPost=/usr/bin/docker stop -t 10 draw KillMode=none [Install] WantedBy=multi-user.target default.target
このファイルを以下のようにenableで指定すればInstallで指定したtargetにリンクができて
# systemctl enable /etc/systemd/system/draw-container.service Created symlink from /etc/systemd/system/multi-user.target.wants/draw-container.service to /etc/systemd/system/draw-container.service. Created symlink from /etc/systemd/system/default.target.wants/draw-container.service to /etc/systemd/system/draw-container.service.
ステータスを確認できるようになります。
# systemctl status draw-container.service ▒▒ draw-container.service - Docker my-container.service Loaded: loaded (/etc/systemd/system/draw-container.service; enabled; vendor preset: disabled) Active: inactive (dead)
自動起動させる
念のため手動で起動停止の確認を行います。
# systemctl start draw-container.service # systemctl status draw-container.service ▒▒ draw-container.service - Docker my-container.service Loaded: loaded (/etc/systemd/system/draw-container.service; enabled; vendor preset: disabled) Active: active (running) since XX Main PID: 29604 (docker) Tasks: 7 Memory: 21.6M CGroup: /system.slice/draw-container.service mq29604 /usr/bin/docker start -a draw ...
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES xx fjudith/draw.io:latest "/docker-entrypoint.▒c" 10 days ago Up 10 seconds 8443/tcp, 0.0.0.0:8888->8080/tcp draw
# systemctl stop draw-container.service # systemctl status draw-container.service ▒▒ draw-container.service - Docker my-container.service Loaded: loaded (/etc/systemd/system/draw-container.service; enabled; vendor preset: disabled) Active: failed (Result: exit-code) since xx Process: 29825 ExecStopPost=/usr/bin/docker stop -t 10 draw (code=exited, status=0/SUCCESS) Process: 29776 ExecStop=/usr/bin/docker stop -t 10 draw (code=exited, status=0/SUCCESS) Process: 29604 ExecStart=/usr/bin/docker start -a draw (code=exited, status=143) Main PID: 29604 (code=exited, status=143)
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
最後に自動起動するために以下を行えば
# systemctl enable draw-container.service
リブート後に自動的に同コンテナが起動しています。
終わりに
一般的にはKubernetesを利用してコンテナ群は管理しますが、Dockerのみを入れているサーバであれば同方法は効果的です。
以上、ご参考になれば幸いです。