GNU/Linux >> Linux の 問題 >  >> Panels >> Docker

コンテナライフサイクルを管理するためのDockerコマンド(決定的なガイド)

Dockerコンテナのさまざまな状態を知ることは、真面目なDockerユーザーにとって不可欠です。

コンテナのライフサイクルについて説明してから、ライフサイクルの各段階のDockerコマンドを示します。

しかし、これらすべてを学ぶ前に、コンテナの概念をもう一度見直しましょう。

Dockerコンテナーとは何ですか?

コンテナのほとんどの従来の定義は次のようになります:

コンテナは、オペレーティングシステムの仮想化の一形態です。従来のハイパーバイザーベースの仮想化では、VMごとに別々のカーネルが必要ですが、コンテナーは同じホストカーネルを共有するため、はるかに軽量で高速に起動できます

定義はソースごとに異なりますが、要点は同じです。

私はそれが退屈で不必要に複雑だと思います。ここで別のものを使用してコンテナを定義したいと思います。

コンテナは、だまされている一連のプロセスです。

なぜ私はそれを言うのですか?コンテナは単なるプロセスのコレクションであるため、単一のプロセスである場合もあります。そして、これらのプロセスは、ネットワーク、プロセスツリー、ファイルシステム、ホスト名など、ホストのさまざまなリソースに依存しています。

bashのようなシェルでも、任意のプロセスを実行できます 、実際のプロセスツリーを非表示にし、別のネットワークセットを提供し、実際のルートファイルシステムを非表示にし、別のホスト名を指定します。基本的に、最終的にはプロセスのコンテナ化されたバージョンを作成します。

これは、名前空間、個別のルートファイルシステムおよびcgroupによって実現されます。

Dockerは、コンテナーを実行および管理する低レベルのツールの単なるラッパーです。具体的には、コンテナーライフサイクル

それとは別に、Dockerは、コンテナーのネットワーキングを容易にする、ストレージを処理する、コンテナーイメージをプルおよびプッシュするなど、他の多くのことも行います。

Dockerは私たちの生活を楽にするためにここにあります。

では、Dockerコンテナのライフサイクルを見てみましょう

コンテナのライフサイクルは、基本的に、コンテナの作成から破棄までの一連の段階です。

次の図は、これを非常に明確にするものです。

コンテナのライフサイクルの各段階について説明します。

  • 作成: 多くの人は、コンテナを実行するとき、それは1つのステップであると考えています。しかし、そうではありません。何よりも先にコンテナを作成するプロセスがあります。これについては後で詳しく説明します。
  • 開始/実行中: コンテナが作成されると、コンテナを開始できます。その後、ステータスはRunningに変わります。 。これは、コンテナが実際に何かをしているときです。
  • 一時停止: 従来、プロセス(基本的にはコンテナ)を一時停止するには、SIGSTOPシグナルを使用し、一時停止を解除するには、SIGCONTシグナルを使用します。ただし、このシグナルはプロセスによって監視可能であるため、シグナルの代わりにcgroupフリーザーが使用されます。このように、cgroupをフリーズすることでプロセスが一時停止されます。
  • 終了/停止: Runningの反対 、ただしPausedと同じではありません 。コンテナを停止するということは、SIGTERMシグナルをメインコンテナプロセス、つまりコンテナ名前空間のPID1に送信することを意味します。次に、10秒間待機して、プロセスを正常に終了させます。そうでない場合は、SIGKILL 信号が送信され、それが何を意味するのかは誰もが知っていますね。
  • 破棄/削除: コンテナはもう存在せず、かつて割り当てられていたすべてのリソースがなくなりました。

これにより、コンテナのライフサイクルの概念がより明確になったと思います。次のセクションでは、これらすべてのコンテナーの状態を管理するのに役立つすべての特定のdockerコマンドについて説明します。

コンテナのライフサイクルを管理するためのDockerコマンド

コンテナのライフサイクルを制御するすべてのコマンド(より具体的にはサブコマンド)は、サブコマンドcontainerに属します。 。

ターミナルでdocker container --helpを実行すると コンテナで実行可能な複数の操作に関連付けられているサブコマンドのリストが表示されます。

しかし、ここではそれらすべてについて心配しているわけではありません。それらの特定のサブセットのみに焦点を当てましょう。

コンテナの作成

コンテナの作成は、次のコマンドによって処理されます。

  1. docker container create
  2. 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つのコマンドのいずれかを使用します。-

  1. docker container start
  2. 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実行コマンド

これは、コンテナの作成と起動を結び付ける特別なコマンドであり、私たち全員が最もよく使用するコマンドです。

  1. docker container run
  2. 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へ 。

コンテナを一時停止するために使用されるコマンドは次のとおりです。-

  1. docker container pause
  2. docker pause

同様に、一時停止を解除する対応するコンテナを使用して、コンテナの一時停止を解除できます。-

  1. docker container unpause
  2. 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コンテナを停止できます。-

  1. docker container stop
  2. 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つのコマンドのいずれかを使用して削除されます。-

  1. docker container rm
  2. 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

この記事がコンテナのライフサイクルの理論を理解しやすくし、これらのさまざまな状態を管理するために必要なすべてのコマンドをクリアしたことを心から願っています。

ご不明な点がございましたら、下にコメントを残してください。


Docker
  1. DockerコンテナでNginxを実行する方法:ステップバイステップガイド

  2. DockerコンテナでMySQLを実行する方法:シンプルでわかりやすいガイド

  3. 一部のDOCKERコマンド

  1. Dockerコンテナとは:初心者向け入門ガイド

  2. Dockerの概要

  3. Dockerコンテナのタイムゾーンを変更する方法

  1. Dockerコマンドのリスト:チートシート

  2. Dockerコマンドクイックリファレンスチートシート

  3. テスト用の MySQL Docker コンテナを作成する方法