1. 概要

Docker コンテナーは、その内部で何らかのプロセスを実行するDockerイメージのインスタンスです。 このプロセスの状態が変化すると、コンテナーの動作も影響を受けます。 したがって、コンテナはそのライフサイクル全体を通じてさまざまな状態で見つけることができます。

このチュートリアルでは、Dockerコンテナのすべての可能な状態について学習します。

まず、Dockerコンテナーの状態を見つける方法を調べてから、コンテナーのさまざまな段階を見ていきます。

2. Dockerコンテナの現在の状態を見つける

Dockerコンテナーのさまざまな状態について詳しく説明する前に、まず、Dockerコンテナーの状態を見つける方法を調べてみましょう。

デフォルトでは、 docker ps コマンドは、すべてのDockerコンテナーの現在の状態を表示します。

$ docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED              STATUS                          PORTS     NAMES
8f0b524f2d32   centos:7   "/bin/bash"   46 seconds ago       Created                                   strange_beaver
e6d798254d45   centos:7   "/bin/bash"   About a minute ago   Exited (0) About a minute ago             wizardly_cohen

出力には、マシン上に存在するすべてのコンテナーが、 STATUS (5列目)およびその他の詳細とともに表示されます。

docker inspect コマンドを使用して、単一のコンテナーのステータスを取得することもできます。

$ docker inspect -f '{{.State.Status}}' mycontainer
running

ここで、 mycontainer は、現在の状態を検索するコンテナー名です。 DockerコンテナIDに置き換えることもできます。

3. Dockerコンテナの可能な状態

特定のインスタンスでは、Dockerコンテナは6つの可能な状態で見つけることができます。 次に、これらの各状態について詳しく見ていきましょう。

3.1. 作成した

Dockerは、 created 状態を、作成されてから開始されていないコンテナーに割り当てます。 したがって、この状態のコンテナはCPUやメモリを使用しません。

docker create コマンドを使用して作成されたDockerコンテナーは、ステータスをc reded:として表示します。

$ docker create --name mycontainer httpd
dd109e4be16219f1a6b9fc1cbfb050c1ae035d6a2c301ea0e93eb7d5252b8d2e
$ docker inspect -f '{{.State.Status}}' mycontainer
created

ここでは、httpd 公式Dockerイメージを使用して、Dockerコンテナーmycontainerを作成しました。 使用してから dockercreate コンテナを起動するコマンド。ステータスは次のように表示されます。 作成した。 

このようなコンテナは、いくつかの大きなタスクに備える必要がある場合に役立ちます。 このような状況では、コンテナーを作成して、開始時にすぐに使用できるようにします。

3.2. ランニング

e docker startコマンドを使用してcreated状態のコンテナーを開始すると、running状態になります。

この状態は、プロセスがコンテナー内の分離された環境で実行されていることを示します。

$ docker create --name mycontainer httpd
8d60cb560afc1397d6732672b2b4af16a08bf6289a5a0b6b5125c5635e8ee749
$ docker inspect -f '{{.State.Status}}' mycontainer
created
$ docker start mycontainer
mycontainer
$ docker inspect -f '{{.State.Status}}' mycontainer
running

上記の例では、最初に公式の httpdDockerイメージを使用してDockerコンテナーを作成しました。 すると、コンテナの状態は作成した。 開始すると mycontainer、 the httpd サーバープロセスと他のすべての関連プロセスが実行を開始します。 そのため、同じコンテナのステータスがrunningに変更されました。

docker run コマンドを使用して実行されたコンテナーも、同じステータスになりました。

$ docker run -itd --name mycontainer httpd
685efd4c1c4a658fd8a0d6ca66ee3cf88ab75a127b9b439026e91211d09712c7
$ docker inspect -f '{{.State.Status}}' mycontainer
running

この状態では、コンテナによるCPUとメモリの消費に妥協はありません。

3.3. 再起動

簡単に言えば、この状態は、コンテナが再起動中であることを示します。 

Dockerは、4種類の再起動ポリシーをサポートします。 X136X]再起動ポリシーは、コンテナーが終了するときのコンテナーの動作を決定します。

デフォルトでは、再起動ポリシーは no、に設定されています。これは、コンテナーが終了した後、コンテナーが自動的に開始されないことを意味します。

再起動ポリシーを常にに更新し、次の例を使用してDockerコンテナの状態を確認しましょう。

$ docker run -itd --restart=always --name mycontainer centos:7 sleep 5
f7d0e8becdac1ebf7aae25be2d02409f0f211fcc191aea000041d158f89be6f6

上記のコマンドは、 mycontainer を実行し、 sleep5コマンドを実行して終了します。 ただし、このコンテナの再起動ポリシーを更新したため、コンテナが終了すると自動的に再起動します。

5秒後、コンテナの状態は再起動になります。

$ docker inspect -f '{{.State.Status}}' mycontainer
restarting

3.4. 終了しました

この状態は、コンテナ内のプロセスが終了したときに達成されます。 この状態では、CPUとメモリはコンテナによって消費されません。

実行中のコンテナーが終了する理由はいくつか考えられます。 それらのいくつかを見てみましょう:

  • コンテナ内の処理が完了したため、終了しました。
  • コンテナ内のプロセスで、実行中に例外が発生しました。
  • docker stop コマンドを使用して、コンテナーを意図的に停止します。
  • bashを実行しているコンテナーに対話型端末が設定されていません。
$ docker run -itd --name mycontainer centos:7 sleep 10
596a10ddb635b83ad6bb9daffb12c1e2f230280fe26be18559c53c1dca6c755f

ここでは、centosコンテナを開始しました。 mycontainer、 コマンドを渡しました睡眠10。 これにより、10秒間のスリープ後にコンテナが終了します。 10秒後に次のコマンドを実行することで同じことを確認できます。

$ docker inspect -f '{{.State.Status}}' mycontainer
exited

exited 状態のコンテナーには、 dockerexecコマンドを使用してアクセスできません。 ただし、 dockerstartまたはdockerrestart を使用してコンテナーを起動し、それにアクセスすることはできます。

$ docker start mycontainer

3.5. 一時停止

Paused は、すべてのプロセスを無期限に一時停止するDockerコンテナーの状態です。 

Dockerコンテナーは、 dockerpauseコマンドを使用して一時停止できます。

$ docker run -itd --name mycontainer centos:7 sleep 1000
1a44702cea17eec42195b057588cf72825174db311a35374e250d3d1da9d70c5

上記の例では、centos Dockerイメージを使用してDockerコンテナーを起動し、コマンド sleep1000を実行しました。 これにより、1000秒のスリープ後にコンテナが終了します。

ここで、数秒後、たとえば100秒後にこのコンテナを一時停止しましょう。

$ docker pause mycontainer
mycontainer
$ docker inspect -f '{{.State.Status}}' mycontainer
paused

一時停止したコンテナは、コンテナの実行中に使用したのと同じメモリを消費しますが、CPUは完全に解放されます。 dockerstatコマンドを使用してこれを確認しましょう。

$ docker stats --no-stream
CONTAINER ID   NAME          CPU %     MEM USAGE / LIMIT    MEM %     NET I/O       BLOCK I/O   PIDS
1a44702cea17   mycontainer   0.00%     1.09MiB / 7.281GiB   0.01%     1.37kB / 0B   0B / 0B     1

CPUは0%ですが、メモリ使用量はゼロではないことに注意してください。

docker unpause コマンドを使用して、コンテナーを再開できます。

$ docker unpause mycontainer
mycontainer

コンテナの一時停止を解除すると、一時停止したのと同じポイントから再開されます。上記の例では、100秒のスリープ後にコンテナを一時停止しました。 したがって、コンテナの一時停止を解除すると、100からスリープが再開されます。 したがって、この時点から900秒のスリープ後にコンテナは停止します。 (合計スリープは1000に設定されました)。

ここで問題となるのは、Dockerコンテナをいつ一時停止するかです。 DockerコンテナがCPUを集中的に使用するタスクを実行している状況を考えてみます。 同時に、CPUを集中的に使用する別のコンテナを優先度の高い方法で実行したいと考えています。 もちろん、両方のコンテナを同時に実行することもできますが、リソースが不足しているため、実行速度が低下します。

このような場合、優先度の低いコンテナーの1つをしばらく一時停止し、もう1つのコンテナーに完全なCPUを使用させることができます。 完了したら、最初のコンテナの実行の一時停止を解除できます。

3.6. 死

Dockerコンテナのdead状態は、コンテナが機能していないことを意味します。 この状態は、コンテナーを削除しようとすると達成されますが、一部のリソースがまだ外部プロセスによって使用されているため、削除できません。 したがって、コンテナはdead状態に移行します。

dead状態のコンテナは再起動できません。 それらは削除することしかできません。

のコンテナ以来状態が部分的に削除されるので、 メモリやCPUを消費しません。 

4. 結論

このチュートリアルでは、Dockerコンテナーのさまざまな段階を実行しました。

まず、Dockerコンテナの状態を見つけるためのいくつかの方法を調べました。 その後、各状態の重要性と、さまざまなDockerコマンドを使用してそれらの状態を実現する方法を学びました。