Dockerコンテナの使用

前書き

Dockerは、実行に必要なすべてを含むファイルシステムをソフトウェアアプリケーションに提供するために使用される一般的なコンテナ化ツールです。 Dockerコンテナを使用すると、実行時環境が無慈悲に一貫しているため、ソフトウェアがデプロイされている場所に関係なく、ソフトウェアが同じように動作します。

このチュートリアルでは、DockerイメージとDockerコンテナーの関係の概要を簡単に説明します。 次に、コンテナを実行、開始、停止、削除する方法をさらに詳しく見ていきます。

概要

  • Dockerイメージ*は、Dockerコンテナの作成に使用される不活性なテンプレートと考えることができます。 通常、イメージはルートファイルシステムで始まり、ファイルシステムの変更とそれに対応する実行パラメーターを、順序付けられた読み取り専用レイヤーに追加します。 典型的なLinuxディストリビューションとは異なり、Dockerイメージには通常、アプリケーションの実行に必要な最低限の要素のみが含まれています。 画像には状態がなく、変化しません。 むしろ、それらはDockerコンテナーの開始点を形成します。

`+ docker run +`コマンドを使用すると、画像に命が吹き込まれます。このコマンドは、画像の上に読み取り/書き込みレイヤーを追加することで*コンテナ*を作成します。 この読み取り専用レイヤーと読み取り/書き込みレイヤーの組み合わせは、*ユニオンファイルシステム*として知られています。 実行中のコンテナ内の既存のファイルに変更が加えられると、ファイルは読み取り専用スペースから読み書きレイヤーにコピーされ、そこで変更が適用されます。 読み取り/書き込みレイヤーのバージョンは、元のファイルを隠しますが、削除しません。 読み書きレイヤーの変更は、個々のコンテナインスタンス内にのみ存在します。 コンテナを削除すると、変更を保存するための手順を実行しない限り、変更は失われます。

コンテナでの作業

`+ docker run +`コマンドを使用するたびに、指定したイメージから新しいコンテナーが作成されます。 これは混乱の原因になる可能性があるため、いくつかの例を見てみましょう。

ステップ1:2つのコンテナーを作成する

次の `+ docker run `コマンドは、ベースの ` ubuntu `イメージを使用して新しいコンテナを作成します。 「 -t 」は端末を提供し、「-i 」は端末と対話できるようにします。 シェルにドロップするには、https://github.com/dockerfile/ubuntu/blob/master/Dockerfile#L32 [UbuntuベースイメージのDockerファイル]のデフォルトのコマンド「 bash +」を使用します。

docker run -ti ubuntu

コマンドラインプロンプトが変わり、ルートユーザーとしてコンテナ内にいることを示し、その後に12文字のコンテナIDが続きます。

コンテナの `+ / tmp `ディレクトリにテキストをエコーすることで変更を加え、 ` cat +`を使用して、テキストが正常に保存されたことを確認します。

echo "Example1" > /tmp/Example1.txt
cat /tmp/Example1.txt
OutputExample1

それでは、コンテナを終了しましょう。

exit

Dockerコンテナは、発行されたコマンドが完了するとすぐに実行を停止するため、bashシェルを終了するとコンテナが停止しました。 実行中のコンテナを表示するコマンドである `+ docker ps +`を実行しても、表示されません。

docker ps
OutputCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

停止または実行中の_all_コンテナを示す `+ -a +`フラグを追加すると、コンテナがリストに表示されます。

docker ps -a
OutputCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
11cc47339ee1        ubuntu              "/bin/bash"         6 minutes ago       Exited (127) 8 seconds ago                       small_sinoussi

コンテナの作成時に、コンテナIDとランダムに生成された名前が与えられました。 この場合、11cc47339ee1はコンテナIDであり、「+ small_sinoussi 」はランダムに生成された名前です。 ` ps -a `は、これらの値と、コンテナーの作成元の画像( ` ubuntu `)、コンテナーの作成時( `+6分前)、およびその中で実行されたコマンドを表示します( `+ / bin / bash +)。 出力には、コンテナのステータス( + Exited +)と、コンテナがその状態に入った時間( 6秒前)も表示されます。 コンテナがまだ実行されている場合、ステータスが「Up」になり、その後に実行されていた時間が表示されます。

同じコマンドを再実行すると、まったく新しいコンテナーが作成されます。

docker run -ti ubuntu

コマンドプロンプトのIDが異なるため、新しいコンテナであることがわかります。Example1ファイルを検索しても、見つかりません。

cat /tmp/Example1
Outputcat: /tmp/Example1: No such file or directory

これにより、データが消失したように見える場合がありますが、そうではありません。 2番目のコンテナを終了して、それと、作成したファイルを含む最初のコンテナが両方ともシステム上にあることを確認します。

exit

コンテナを再度一覧表示すると、両方が表示されます。

docker ps -a
OutputCONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                       PORTS                           NAMES
6e4341887b69        ubuntu              "/bin/bash"              About a minute ago   Exited (1) 6 seconds ago                                     kickass_borg
11cc47339ee1        ubuntu              "/bin/bash"              13 minutes ago       Exited (127) 6 minutes ago                                   small_sinoussi

ステップ2:最初のコンテナーの再起動

既存のコンテナを再起動するには、 `+ start `コマンドと ` -a `フラグを使用してコンテナにアタッチし、 ` -i +`フラグを使用してインタラクティブにし、その後にコンテナIDまたは名前を追加します。 以下のコマンドで、コンテナのIDを必ず置き換えてください。

docker start -ai

コンテナのbashプロンプトに再び出会って、以前に作成したファイルを「+ cat +」すると、それはまだそこにあります。

cat /tmp/Example1.txt
OutputExample1

コンテナを終了できます:

exit

この出力は、コンテナ内で行われた変更が、コンテナを停止および起動しても持続することを示しています。 コンテンツが削除されるのは、コンテナが削除されたときだけです。 この例は、変更が個々のコンテナに限定されたことも示しています。 2番目のコンテナを開始したとき、それはイメージの元の状態を反映していました。

ステップ3:両方のコンテナを削除する

2つのコンテナを作成しました。それらを削除して、簡単なチュートリアルを終了します。 `+ docker rm +`コマンドは、停止したコンテナでのみ機能し、1つ以上のコンテナの名前またはIDを指定できるため、次の方法で両方を削除できます。

docker rm 11cc47339ee1 kickass_borg
Output11cc47339ee1
kickass_borg

両方のコンテナ、およびコンテナ内で行った変更はすべてなくなりました。

結論

`+ docker run +`コマンドを詳細に見て、実行されるたびに新しいコンテナが自動的に作成される方法を確認しました。 また、停止したコンテナを見つけて起動し、接続する方法も確認しました。 コンテナの管理の詳細については、https://www.digitalocean.com/community/tutorials/naming-docker-containers-3-tips-for-beginners [Naming Docker]のガイドをご覧ください。コンテナ:初心者向けの3つのヒント]。