はじめに
この実験では、docker restartコマンドを使用して Docker コンテナを効果的に管理する方法を学びます。まず、実行中のコンテナを再起動する基本的なプロセスから始めます。これは変更を適用したり問題を解決したりするための基本的な操作です。
さらに、より高度な再起動オプションについて探求します。これには、再起動プロセスにカスタムタイムアウトを指定する方法が含まれ、Docker がコンテナを強制終了する前に正常に停止するのを待つ時間を制御できます。最後に、特定のシグナルを使用してコンテナを再起動する方法を学び、再起動時のコンテナのシャットダウン動作を詳細に制御できるようになります。
実行中のコンテナを再起動
このステップでは、実行中の Docker コンテナを再起動する方法を学びます。コンテナの再起動は、設定変更を適用したり、問題を修正したり、単にコンテナの状態をリフレッシュする必要がある場合によく行われる操作です。
まず、例として使用するシンプルな Nginx イメージをプルします。nginx:latestイメージを使用します。
docker pull nginx:latest
イメージがプルされ、展開されることを示す出力が表示されるはずです。
次に、このイメージを基にコンテナを実行します。バックグラウンドで実行するためにデタッチモード (-d) で実行し、名前 (--name my-nginx) を割り当てます。
docker run -d --name my-nginx nginx:latest
このコマンドは Nginx コンテナを起動し、そのコンテナ ID を表示します。
コンテナが実行中であることを確認するには、docker psコマンドを使用します。
docker ps
my-nginxコンテナがUpというステータスでリストされているのが確認できるはずです。
では、docker restartコマンドに続けてコンテナ名を指定して、実行中のコンテナを再起動しましょう。
docker restart my-nginx
このコマンドはコンテナを停止し、再度起動します。
コンテナが再起動され、再度実行中であることを確認するには、もう一度docker psを使用します。
docker ps
my-nginxコンテナが再びリストされ、STATUS列には最近起動されたことを示す時間とともにUpと表示されるはずです。
タイムアウト指定でコンテナを再起動
このステップでは、特定のタイムアウトを指定して Docker コンテナを再起動する方法を学びます。コンテナを再起動する際、Docker はコンテナ内のメインプロセスに停止シグナル(デフォルトではSIGTERM)を送信します。プロセスが一定時間内に終了しない場合、Docker は強制終了するために kill シグナル(SIGKILL)を送信します。デフォルトのタイムアウトは 10 秒です。docker restartコマンドで-tまたは--timeフラグを使用することで、このタイムアウトを調整できます。
前のステップで作成したmy-nginxコンテナを使用しましょう。まず、コンテナが実行中であることを確認します。
docker ps
コンテナが実行中でない場合は、再度起動します:
docker start my-nginx
ここで、5 秒のタイムアウトを指定してコンテナを再起動します。これは、Docker が停止シグナルを送信した後、kill シグナルを送信するまで 5 秒間待機することを意味します。
docker restart -t 5 my-nginx
再起動コマンドが実行されたことを示すコンテナ名が表示されるはずです。
タイムアウトの効果を観察するには、通常、デフォルトの 10 秒よりも長く正常にシャットダウンするコンテナが必要です。ただし、この演習ではコマンドの構文に焦点を当てています。
次に、20 秒というより長いタイムアウトで再起動してみましょう。
docker restart --time 20 my-nginx
再びコンテナ名が表示されます。
-tまたは--timeオプションは、シャットダウン前にクリーンアップ操作により多くの時間を必要とするアプリケーションをコンテナで実行している場合に便利です。
再起動後もコンテナが実行中であることを確認するには、docker psを使用します。
docker ps
my-nginxがUpというステータスでリストされているのが確認できるはずです。
特定シグナルでコンテナを再起動
このステップでは、コンテナのメインプロセスに特定のシグナルを送信して Docker コンテナを再起動する方法を学びます。docker restartはデフォルトで停止シグナル (SIGTERM) を送信し、タイムアウト後に kill シグナル (SIGKILL) を送信しますが、コンテナ内で実行されているアプリケーションに応じて異なるシグナルを送信する必要がある場合があります。これは、docker stopで特定のシグナルを使用してコンテナを停止し、その後docker startで再度起動することで実現できます。
再びmy-nginxコンテナを使用します。まずコンテナが実行中であることを確認してください。
docker ps
実行中でない場合は起動します:
docker start my-nginx
ここで、SIGKILLシグナルを送信してコンテナを停止します。このシグナルはクリーンアップ処理を行わせず、プロセスを即座に終了させます。
docker stop -s SIGKILL my-nginx
コンテナ名が表示され、docker psを実行するとコンテナがリストに表示されなくなっているはずです。
docker ps
コンテナは停止状態になりました。再起動するには、単純に再度起動します。
docker start my-nginx
コンテナは再び実行中になっているはずです。docker psで確認します。
docker ps
my-nginxがUpステータスでリストされているのが確認できるでしょう。
SIGKILLは強制的な停止方法ですが、アプリケーションが適切なシャットダウンやリロードのために処理できるように設定されている場合は、SIGHUPやSIGINTなどの他のシグナルを送信することもできます。ただし、nginxコンテナのデフォルト設定はSIGTERMを適切に処理します。
今度はデフォルトのSIGTERMシグナル(docker stopでシグナルが指定されない場合のデフォルト)を使用してコンテナを停止してみましょう。
docker stop my-nginx
停止状態を確認します:
docker ps
最後にもう一度起動します。
docker start my-nginx
実行状態を確認します:
docker ps
docker stop -s <signal>とdocker startを組み合わせることで、コンテナを再起動する前にどのように停止するかをより細かく制御できます。
まとめ
この実験では、docker restartコマンドを使用して実行中の Docker コンテナを再起動する基本的なプロセスを学びました。Docker イメージの取得、デタッチドモードでのコンテナ実行、ステータス確認、そして正常に再起動するまでの一連の操作を実践しました。
さらに、-tまたは--timeフラグを使用してタイムアウト期間を指定することで再起動プロセスを制御する方法も学びました。これにより、Docker がコンテナの正常な停止を待つ時間を調整し、強制終了するまでの猶予期間を設定できるようになりました。



