システムの起動時にdockerコンテナを自動起動するにはどうすればよいですか?


113

システムの起動時にdockerコンテナを自動的に起動する良い方法は何ですか?

Ubuntu 14.04でこれを行う好ましい方法はありますか?

supervisord過去にWebアプリの自動起動に使用しました。しかし、それはDockerにとって正しいことではありません。

回答:


136

どうやら、(Docker 1.2から)Dockerコンテナを自動起動する現在の方法は、再起動ポリシーを使用することです。これにより、Dockerが起動時にコンテナを起動し、終了時にコンテナを再起動する方法を制御します。これまで「常に」オプションを使用しましたが、システム起動時にDockerがコンテナーを自動起動することを確認できます。

sudo docker run --restart=always -d myimage

ドキュメントの抜粋

再起動ポリシーDocker実行で--restartフラグを使用すると、終了時にコンテナを再起動するかどうかの再起動ポリシーを指定できます。

no-終了時にコンテナを再起動しません。

on-failure-コンテナがゼロ以外の終了ステータスで終了した場合にのみコンテナを再起動します。

always-終了ステータスに関係なく、常にコンテナを再起動します。

on-failureポリシーを使用するときに、Dockerがコンテナの再起動を試行する最大回数を指定することもできます。デフォルトでは、Dockerはコンテナを再起動しようとします。

$ sudo docker run --restart=always redis

これにより、redisコンテナが常に再起動ポリシーで実行されるため、コンテナが終了するとDockerが再起動します。

$ sudo docker run --restart=on-failure:10 redis

これにより、on-failureの再起動ポリシーと10の最大再起動カウントでredisコンテナーが実行されます。redisコンテナーがゼロ以外の終了ステータスで10回以上連続して終了すると、Dockerはコンテナーの再起動の試行を中止します。最大再起動制限の提供は、障害時ポリシーに対してのみ有効です。


12
「常に-終了ステータスに関係なく常にコンテナを再起動する」は少しわかりにくいです。コンテナを手動で終了/停止しても、コンテナは再起動しません。これは私が探していた動作です。
-w00t

12
注:と呼ばれる別のポリシーunless-stoppedが追加されました。それはのように動作しalwaysますが、コンテナが停止され、システムが再起動されるか、ドッキングウィンドウデーモンが再起動された場合は、コンテナが再起動しません。すべての4つのオプションのの素敵な書き込みアップはこちらを参照してくださいblog.codeship.com/...
デヴィッド・モラレス

4
もちろん、dockerデーモンはこれをサポートするために自動起動する必要があります。
sherrellbc

質問は「システム起動時」、つまり物理または仮想サーバーが再起動した後、サーバーが再起動した後にdockerエンジンが完全に実行されていると仮定した場合のコンテナの自動再起動を意味しますか?
ルートループ

8

Dockerには、upstartとsystemdでそれを行う方法を説明するこのページがあります。Dockerにとって正しいこととは思えないことに同意します。彼らの解決策はdocker start、コンテナをすでに作成していることを前提に実行することです。私はあなたがいずれかを実行したいと思うだろうdocker run --rm、それは、デフォルトでは、あなたは他に何もしません場合は成り上がりのスクリプトで(画像からのブランドの新しいプロセスやコンテナのようにそれを処理する)、あるいは単にドッキングウィンドウデーモンは起動時に、容器自体を再起動してみましょう(と)。Upstartにはプロセスを簡単に開始/停止できるという利点がありますが、Dockerの開始/停止でもそれを実現できます!

upstartスクリプトが機能する前に、ユーザーにコンテナ(すべての正しいポート/ボリュームバインディングを含む)を手動で作成させることは、奇妙だと思います。


リンクが...壊れている。これは、可能性の交換のように思えるが、それは確かに「どのように」は表示されません
ゲルトファンデンベルグ

おかげで、リンクを同様のページに修正しましたが、元のページと同じことを言っているかどうかはわかりません。
ローレンスケステロート

6

しかし、それはDockerにとって正しいこととは思えません。

何故なの?

私はこれにスーパーバイザーを使用して大成功を収めました。

知っていることを使用し、機能するものを使用し、簡単に保守および理解できるものを使用します。


@EEAAに感謝します..それは、それらを非デーモンモードで実行するということですか?それはあなたがそれらを実行する必要があることを意味しません--rmか?
ステファンアレンツ

コンテナをフォアグラウンドモードで実行し、supervisordにstdout / stderrをキャッチさせます。--rmここでなぜ関連するのか分かりません。
EEAA

@EEAAは:あなたの質問について:何人かの人々のために、dockerの代替品であるlxcか、openvz持っているlxc.start.auto = 1vzctl set --onboot yes。また、ESXiおよびその他の仮想化ソリューションには、このような機能が含まれています。Lawrenceのように、Dockerユーザーはすべてのプラットフォームで同じ知識で同じ問題を解決できるはずなので、このような自動起動機能をディストリビューション固有の方法で実装する必要はないと思います。
ダニエルアルダー

1
Dockerは実行中のコンテナーからホストを切り離すのに最適な方法です。そのため、ホスト固有の構成を使用することは少し後戻りです。
-nijave
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.