(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Docker/RHEL】コンテナをsystemctlで自動起動化する方法

スポンサーリンク

はじめに

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のみを入れているサーバであれば同方法は効果的です。
以上、ご参考になれば幸いです。