DockerDocker(Linux版)のカテゴリ別の自動起動テクニックDocker環境内で「起動」が必要なものは、Dockerデーモン、コンテナ、及びコンテナ内のサービスの3カテゴリほどあります。本記事では、それらの自動起動の方法についてカテゴリ別に整理してみました。個人で使うにしても、複数で使うにしても、Dockerで起動が必要なものは、基本的にDockerホスト(→Dockerがインストールされているコンピュータ。仮想マシンも含みます)を起動したら自動的に起動してきて欲しいと思います。逆に、自動起動の方法が解っていれば、自動で起動して欲しくないものを制御することも可能になります。新バージョンのコンテナのテストのために、いつもは自動起動している現行バージョンのコンテナの自動起動を一時的に止めたい、という場合などです。普段何気なくコマンド一発で起動しているコンテナですが、システムの規模が大きくなればなるほど、ユーザの人数が大きくなればなるほど、自動起動はかなり重要なポイントになってくると思います。本記事に登場するDockerは、Linux(CentOS)版でバージョン1.12を前提とさせていただきます。runコマンドの「restart」オプションを利用する2.Dockerホストのsystemdを利用するコンテナ内のサービスの自動起動についてDockerイメージ作成の際にDockerfile内で指定する方法Dockerコマンドにてコンテナを作成/起動する際に指定する方法まとめDockerデーモンの自動起動についてまずは、Dockerの心臓部のDockerデーモンの自動起動についてです。ここでの「自動起動」とは、Dockerホストが立ち上がった際に、人手を介さずにDockerデーモンが起動することを指します。Dockerは、このデーモンが起動していないと全く何も出来ませんので、通常は自動起動する設定で良いと思います。Linuxには多くのディストリビューションがあり、Dockerもそのほとんどをサポートしてます。Dockerデーモンは、Linuxではサービスとして登録されておりますので、Dockerデーモンの自動起動設定は、各Linuxのサービス管理の仕組みに依存することになります。私が調べたところによりますと、Dockerがサポートしている主要なディストリビューション(Ubuntu、Debian、CentOS、OpenSUSE)の最新版のサービス管理は、全てsystemdを採用しておりました。(2016.9現在)という訳で、Dockerデーモンの自動起動方法はsystemd方式をご紹介させていただきます。いいましても、以下のコマンド1発で設定完了です。dockerシステム運用で実際に行う場合は、設定確認や自動起動解除の方法も必要になります。それらの内容は、お手数ですが、CentOS7へのDockerのインストールの記事に記載しておりますので宜しければご覧いただければと思います。■コンテナの自動起動について次は、コンテナの自動起動についてです。ここでの「自動起動」とは、Dockerホストが立ち上がった際に、Dockerデーモンが自動起動されることを前提として、人手を介さずにコンテナが起動することを指します。コンテナを自動起動できるようにする方法について、以下の2種類をご紹介します。-restart」というオプションあります。このオプションは、コンテナが停止した際に、そのコンテナを自動的に再起動するか否かについての設定を行うためのものです。stop」によって停止させた場合は、このオプションの対象外です。stop」で停止しても、再起動は行われません。指定する際は「--restart=xxx」という形式で行い、xxxの部分で、そのコンテナが終了した際の動作を指定することが出来ます。xxxの部分の値は以下の4種類あります。コンテナが終了しても、自動的には再起動しません。これがデフォルトです。0以外の終了コードで停止したら再起動します。Dockerデーモンが何度再起動を試みるかを指定できます。コンテナの終了コードに拘わらず、常にコンテナの再起動を試みます。Dockerデーモンは無制限に再起動を試みます。デーモンの起動時にも、コンテナの状況に拘わらず常に起動を試みます。コンテナの終了コードに拘わらず、常にコンテナの再起動を試みます。直近のコンテナが停止状態であったのであれば、デーモンの起動時にコンテナを開始しません。※各オプションの動作に関しましては、別途記事を作成する予定です。本記事では自動起動のポイントに絞ってご紹介します。この中の「always」「unless-stopped」がコンテナの自動起動に利用可能です。このオプションのどちらかをコンテナ起動時に指定することで、Dockerデーモン起動時に、自動的に対象のコンテナが起動されます。Dockerデーモン終了時の対象コンテナの状態によって。動作に違いが出てきます。stop」コマンドにて停止)のコンテナは自動起動されません。Dockerデーモン終了時に実行中であったコンテナのみ自動起動されます。「always」を指定した場合は、Dockerデーモン終了時の状態に関係なく自動起動されます。start」コマンドを使用します。start」コマンドを、例えばWindowsでいう「スタートアップに登録」的な方法や「サービス化」的な方法で実行できれば、自動起動が出来そうです。Linuxではsystemdを使うことで実現できます。通常、OS起動時に自動で立ち上げたいサービスをsystemdに登録すると思いますが、同じ方法で、コンテナの起動コマンドをsystemdに登録することにより、コンテナの自動起動を可能にします。本件に関しましては、別記事「dockerのコンテナの自動起動をsystemdにて行う際の注意点について」でまとめておりますので、ご面倒お掛けして申し訳ございませんが、そちらの記事をご覧ください。■コンテナ内のサービスの自動起動について基本的に、コンテナ内で起動するプログラムは、コンテナのベースイメージの作成時やコンテナの作成/起動時にオプションとして指定して、コンテナの起動と同時にDockerにより自動起動されるように設定します。コンテナの停止と共にコンテナ内のプロセスも停止します。プログラムの指定方法は以下の2つの方法があります。Dockerイメージ作成の際にDockerfile内で指定する方法コンテナのベースとなるDockerイメージを作成する際に使用するDockerfile内で、以下のオプションを使用して指定します。ENTRYPOINTCMD例えばDockerfile内で以下のような指定を行った場合について説明します。/bin/pgm01このDockerfileを使用して作成されたDockerイメージをベースイメージとして起動したコンテナは、起動時に/bin/pgm01プログラムが自動で起動されます。CMDの場合も同様です。※実は、ENTRYPOINTとCMDは、目的は似てますが、異なる動きをします。詳細は別記事に記載予定です。run」コマンドを使用しますが、その両コマンドで、コンテナ起動時のプログラムの指定が可能です。<起動コマンド>」というフォーマットになっていますが、最後の「起動コマンド」の部分が、コンテナ起動時のプログラムの指定となってます。/bin/pgm02この場合、コンテナ内で「/bin/pgm02」が自動的に起動されます。上のコマンド内で指定しておりますベースイメージ「baseimage_name」の作成時にENTRYPOINTオプションが指定されている場合は、そちらが優先されます。create)で指定したプログラムの方が優先されます。create)コマンドに「--entrypoint」オプションがあります。-entrypoint」オプションで指定した方が優先されます。create)コマンドの一番後でも、コンテナ内で自動起動させたいプログラムを指定可能ということです。■まとめシステム運用において、自動起動は重要な課題の1つだと思います。Dockerは、様々なシステムにフレキシブルな対応が可能となるような自動起動指定ができるように設計されております。高性能で高機能な外部のコンテナ管理ツールを利用すれば、もっと便利で多彩な自動起動が可能になるのかもしれません。いっても、現時点でのDockerでも、条件はありますが、十分に実用的な自動起動ができると思います。私の意見としましては、systemdの機能をDocker内に組み込んで頂けたらなあって思います。最後までお読みいただきありがとうございました。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。テニス、作品鑑賞(映画、アニメ、ドラマ、絵画など)、讃岐うどん食べ歩き。コンピュータ業界に身を置く中年おやじです。世の中にはまだ自分が知らない情報があふれていて、知っているつもりでも全体の半分も知らないことがいっぱいあります。見つけた情報はGoogleKeepにメモる毎日です。ある日、自分が良いと思うことは、同じように感じる方も、数は少ないかもしれないけどいるはず、と思いまして、そのことが本サイト「めもたんす」を作るきっかけとなりました。自分がいいなと思ったことを記事にまとめたサイトです。technology.。