実行したいDockerコンテナがあるとすると、次のように呼び出すことができます
$ docker run ...
そして、すべてが大丈夫です。システムがクラッシュして再起動した場合に自動的に再起動されるようにコンテナを実行する組み込みの方法はありますか?
もしそうなら、これはDocker Composeでも利用できますか?
回答:
はい、dockerにはこれを処理するような再起動ポリシーdocker run --restart=always
があります。これは、compose.yml構成ファイルでもrestart: always
。として利用できます。
docker run --restart=always crmpicco-mysql
とエラーが発生しました:Unable to find image 'crmpicco-mysql:latest' locally
。
docker run
コマンドは、を介してリストできる画像の名前を想定していますdocker images
。
ログインを実行したユーザーがいない場合でもコンテナを起動する場合(起動するだけで毎回ログインしたくない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/をご覧ください。
docker
して上記のコマンドをdocker-compose
使用して、コマンド-f
ドッキングウィンドウ・コンファイルの場所を指定するためのフラグを:/usr/bin/docker-compose -f /path/to/docker-compose.yml up
docker-compose.yml
は、.env
ファイルを指定する場合は、dockercomposeファイル--project-directory /path/to
を明示的に指定することに加えてを使用します。
[Unit]
呼ばれる便利なディレクティブがあることも興味深いかもしれませんBefore=
。特にデータベース管理システムのようなものを開始するときは、特定の他のサービスの前に開始されていることを確認すると役立つ場合があります。
デフォルトの再起動ポリシーがありますno
。
作成されたコンテナについては、docker update
再起動ポリシーの更新に使用します。
docker update --restart=always 0576df221c0b
0576df221c0b
コンテナIDです。
always
場合でも、コンテナが再起動することを意味し、私はそれを停止?確かに、この種の永続的な起動なしで、再起動時にコンテナを再起動する方法があります...
を使用できます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.
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
ドキュメントからのより「穏やかな」モード:
docker run -dit --restart unless-stopped <image_name>
restart=unless-stopped
オプションは、Dockerエンジンが再起動されたときにコンテナーを起動しようとします。私が見た例外は、Dockerエンジン自体が再起動時に自動的に起動するように構成されていない場合(systemctl status docker
有効になっていることを確認してください)、ネットワークの準備が整う前にエンジンがコンテナーを起動する場合です。これは、オーバーレイネットワークでのみ見たものです。これらの両方も壊れrestart=always
ます。
Windowsで起動時のコンテナの起動を実現したかったのです。
したがって、システムの起動時に起動するスケジュールされたタスクを作成しました。そのタスクは、単に「Docker forWindows.exe」(またはDocker実行可能ファイルの名前)を開始します。
次に、「常に」の再起動ポリシーを持つすべてのコンテナが起動します。
これがcrontabの目的です。
@reboot sleep 10 ; docker start <container name> 2>&1 | /usr/bin/logger -t 'docker start'
ユーザーのcrontabにアクセスしcrontab -e
たりして、それを表示crontab -l
または編集システムのcrontabをで/etc/crontab
次の方法で常に再起動するコンテナを実行できます。
$ 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
再起動ポリシーの完全なリストを表示するには、以下を参照してください。再起動ポリシー
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依存関係が自動的に開始するかどうかを確認するため)。
Systemd
サービスマネージャーとしては、その目的のために最善の解決策の一つであり、より多くのupvotesを必要としています。