Dockerコンテナのさまざまな状態を知ることは、真面目なDockerユーザーにとって不可欠です。
コンテナのライフサイクルについて説明してから、ライフサイクルの各段階のDockerコマンドを示します。
しかし、これらすべてを学ぶ前に、コンテナの概念をもう一度見直しましょう。
Dockerコンテナーとは何ですか?
コンテナのほとんどの従来の定義は次のようになります:
コンテナは、オペレーティングシステムの仮想化の一形態です。従来のハイパーバイザーベースの仮想化では、VMごとに別々のカーネルが必要ですが、コンテナーは同じホストカーネルを共有するため、はるかに軽量で高速に起動できます
定義はソースごとに異なりますが、要点は同じです。
私はそれが退屈で不必要に複雑だと思います。ここで別のものを使用してコンテナを定義したいと思います。
コンテナは、だまされている一連のプロセスです。
なぜ私はそれを言うのですか?コンテナは単なるプロセスのコレクションであるため、単一のプロセスである場合もあります。そして、これらのプロセスは、ネットワーク、プロセスツリー、ファイルシステム、ホスト名など、ホストのさまざまなリソースに依存しています。
bash
のようなシェルでも、任意のプロセスを実行できます 、実際のプロセスツリーを非表示にし、別のネットワークセットを提供し、実際のルートファイルシステムを非表示にし、別のホスト名を指定します。基本的に、最終的にはプロセスのコンテナ化されたバージョンを作成します。
これは、名前空間、個別のルートファイルシステムおよびcgroupによって実現されます。
Dockerは、コンテナーを実行および管理する低レベルのツールの単なるラッパーです。具体的には、コンテナーライフサイクル 。
それとは別に、Dockerは、コンテナーのネットワーキングを容易にする、ストレージを処理する、コンテナーイメージをプルおよびプッシュするなど、他の多くのことも行います。
Dockerは私たちの生活を楽にするためにここにあります。
では、Dockerコンテナのライフサイクルを見てみましょう
コンテナのライフサイクルは、基本的に、コンテナの作成から破棄までの一連の段階です。
次の図は、これを非常に明確にするものです。
コンテナのライフサイクルの各段階について説明します。
- 作成: 多くの人は、コンテナを実行するとき、それは1つのステップであると考えています。しかし、そうではありません。何よりも先にコンテナを作成するプロセスがあります。これについては後で詳しく説明します。
- 開始/実行中: コンテナが作成されると、コンテナを開始できます。その後、ステータスは
Running
に変わります。 。これは、コンテナが実際に何かをしているときです。 - 一時停止: 従来、プロセス(基本的にはコンテナ)を一時停止するには、SIGSTOPシグナルを使用し、一時停止を解除するには、SIGCONTシグナルを使用します。ただし、このシグナルはプロセスによって監視可能であるため、シグナルの代わりにcgroupフリーザーが使用されます。このように、cgroupをフリーズすることでプロセスが一時停止されます。
- 終了/停止:
Running
の反対 、ただしPaused
と同じではありません 。コンテナを停止するということは、SIGTERMシグナルをメインコンテナプロセス、つまりコンテナ名前空間のPID1に送信することを意味します。次に、10秒間待機して、プロセスを正常に終了させます。そうでない場合は、SIGKILL
信号が送信され、それが何を意味するのかは誰もが知っていますね。 - 破棄/削除: コンテナはもう存在せず、かつて割り当てられていたすべてのリソースがなくなりました。
これにより、コンテナのライフサイクルの概念がより明確になったと思います。次のセクションでは、これらすべてのコンテナーの状態を管理するのに役立つすべての特定のdockerコマンドについて説明します。
コンテナのライフサイクルを制御するすべてのコマンド(より具体的にはサブコマンド)は、サブコマンドcontainer
に属します。 。
ターミナルでdocker container --help
を実行すると コンテナで実行可能な複数の操作に関連付けられているサブコマンドのリストが表示されます。
しかし、ここではそれらすべてについて心配しているわけではありません。それらの特定のサブセットのみに焦点を当てましょう。
コンテナの作成は、次のコマンドによって処理されます。
docker container create
docker create
最初のものは長い形式ですが、2番目のものはあなたが正しく推測したように短い形式です。
より冗長で、私が良い習慣だと思うものなので、長い形式を使用することをお勧めします。
コンテナの作成とは、指定されたイメージのR/Oレイヤーの上にR/Wレイヤーを作成し、必要なプログラムを実行するための準備をすることです。コンテナを作成しても実際のプロセスは開始されません。作成段階で機能、CPU制限、メモリ制限、コンテナイメージなどのすべての構成パラメータを指定し、それらのパラメータを再指定することなく、いつでもコンテナを開始できます。 。
docker container create --help
をお読みください 構成可能なオプションのリストについては。
まず、次のようなコンテナを作成します(alpine
を使用しました ここに画像を表示して、コマンドsleep infinity
を実行します )
docker container create \
--name alpine alpine:latest sleep infinity
コンテナが作成されたら、ターミナル画面でそのIDを取得する必要があります。これで、コンテナリストをフィルタリングして、実行されていないが作成されたばかりのコンテナを見つけることができます。 。
docker container ls --filter=status=created
ここでは、作成されたコンテナのみを取得するようにリストをフィルタリングしています。 STATUS
をご覧ください 列、それはコンテナの状態を指定するものです。次のように表示されます。-
➟ docker container ls --filter=status=created
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f8d56fb3f78 alpine:3.13.4 "sleep infinity" 17 seconds ago Created alpine
コンテナを調べて、その状態を確認することもできます。
➟ docker container inspect -f '{{json .State.Status}}' alpine
"created"
docker create
を使用する 何も変わりません。
コンテナを起動するには、次の2つのコマンドのいずれかを使用します。-
docker container start
docker start
ここでも同じです。1つは長いバージョン、もう1つは短いバージョンです。また、...container start
を使用することをお勧めします コマンド。
コンテナが作成されたら、それを開始できます。コンテナの起動とは、コンテナ化されたアプリケーションを実際に実行することを意味します。
コンテナーを作成すると、すべての構成(コンテナーの実行方法、ランタイム環境、ランタイム制約、コンテナー名など)が準備されるだけで、リソースは割り当てられません。
コンテナを起動すると、必要なリソースが割り当てられ、アプリケーションが実行されます。
以前に作成したコンテナについて考えてみます。次のようなコンテナ名またはIDでコマンドを開始するだけです:
docker container start alpine
コンテナが起動すると、ステータスがCreated
から変わります。 Running
へ 。コンテナリストでは、以前と同じようにステータスで再度フィルタリングできます。-
docker container ls --filter=status=running
STATUS
について Running
の代わりにcolumn コンテナが起動してから実行されている期間が表示されます。
➟ docker container ls --filter=status=running
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f8d56fb3f78 alpine:3.13.4 "sleep infinity" 8 minutes ago Up 18 seconds alpine
コンテナを調べて、その状態を確認することもできます。 Goテンプレートを使用して、出力を必要なもの、つまり状態のみにフォーマットします。
docker container inspect \
-f '{{json .State.Status}}' alpine
このようなものが表示されるはずです-
➟ docker container inspect -f '{{json .State.Status}}' alpine
"running"
冗長に聞こえるわけではありませんが、docker start
同じことをします。
これは、コンテナの作成と起動を結び付ける特別なコマンドであり、私たち全員が最もよく使用するコマンドです。
docker container run
docker run
これらのコマンドは、基本的に(i)コンテナーを作成し、すぐに(ii)同じコンテナーを開始します。
後で開始するコンテナを作成して残すことは、私たちがあまり頻繁に行うことではないため、これは便利です。 Docker CLIを使用してコマンドラインにアクセスすると、実行できます。 コンテナ。そしてそれがまさに...container run
コマンドは行います。
このコマンドの例は非常に簡単です。コンテナを実行するには、docker container create
の代わりに 、docker container run
を使用します 。
あなたはします docker container create
に渡すすべてのオプションを渡す必要があります このdocker container run
に 指図。これは、2番目のステップがないため、dockerがその時点ですべての情報を必要としているためです。
➟ docker container run --name echo-me alpine:3.13.4 echo "Subscribe to Linux Handbook"
Subscribe to Linux Handbook
Docker Run vs Start vs Create:違いの説明docker初心者にとって、docker start、docker run、dockercreateなどの用語は混乱を招く可能性があります。この記事では、例との違いについて説明します。 LinuxハンドブックAbhishekPrakash コンテナを一時停止するということは、それがどのように聞こえるかを正確に意味します。プロセスを停止するのではなく、一時停止するだけです。したがって、コンテナ内のプロセスが1から100までカウントされていて、カウント50の間に一時停止され、後で一時停止されなかった場合、カウントは再開されます。 50から。
理解すべきことの1つは、Paused
は実際の状態、Unpaused
ではありません。一時停止したコンテナの一時停止を解除すると、基本的に状態がPaused
から変更されます。 Running
へ 。
コンテナを一時停止するために使用されるコマンドは次のとおりです。-
docker container pause
docker pause
同様に、一時停止を解除する対応するコンテナを使用して、コンテナの一時停止を解除できます。-
docker container unpause
docker unpause
プロセスはSIGSTOPシグナルを使用して一時停止され、一時停止を解除するにはSIGCONTシグナルが使用されます。これらの信号はプロセスによって監視できるため、信号の代わりにcgroupフリーザーが使用されます。このように、cgroupをフリーズすることでプロセスが一時停止されます。 cgroupをフリーズすると、そのすべてのタスクとすべての子cgroupがフリーズします。
例:
このデモのために、特別なコンテナを作成しました。次のコマンドを実行して画像をプルします。-
docker image pull debdutdeb/pause-demo:v1
Dockerfileとコードはここで確認できます。
引っ張られたら、1つの端末で、この画像を使用してコンテナを起動します
docker container run --name pause-demo debdutdeb/pause-demo:v1
これで、0から始まるカウントが表示されるはずです。次のようになります
➟ docker container run --name pause-demo debdutdeb/pause-demo:v1
Count at 30
別の端末で、このコンテナを一時停止します。
docker container pause pause-demo
コンテナを一時停止している瞬間に、カウントダウンが停止するのが見えるはずですが、ターミナルはまだ戻っていません。これは、コンテナがまだ停止されていないためです(これについては、この記事の後半で説明します)。このコンテナの一時停止を解除すると、カウントダウンは再開するのではなく再開する必要があります。
docker container unpause pause-demo
ターミナルを元に戻すには、別のターミナルで実行します
docker container stop pause-demo
これが実際の動作を示す短いビデオです:-
前のコンテナと同じようにコンテナを停止する前に、一時停止したコンテナの状態を次のように確認してください。
➟ docker container inspect -f '{{json .State.Status}}' pause-demo
"paused"
次の2つのコマンドのいずれかを使用してDockerコンテナを停止できます。-
docker container stop
docker stop
コンテナを停止するということは、それに関連するすべてのプロセスを停止することを意味します。
これは、コンテナを一時停止することと同じではありません。コンテナを停止すると、コンテナを再起動できますが、プロセスは以前の状態から再開されません。プロセスは、状態情報を「ファイル」に保存し、そのファイルから状態を復元できますが、それは別のケースです。
たとえば、前のpause-demo
を停止した後 コンテナ、...container start
を使用して再起動しようとすると コマンドの場合、pause
とは異なり、最初からカウントを開始します カウントを再開するカウンターパート。
Dockerにコンテナーを停止するように要求すると、DockerはSIGTERM
を送信します。 コンテナのPID1に信号を送ります。その後、それはその優雅な時間である10秒間待機し、プロセスは今度は優雅に終了するために与えられます。言い換えれば、それが機能していたものは何でもクリーンアップして終了します。 10秒が経過すると、Dockerは最後のSIGKILL
を送信します 信号、次に何が起こるかをあなたに話す必要はありません。
他のすべてのプロセスはPID1の子であるため、DockerはコンテナーのPID 1にシグナルを送信します。このプロセスが終了/強制終了されると、chilプロセスは自動的に存在しなくなります。
これは、以下の例でより明確になります。
もう一度画像をプルする必要があります。
docker image pull debdutdeb/stop-demo:v1
Dockerfileとソースコードについては、この要点を確認してください。
1つの端末で、このイメージからコンテナを起動します。
docker container run --name stop-demo debdutdeb/stop-demo:v1
実行すると、PIDと待機中であることを示す画面が表示されます。
➟ docker container run --name stop-demo debdutdeb/stop-demo:v1
My PID in this container is 1
Waiting...
別のターミナルを開き、このコンテナで停止コマンドを実行します。
docker container stop stop-demo
実行すると、コンテナを実行していたターミナルに、 ITが何であるかが表示されます。 が発生している、つまりSIGTERM
を受信している 信号。
その後、秒数のカウントが開始され、10秒後にカウントが停止することがわかります。これは、私がそのようにハードコーディングしたためではなく、実際には無限に続くようにハードコーディングしました。
しかし、10秒後、dockerはSIGKILL
を送信します キャッチも無視もできないという合図で、プロセスは必ず殺されます。
DockerがSIGKILL
を送信する前に待機する時間を変更できます -t
を使用して信号を送る docker container stop
のオプション 。
すべてが完了すると、次のようなものが表示されます
➟ docker container run --name stop-demo debdutdeb/stop-demo:v1
My PID in this container is 1
Waiting...
SIGTERM ignored,
Starting count..
10 seconds
これを示す小さなビデオがあります:-
...container inspect
を使用して、このコンテナの状態を確認できます。 そのように:-
➟ docker container inspect -f '{{json .State.Status}}' stop-demo
"exited"
コンテナは、次の2つのコマンドのいずれかを使用して削除されます。-
docker container rm
-
docker rm
コンテナの削除は、コンテナの作成の反対です。コンテナを削除すると、そのコンテナはなくなり、その特定のを持ち込むことはできません。 コンテナバック。同じ構成を使用して同じイメージから新しいイメージを開始し、同一にすることができますが、以前のイメージとまったく同じにはなりません。
たとえば、前のstop-demo
を削除するだけです。 コンテナ。
docker container rm stop-demo
これまで、作成して停止したすべてのコンテナは、1つのコマンドで削除できます。-
docker container prune
これにより、ステータスがExited
のすべてのコンテナが削除されます 。
出力例:
✗ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
ffbdd621c01d0eb3f42d348eeb75c731ddd9bd85674bb90dece32bd70357e541
21b9ed6a6198cd6ee7e162aebd936ae3e93b3b0f738161924a825a27794f2b20
f5f5149866a6ced675ad3bfff0b7386f75ee3fdbddca86be8b8ba341dba4b27f
Total reclaimed space: 0B
それで、コンテナのライフサイクルの概念を学びました。また、コンテナーのライフサイクルの各段階を管理するDockerコマンドについても学びました。 Dockerのヒントがさらに必要な場合は、あまり知られていないが便利なDockerコマンドについて学ぶことができます。
3 Dockerコマンド上級Dockerユーザーが知っておくべきDockerコマンドは、知らないかもしれませんが、コンテナーの管理に役立つ可能性があります。 Linux HandbookDebdut Chakrabortyこの記事がコンテナのライフサイクルの理論を理解しやすくし、これらのさまざまな状態を管理するために必要なすべてのコマンドをクリアしたことを心から願っています。
ご不明な点がございましたら、下にコメントを残してください。