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


111

実行したいDockerコンテナがあるとすると、次のように呼び出すことができます

$ docker run ...

そして、すべてが大丈夫です。システムがクラッシュして再起動した場合に自動的に再起動されるようにコンテナを実行する組み込みの方法はありますか?

もしそうなら、これはDocker Composeでも利用できますか?

回答:


132

はい、dockerにはこれを処理するような再起動ポリシーdocker run --restart=alwaysがあります。これは、compose.yml構成ファイルでrestart: always。として利用できます


25
これが最初の受け入れられた答えですが、おそらくその機能を検索しているほとんどの人は、コンテナをサービスとして実行したいと思っています。使用@konの答えSystemdサービスマネージャーとしては、その目的のために最善の解決策の一つであり、より多くのupvotesを必要としています。
レミBecheras

1
これは私からはうまくいきませんでした。「crmpicco-mysql」というコンテナがあり、実行するdocker run --restart=always crmpicco-mysqlとエラーが発生しました:Unable to find image 'crmpicco-mysql:latest' locally
crmpicco 2017年

2
あなたのエラーは無関係です。別の質問を投稿することもできますが、Dockerイメージ名とDockerコンテナー名を混同しているようです。このdocker runコマンドは、を介してリストできる画像の名前を想定していますdocker images
Peter Lyons

12
これに関する唯一の問題は、エラーが原因でコンテナが停止したときに、「常に」コンテナが無限に再起動することです(ドキュメントを参照)。デーモン開始時にのみ開始するポリシーがあるはずです
lostiniceland 2017

4
コンテナー/ドッカーの主なセールスポイントの1つは、systemdに各サービスをインストールして管理する必要がないことだと思いました(これは面倒な場合があります)。
マーク

138

ログインを実行したユーザーがいない場合でもコンテナを起動する場合(起動するだけで毎回ログインしたくないVirtualBox VMなど)。Ubuntu 16.04LTSに対して実行した手順は次のとおりです。例として、私はoracledbコンテナをインストールしました。

$ docker pull alexeiled/docker-oracle-xe-11g
$ docker run -d --name=MYPROJECT_oracle_db --shm-size=2g -p 1521:1521 -p 8080:8080 alexeiled/docker-oracle-xe-11g
$ vim /etc/systemd/system/docker-MYPROJECT-oracle_db.service

次のコンテンツを追加します。

[Unit]
Description=Redis container
Requires=docker.service
After=docker.service

[Service]
Restart=always
ExecStart=/usr/bin/docker start -a MYPROJECT_oracle_db
ExecStop=/usr/bin/docker stop -t 2 MYPROJECT_oracle_db

[Install]
WantedBy=default.target

起動時にサービスを有効にします

sudo systemctl enable docker-MYPROJECT-oracle_db.service

詳細については、https://docs.docker.com/engine/admin/host_integration/をご覧ください。


9
ドッキングウィンドウ-コンでこれを行うためにお探しの方のために、あなたは置き換えることができますdockerして上記のコマンドをdocker-compose使用して、コマンド-fドッキングウィンドウ・コンファイルの場所を指定するためのフラグを:/usr/bin/docker-compose -f /path/to/docker-compose.yml up
charlesreid1

1
@ charlesreid1が言ったことに追加するにdocker-compose.ymlは、.envファイルを指定する場合は、dockercomposeファイル--project-directory /path/to 明示的に指定することに加えてを使用ます。
whlteXbread 2018年

1
Dockerには、ログシステムとプロセスマネージャーがあります。適切な再起動ポリシーがないのは残念です。
フランクリンユー

Windows Server 2012でこれを行う方法はありますか?私は、私のログイン...ない限り、ドッキングウィンドウを実行することはできません
アレックス主モルドール

[Unit]呼ばれる便利なディレクティブがあることも興味深いかもしれませんBefore=。特にデータベース管理システムのようなものを開始するときは、特定の他のサービスの前に開始されていることを確認すると役立つ場合があります。
ミカ

90

デフォルトの再起動ポリシーがありますno

作成されたコンテナについては、docker update再起動ポリシーの更新に使用します。

docker update --restart=always 0576df221c0b

0576df221c0b コンテナIDです。


ていないalways場合でも、コンテナが再起動することを意味し、私はそれを停止?確かに、この種の永続的な起動なしで、再起動時にコンテナを再起動する方法があります...
Marc

4
@マーク:いいえ。参照ドキュメントをIf you manually stop a container, its restart policy is ignored until the Docker daemon restarts or the container is manually restarted. This is another attempt to prevent a restart loop.
SaeX

14

を使用できますdocker update --restart=on-failure <container ID or name>

名前が示すことに加えて、on-failure障害時にコンテナを再起動するだけでなく、システムの起動時にも再起動します。

ドキュメントによると、複数の再起動オプションがあります。

Flag            Description
no              Do not automatically restart the container. (the default)
on-failure      Restart the container if it exits due to an error, which manifests as a non-zero exit code.
always          Always restart the container if it stops. If it is manually stopped, it is restarted only when Docker daemon restarts or the container itself is manually restarted. (See the second bullet listed in restart policy details)
unless-stopped  Similar to always, except that when the container is stopped (manually or otherwise), it is not restarted even after Docker daemon restarts.

3
ドキュメントに記載されていないことを考えると、これを発見するのは素晴らしい仕事です。私にとって完璧な解決策。
キャメロンハドソン

すでに実行している別に依存した容器を持っている場合には、故障使用についてのもう一つ注意すべきは、1が起動し、すぐに失敗し、決してOSのブート時に起動するので、「注文を開始」があるようには思えません
FERR

11

1)まず、起動時にDockerサービスを有効にする必要があります

$ sudo systemctl enable docker

2)次に、docker-compose .yml file addがあるrestart: always場合、またはdocker container add restart =を持っている場合は、常に次のようになります。

docker run --restart=always Dockerコンテナを実行します

確認してください

コンテナを手動で停止した場合、Dockerデーモンが再起動するか、コンテナが手動で再起動されるまで、その再起動ポリシーは無視されます。

Dockerの公式ページでこの再起動ポリシーを参照してください

3)docker-composeを開始する場合は、システムを再起動するとすべてのサービスが実行されるため、以下のコマンドを1回だけ実行します。

$ docker-compose up -d

9

ドキュメントからのより「穏やかな」モード:

docker run -dit --restart unless-stopped <image_name>

2
残念ながら、dockerデーモンが再起動によって停止すると、デーモンはコンテナーを「停止」し、コンテナーを停止としてマークします。その後、システムが起動しても、実際にはこれらは起動しません。ばかげている。バグは次のとおり
docker

このrestart=unless-stoppedオプションは、Dockerエンジンが再起動されたときにコンテナーを起動しようとします。私が見た例外は、Dockerエンジン自体が再起動時に自動的に起動するように構成されていない場合(systemctl status docker有効になっていることを確認してください)、ネットワークの準備が整う前にエンジンがコンテナーを起動する場合です。これは、オーバーレイネットワークでのみ見たものです。これらの両方も壊れrestart=alwaysます。
BMitch

2

Windowsで起動時のコンテナの起動を実現したかったのです。

したがって、システムの起動時に起動するスケジュールされたタスクを作成しました。そのタスクは、単に「Docker forWindows.exe」(またはDocker実行可能ファイルの名前)を開始します。

次に、「常に」の再起動ポリシーを持つすべてのコンテナが起動します。


2

これがcrontabの目的です。

@reboot sleep 10 ; docker start <container name> 2>&1 | /usr/bin/logger -t 'docker start'

ユーザーのcrontabにアクセスしcrontab -eたりして、それを表示crontab -lまたは編集システムのcrontabをで/etc/crontab


ドッキングウィンドウのサービスの前にcronサービス開始はどのようなものです...これは、この場合には失敗していました...
アクヒルJalagam

1
@AkhilJalagam私はあなたの問題を理解しているかどうかわかりません。「sleep10」はcrondを起動するのに十分な時間を与え、システムの起動/再起動後にコンテナを起動します。この方法では、開始する前に誰もログインする必要がなく、面倒で複雑なsystemdサービスユニットを回避できます。systemdサービスユニットメソッドは、私の例よりもさらにハックな感じがします。
TravisRunyard19年

2

次の方法で常に再起動するコンテナを実行できます

$ docker run -dit --restart unless-stopped <image name OR image hash>

実行中のコンテナーの構成を変更する場合は、次の方法で更新する必要があります。

$ docker update --restart=<options> <container ID OR name>

また、コンテナの現在のポリシーを確認する場合は、最初に上記の前に次のコマンドを実行します。

docker inspect gateway | grep RestartPolicy -A 3

結局のところ、インストールされたdockerデーモンをシステムの起動時に有効にすることを忘れないでください。

$ systemctl enable docker

再起動ポリシーの完全なリストを表示するには、以下を参照してください。再起動ポリシー


1

Linuxシステムを実行しているときに同様の問題が発生します。システムの起動後、「docker ps」などの何らかの方法でdockerを使用するコマンドを入力しない限り、「unless-stopped」の再起動ポリシーを持つコンテナーは自動的に再起動しませんでした。いくつかのステータス情報を報告するだけのコマンドを期待していたので、私は驚きました。次に、コマンド「systemctlstatusdocker」を試しました。dockerコマンドが実行されていないシステムでは、このコマンドは次のことを報告しました。

● docker.service - Docker Application Container Engine

   Loaded: loaded (/lib/systemd/system/docker.service; disabled; vendor preset: enabled)

     Active: inactive (dead)    TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com

「dockerps」が他のDockerコマンドなしで実行されたシステムでは、次のようになりました。

● docker.service - Docker Application Container Engine
    Loaded: loaded (/lib/systemd/system/docker.service; disabled; vendor preset: enabled)

    Active: active (running) since Sun 2020-11-22 08:33:23 PST; 1h 25min ago

TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com

   Main PID: 3135 (dockerd)
      Tasks: 13

    Memory: 116.9M
     CGroup: /system.slice/docker.service
             └─3135 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
 ... [various messages not shown ]

最も可能性の高い説明は、Dockerがコンテナを完全に初期化して開始する前にdockerコマンドを待機することです。おそらく、コンテナに必要なすべてのサービスが初期化された後の時点で、systemdユニットファイルで「dockerps」を実行できます。docker-onboot.serviceという名前のファイルをディレクトリ/ lib / systemd / systemに置き、次の内容でこれをテストしました。

[Unit]
# This service is provided to force Docker containers
# that should automatically restart to restart when the system
# is booted. While the Docker daemon will start automatically,
# it will not be fully initialized until some Docker command
# is actually run.  This unit merely runs "docker ps": any
# Docker command will result in the Docker daemon completing
# its initialization, at which point all containers that can be
# automatically restarted after booting will be restarted.
#
Description=Docker-Container Startup on Boot
Requires=docker.socket
After=docker.socket network-online.target containerd.service

[Service]
Type=oneshot
ExecStart=/usr/bin/docker ps

[Install]

WantedBy = multi-user.target

これまでのところ(このサービスを有効にした1つのテスト)、コンテナーはコンピューターの起動時に開始されました。dockerコマンドが実行されるまでdocker.serviceが開始されないため、docker.serviceへの依存関係を試しませんでした。次のテストは、docker-onbootを無効にして行います(WantedBy依存関係が自動的に開始するかどうかを確認するため)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.