Chapter 06

コンポーネント - container

ここだけは理解しよう

Docker Image がスナップショットだとしたら、
Docker Container はそのスナップショットから起動したプロセスです。

  • コンテナは隔離された環境で実行される
  • Docker コンテナは基本的に「1 コンテナ 1 プロセス」
  • ライフサイクルは実行されたコマンドがフォアグラウンド上で実行されている期間

バックグラウンドでプロセスが立ち上げられていても、
フォアグラウンドでコマンドが終了したらコンテナは停止する。

コンテナのライフサイクル

image1.png

  • RUNNING状態
    • Docker Container が起動した状態
    • Dockerfile の CMD もしくは ENTRYPOINT で指定したコマンドが、
      フォアグラウンドで動いている == RUNNING の状態
    • docker run -P nginxのように nginx を起動した場合、
      nginx が起動してアクセスを待ち受けてる間は RUNNING の状態
  • STOPPED状態
    • 起動した Container が終了した状態
    • どのような形(正常・異常)であっても終了した Container は STOPPED へ遷移します
  • PAUSED状態
    • Container が停止した状態
    • ユーザーが docker pause <CONTAINER ID> を実行すると、
      現在の状態を保持して一時停止します
    • docker unpause <CONTAINER ID>で、
      一時停止したコンテナ ID を指定することで再開することが可能
    • 重要:ユーザーが明示的に指定しない限りこの状態へは遷移しない
  • DELETED状態
    • Docker Container は明示的に削除をしない限り停止した状態で残り続けます
    • docker rm <CONTAINER ID>で明示的に削除すると DELETED の状態へ遷移する

コンテナの隔離を確認する

事前に pstree コマンドを使えるようにしましょう。
ここではdocker playgroundを利用します。

# pstreeコマンドをインストールしましょう。
apk add --no-cache pstree

# nginxのコンテナをディタッチモードで起動しましょう。
docker run -d nginx

# プロセスを確認しましょう。
pstree

下記が実行結果となります。
pstree1.png

# 別のnginxのコンテナをディタッチモードで起動しましょう。
docker run -d nginx

# プロセスを確認しましょう。
pstree

追加で nginx を起動します。
そうすると pstree コマンドの結果を見ると、
別プロセスでコンテナが起動していることがわかります。
pstree2.png

nginx のコンテナを起動するたびに namespace が作られて、
コンテナが各プロセスで独立していることがわかります。

また、上記の結果をみるとコンテナに下記の PID が割り振られています。

  • 000655
  • 00476

以上の結果のように、
ホストで docker のコンテナを複数起動してもプロセスが独立しているので、
コンテナがホストやコンテナ間の干渉を受けなくなるのです。

ちなみに上記コマンドの nginx はコンテナのポートとホスト側のポートをつないでいないので、アクセスはできないです。

社内勉強会で出た質問

回答は、有料の記事に記載します。

  • フォワグラウンドとバックグラウンドの違いについて教えて欲しい?