Dockerデーモンやコンテナ、コンテナ内のサービスの自動起動方法の解説(Linux版)

Docker公式ロゴ1a
©2023 Docker Inc. All rights reserved

 Docker環境内で「起動」の操作が必要なのは、Dockerデーモン、Dockerコンテナ、及びコンテナ内のサービスアプリが主なものとして挙げられます。

 プライベートなDockerの場合は利用する度に手動で起動するのもアリかもしれませんが、毎日使うという方にとっては面倒な作業になりかねません。

 一般向けの公開サービスとしてDockerを利用される場合は、サーバ起動時に手動で起動するのはシステム運用的に問題になるかもしれないですね。

 本記事では、上で挙げました3つ(Dockerデーモン、Dockerコンテナ、及びコンテナ内のサービスアプリ)の自動起動方法を解説しております。

 お役立てていただければ幸いです。

 尚、本記事の解説で使用するDockerは、Linux(CentOS)版19.03.10です。

Dockerデーモンの自動起動について

 まずは、Dockerデーモンの自動起動について解説します。

 ここでの「自動起動」とは、Dockerホストを起動した際に、人手を介さずにDockerデーモンが起動することです。

 Dockerデーモンは、Linuxではサービスとして登録されていますので、Dockerデーモンの自動起動設定は、各Linuxのサービス管理の仕組みに依存することになります。

 私が調べたところによりますと、Dockerがサポートしている主要なディストリビューション(Ubuntu、Debian、CentOS、OpenSUSE)の最新版のサービス管理は、全てsystemdを採用しておりました。(2020.10現在)

 という訳で、Dockerデーモンの自動起動方法はsystemd方式をご紹介させていただきます。

 といいましても、以下のコマンド1発で設定完了です。

# systemctl enable docker

 システム運用で実際に行う場合は、設定確認や自動起動解除の方法も必要になります。

 設定確認・状態確認は以下のコマンドで行います。

# systemctl status docker

 自動起動解除のコマンドは以下のとおりです。

# systemctl disable docker

 詳しい内容は、お手数ですが、CentOS7へのDockerのインストールの記事に記載しておりますので宜しければご覧いただければと思います。

Dockerコンテナの自動起動について

 次は、Dockerコンテナの自動起動についてです。

 ここでの「自動起動」は、Dockerホストが立ち上がった際に、Dockerデーモンが自動起動されることを前提として、人手を介さずにDockerコンテナが起動することを指します。

 Dockerコンテナを自動起動する方法は、以下の2種類あります。

1.docker runコマンドの「restart」オプションを利用する

 「docker run」コマンドに「--restart」というオプションありまして、Dockerコンテナが何らかの原因で停止した際のふるまいを設定できます。

 例えば、Dockerが異常終了した場合に、自動的に再起動させることが可能です。

 さらに、Dockerホストであるコンピュータをシャットダウンした後で再度Dockerホストを起動してDockerデーモンが立ち上がった場合にも、このオプションの設定は有効です。

 この仕様を利用することで、Dockerコンテナの自動起動が実現できます。

 指定する際は「--restart=xxx」という形式で行い、xxxの部分で、そのコンテナが終了した際の動作を指定することが出来ます。

 xxxの部分の値は以下の4種類あります。

XXX部分説 明
noDockerコンテナが終了しても、自動的には再
起動しない。デフォルト値
on-failure Dockerコンテナが 0以外の終了コードで停止
したら再起動される。オプションで Dockerデー
モンが何度再起動を試みるかを指定可能。
alwaysDockerコンテナの終了コードに拘わらず、常に
再起動される。回数は無制限。
デーモンの起動時にも、Dockerコンテナの状況
にかかわらず常に起動する
unless-stoppedDockerコンテナの終了コードにかかわらず、常
に再起動される。
直近のDockerコンテナが停止状態の場合は、デー
モンの起動時にDockerコンテナを開始しない。
(参考)Docker公式ドキュメント Docker run コマンドリファレンス:再起動ポリシー

 この中の「always」「unless-stopped」がコンテナの自動起動に利用可能です。

 このオプションのどちらかをDockerコンテナ起動時に指定することで、Dockerデーモン起動時に、自動的に対象のDockerコンテナが起動されます。

 2つのオプションの違いは、Dockerホストのシャットダウン時(Dockerデーモン終了時)のDockerコンテナの状態によって動作が異なる点です。

 「unless-stopped」は、Dockerデーモン終了時に停止状態(例えば「docker stop」コマンドにて停止)のコンテナは自動起動されません。

 「always」を指定した場合は、Dockerデーモン終了時のDockerコンテナの状態に関係なく自動起動されます。

 「通常は自動起動させたいけど、場合によっては自動起動させたくないときがある」というような運用時には「unless-stopped」がおすすめです。

2.Dockerホストのsystemdを利用する

 主要なLinuxのサービス管理システムとして利用されているsystemdを使って、Dockerコンテナをサービスとして登録する方法です。

 通常、OS起動時に自動で立ち上げたいサービスをsystemdに登録すると思いますが、同じ方法で、コンテナの起動コマンドをsystemdに登録することにより、コンテナの自動起動を可能にします。

 設定は、自動起動させたいDockerコンテナの起動・停止を行うコマンド「docker start」と「docker stop」をsystemdに登録するだけです。

 本件に関しましては、別記事「dockerのコンテナの自動起動をsystemdにて行う際の注意点について」でまとめておりますので、そちらの記事をご覧ください。

Dockerコンテナ内のサービスの自動起動について

 Dockerコンテナ内で起動するプログラムは、ベースイメージの作成時やDockerコンテナの作成/起動時にオプションとして指定して、Dockerコンテナの起動と同時にDockerにより自動起動されるように設定します。

 また、Dockerコンテナの停止と共にプロセスも停止します。

 プログラムの指定方法は以下の2つの方法があります。

Dockerイメージ作成の際にDockerfile内で指定する方法

 DockerコンテナのベースとなるDockerイメージを作成する際に使用するDockerfile内で、以下のオプションを使用してコンテナで起動するサービスのメインプロセスを指定します。

  • ENTRYPOINT
  • CMD

 例えば、Dockerfile内で以下のような指定を行った場合について説明します。

ENTRYPOINT /bin/program01

 Dockerfileに上の内容を設定してDockerイメージを作成しますと、そのDockerイメージをベースイメージとして起動したDockerコンテナは、起動時に/bin/program01プログラムが自動で起動されることになります。

 CMDの場合も同様です。

Dockerコマンドにてコンテナを作成/起動する際に指定する方法

 Dockerコンテナを作成する場合は「docker create」コマンド、作成と起動を合わせて行う場合は「docker run」コマンドを使用しますが、その両コマンドでコンテナ起動時のプログラムの指定が可能です。

 両コマンド共に、「<コマンド> <オプション> <ベースイメージ> <起動コマンド>」というフォーマットになっていまして、最後の「起動コマンド」の部分がDockerコンテナ起動時のプログラムの指定箇所となってます。

 例えば以下の通りです。

$ docker run -p 80 -d baseimage_name /bin/program02

 この場合、Dockerコンテナ内で「/bin/program02」が自動的に起動されます。

 但し、上のコマンド内で指定しておりますベースイメージ「baseimage_name」の作成時にENTRYPOINTオプションが指定されている場合は、そちらが優先されます。また、CMDオプションが指定されている場合は、docker run(若しくはdocker create)で指定したプログラムの方が優先されます。

 更に、docker run(若しくはdocker create)コマンドに「--entrypoint」オプションがあります。これは、Dockerfile内で指定する「ENTRYPOINT」と同じ意味になりますが、「--entrypoint」オプションで指定した方が優先されます。

おわりに

 自動起動は、システム運用において重要な課題の1つだと思います。

 Dockerは、様々なシステムにフレキシブルな対応が可能となるような自動起動指定ができるように設計されております。

 システム運用に適した方法ご検討ください。

 最後までお読みいただきありがとうございました。

コメント