Docker(Linux版)のカテゴリ別の自動起動テクニック


 Docker環境内で「起動」が必要なものは、Dockerデーモン、コンテナ、及びコンテナ内のサービスの3カテゴリほどあります。本記事では、それらの自動起動の方法についてカテゴリ別に整理してみました。

 個人で使うにしても、複数で使うにしても、Dockerで起動が必要なものは、基本的にDockerホスト(→Dockerがインストールされているコンピュータ。仮想マシンも含みます)を起動したら自動的に起動してきて欲しいと思います。

 また逆に、自動起動の方法が解っていれば、自動で起動して欲しくないものを制御することも可能になります。たとえば、新バージョンのコンテナのテストのために、いつもは自動起動している現行バージョンのコンテナの自動起動を一時的に止めたい、という場合などです。

 普段何気なくコマンド一発で起動しているコンテナですが、システムの規模が大きくなればなるほど、ユーザの人数が大きくなればなるほど、自動起動はかなり重要なポイントになってくると思います。

 尚、本記事に登場するDockerは、Linux(CentOS)版でバージョン1.12を前提とさせていただきます。申し訳ございません。

 

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

 まずは、Dockerの心臓部のDockerデーモンの自動起動についてです。

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

 Dockerは、このデーモンが起動していないと全く何も出来ませんので、通常は自動起動する設定で良いと思います。

 Linuxには多くのディストリビューションがあり、Dockerもそのほとんどをサポートしてます。Dockerデーモンは、Linuxではサービスとして登録されておりますので、Dockerデーモンの自動起動設定は、各Linuxのサービス管理の仕組みに依存することになります。

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

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

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

# systemctl enable docker

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

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

■ 本記事の目次に戻る ■

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

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

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

 コンテナを自動起動できるようにする方法について、以下の2種類をご紹介します。

 

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

 「docker run」コマンドに「- -restart」というオプションあります。

 このオプションは、コンテナが停止した際に、そのコンテナを自動的に再起動するか否かについての設定を行うためのものです。

 但し、コンテナを停止するコマンド「docker stop」によって停止させた場合は、このオプションの対象外です。つまり、restartオプションを設定したコンテナを「docker stop」で停止しても、再起動は行われません。

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

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

xxx部分 説明
no コンテナが終了しても、自動的には再起動
しません。これがデフォルトです。
on-failure

コンテナが 0以外の終了コードで停止し
たら再起動します。オプションで Docker
デーモンが何度再起動を試みるかを指定で
きます。

always コンテナの終了コードに拘わらず、常にコ
ンテナの再起動を試みます。Dockerデー
モンは無制限に再起動を試みます。
また、デーモンの起動時にも、コンテナの
状況に拘わらず常に起動を試みます。
unless-stopped コンテナの終了コードに拘わらず、常にコ
ンテナの再起動を試みます。しかし、直近
のコンテナが停止状態であったのであれば、
デーモンの起動時にコンテナを開始しません。

(参考)Docker公式ドキュメント Docker run リファレンス:再起動ポリシー

※各オプションの動作に関しましては、別途記事を作成する予定です。本記事では自動起動のポイントに絞ってご紹介します。

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

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

 なのですが、Dockerデーモン終了時の対象コンテナの状態によって。動作に違いが出てきます。

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

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

■ 本記事の目次に戻る ■

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

 「docker create」や「docker run」などのコマンドで作成されたコンテナを手動で起動するには、「docker start」コマンドを使用します。

 よって、「docker start」コマンドを、例えばWindowsでいう「スタートアップに登録」的な方法や「サービス化」的な方法で実行できれば、自動起動が出来そうです。

 Linuxではsystemdを使うことで実現できます。

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

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

■ 本記事の目次に戻る ■

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

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

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

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

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

  • ENTRYPOINT
  • CMD

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

ENTRYPOINT /bin/pgm01

 このDockerfileを使用して作成されたDockerイメージをベースイメージとして起動したコンテナは、起動時に/bin/pgm01プログラムが自動で起動されます。CMDの場合も同様です。

※実は、ENTRYPOINTとCMDは、目的は似てますが、異なる動きをします。詳細は別記事に記載予定です。

■ 本記事の目次に戻る ■

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

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

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

 例えば以下の通りです。

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

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

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

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

 色々書きましたが、結局のところ、docker run(若しくはdocker create)コマンドの一番後でも、コンテナ内で自動起動させたいプログラムを指定可能ということです。

■ 本記事の目次に戻る ■

まとめ

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

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

 でも、高性能で高機能な外部のコンテナ管理ツールを利用すれば、もっと便利で多彩な自動起動が可能になるのかもしれません。

 とはいっても、現時点でのDockerでも、条件はありますが、十分に実用的な自動起動ができると思います。

 私の意見としましては、systemdの機能をDocker内に組み込んで頂けたらなあって思います。

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

■ 本記事の目次に戻る ■


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です