Dockerストップコンテナに問題がありますか?コンテナを停止する正しい方法を見つけることは、多くの異なるコンテナを作成する機能では困難です。この記事では、コンテナーまたはすべてのコンテナーを停止するDockerコマンドについて学習します。
詳細については、以下をお読みください。
前提条件
このチュートリアルを続けるには、次のものがあることを確認してください。
- Windows 10 –チュートリアルではWindowsを使用してDockerを実行しますが、同じ一般的な手順をLinuxまたはmacOSに適用することもできます。
- Dockerデスクトップ –このチュートリアルではバージョン3.5.2を使用します。 Dockerエンジン GUIがないため、Linuxを使用している場合は利用できます。
- 実行中のDockerコンテナまたは複数のコンテナ。
dockerstopContainersコマンドでコンテナを終了する
最初のコマンドであるdocker stopから始めましょう コンテナコマンドと、コンテナの停止をどのように実行するか。
たとえば、mystifying_hofstadterという名前の実行中のコンテナを停止する必要があるかもしれません。 およびIDfb66ed502096 。以下の例に示すように、docker stopでコンテナを停止します コンテナコマンド。
# Stop the container via the name
docker stop mystifying_hofstadter
# Stop the container via the ID (same container)
docker stop fb66ed50209
複数の実行中のコンテナがあり、それらを停止したい場合はどうなりますか? docker stop containerコマンドは、一度に1つずつ複数のコンテナーIDを停止することをサポートします。
まず、docker psを使用してすべてのコンテナを一覧表示します コマンドを実行し、コンテナIDをdocker stopに渡します 以下に示すように、containersコマンド。
# List all running containers
docker ps
# Stop the following Docker containers via the container ID
docker stop a427a21c5558 e9dbd816f24c 31269ef5999e
コンテナIDを手動で取得してdocker stopに渡さずに、実行中のすべてのコンテナを停止したい場合はどうなりますか? ? docker ps -q コマンドはそれを達成します。 -q docker psのパラメータ コマンドはコンテナのIDのみを出力します。
# Create three containers. A semi-colon separates each command
docker run -d -t ubuntu; docker run -d -t ubuntu; docker run -d -t ubuntu
# List all running containers
docker ps -q
# Retrieve all running container IDs and pass those to docker stop
docker stop $(docker ps -q)
$(docker ps -q)上記の構成は、Linux上のBashとWindows上のPowerShellの両方の部分式です。部分式は、シェルに1セットのコマンドdocker ps -qを処理するように指示します。 、最初に、結果のセットを元のコマンドdocker stopに返します 。
docker stop containerコマンドはSIGTERMシグナルを使用します。 Linuxシグナルはイベントのプロセスに通知しますが、特定のシグナルにどのように作用するかを決定するのはプロセス次第です。
SIGTERMシグナルを使用する場合、Dockerはシグナルを使用して、デフォルトの10を待機することでプロセスを正常に停止します。 SIGKILLシグナルを送信する数秒前。これにより、プロセスがすぐに終了します。
プロセス信号を使用したコンテナの停止
docker stopを使用して、Dockerのデフォルトの動作(停止信号)について学習しました コンテナを停止するときのcontainersコマンド。ただし、デフォルトの動作は望ましくない場合があります。代わりに、代替の停止信号を使用するようにDockerに指示できます。
docker runを使用 コマンド--stop-signal フラグを設定すると、コンテナの起動時に停止信号を指定できます。このフラグは、実行中のコンテナを停止するときに送信されるシグナルを設定します。
以下の例では、--stop-signal フラグは値SIGQUITを取ります 、コンテナを停止する時間になると、DockerにSIGQUITシグナルを送信するように指示します。この例では、次のパラメーターも使用しています。
-
d–コンテナをデタッチ(バックグラウンド)モードで実行します。デタッチモードでは、プロセスがバックグラウンドで実行されているため、ユーザーがコンテナをすぐに操作することはできません。 -
t– Pseudo-TTY(PTY)コンソールを割り当てます。これは、コンテナー内の実際のターミナルコンソールをエミュレートし、Ubuntuコンテナーがすぐに終了するのを防ぎます。この例のUbuntuコンテナでは、バックグラウンドでアクティブな状態を維持するためにPTYコンソールが必要です。 - 「イメージ名」–コンテナをプロビジョニングするDockerイメージ(この場合は
ubuntu) 画像。
docker run -d -t --stop-signal SIGQUIT ubuntu
Dockerfileを使用して停止シグナルを指定することもできます。これは、Dockerにコンテナーの構築方法を指示します。
STOPSIGNAL SIGQUITを使用して、停止信号を指定するエントリをDockerfileに追加できます。 、 例えば。SIGQUITを切り替えることができます 必要な停止信号を使用します。
docker killですぐにコンテナを終了する
猶予期間を許可せずにコンテナを終了したい場合があります。 docker kill コマンドはすぐにコンテナを停止します。
次の例では、IDが2aa318273db5のコンテナを渡します。 docker killへ 。コンテナはSIGKILLシグナルを介してすぐに終了します。コンテナは正常に終了することはできません。コマンドの結果、コンテナが終了し、コンテナのIDが表示されます。
docker kill 2aa318273db5
Dockerはコマンド
docker kill $(docker ps -q)を使用してすべてのコンテナーを強制終了します 。(docker ps -q)はここでの部分式です。
docker rmを使用したコンテナの停止と削除
デフォルトでは、コンテナを作成すると、そのコンテナは以前と同じように作成されます。つまり、べき等です。コンテナを削除しても影響は最小限に抑えられます。そのことを念頭に置いて、docker rm コンテナを強制停止して取り外すことができます。 DockerはSIGKILLを発行します メインプロセスにシグナルを送信し、Dockerインストールで使用可能なコンテナーのリストからコンテナーを削除します。
コンテナが変更された内部ファイルを保持する必要がある場合、またはその状態を保持する必要がある場合、コンテナを削除するとそれらの変更が破棄されます。潜在的な混乱に注意してください!
次の例では、kind_galileoという名前が割り当てられたコンテナを開始した可能性があります。 。コンテナを削除する前に、以下に示すように、コンテナを停止する必要があります。 docker ps -a コマンドはExitedのステータスを表示しています サンプルコンテナの場合。
これで、コンテナはdocker rmの発行を停止しました。 コマンドはコンテナを完全に削除します。
docker rm kind_galileo
コンテナを停止してコンテナを削除する代わりに、--forceの組み合わせ およびdocker rm 1回の操作でコンテナを停止および削除します。コンテナ、laughing_elion 、実行できなくなります。
docker rm --force laughing_elion
--forceを指定しない場合 コマンドを実行すると、エラーメッセージError response from daemon: You cannot remove a running container...が表示されます。
DockerComposeを使用したDockerコンテナの停止
Dockerコマンドは通常、単一のコンテナーで使用されますが、複数のコンテナーが相互に連携して動作するサービスを作成できます。 Docker Composeツールを使用すると、複数のコンテナーで構成されるサービスを構成して連携させることができます。
サービス内のコンテナは連携して動作するように設計されているため、個々のコンテナではなく、サービス全体を適切に停止することをお勧めします。
複数のコンテナで実行されているサービスがある場合は、[docker-compose stop] コンテナまたはサービスを削除せずにサービスを停止します。以下に従って、Docker Composeサービスを作成し、サービスを開始して、最終的にサービスを正常に停止します。
1.構成ファイルを保存するディレクトリを作成します。この例では、ディレクトリ C:\ Articles \ Ubuntu ファイルを保存します。
mkdir C:\Articles\Ubuntu 2.次に、ファイル docker-compose.ymlを作成します 次の構成を含むファイル。以下のDockerComposeファイルは、2つのUbuntuコンテナーを使用してサービスを作成します。起動しても、コンテナーはすぐには終了しません。
# The specification version of docker-compose
version: "3.9"
# The collection of applications composing this service
services:
# First Ubuntu Container
container1:
image: ubuntu
# Same as the -t option and allocates a Psuedo-TTY, so the container does not immediately exit.
tty: true
# Second Ubuntu Container
container2:
image: ubuntu
tty: true
3.ターミナルセッションで、カスタムDocker構成ファイルディレクトリ(この例では C:\ Articles \ Ubuntu )に移動します。 。 docker-compose up -dを実行します -dで示されるように、前のステップで作成されたサービスをバックグラウンドで生成して開始します オプション。
4.同じターミナルセッションとディレクトリで、コマンドdocker-compose stopを発行します。 サービスとコンテナを正常に終了します。
docker-composedockerのようなコマンド コマンドには、rm --forceもあります およびkillパラメーター。docker-composeパラメータは、単一のコンテナではなくサービスで機能します。docker-compose killコマンドにはオプション-sもあります 停止信号を指定するオプション。
結論
Dockerコンテナーは、開発および本番環境で使用するための独自のセグメント化された環境を作成するための強力なツールです。この記事では、Dockerが1つ以上、さらにはすべてのコンテナーを停止するいくつかの方法を学びました。 Dockerが使用するデフォルトの停止信号とその変更方法についても学びました。
この知識があれば、Dockerコンテナーを停止する方法と、コンテナーの実行を停止するときに失敗しないようにする方法を理解できます。この新たな知識を持って、今後どのようにコンテナを停止する予定ですか?