Skip to content

Latest commit

 

History

History
87 lines (68 loc) · 5.34 KB

File metadata and controls

87 lines (68 loc) · 5.34 KB

TOP
前: コンテナの起動
次: 一時的であるということ


ホストOS上の隔離空間であるということ

コンテナはホストOS上で動きます。というと、hyper-vの様なホストOSのあるサーバ仮想化の様なものと思うかもしれません。しかし、サーバ仮想化とコンテナは似ている部分もありますが違いもあります。もっとも大きな違いはOS部分を含むかどうかです。サーバ仮想化はサーバHWを仮想的に表現し、その仮想的なサーバ(VM)の中でOSを動かします。一方、コンテナはOSを仮想的な区画に分け、その中でプロセスを動かします。何を言っているかよくわからないかもしれませんが、以下の手順を通して理解を深めていきましょう。

  1. ホストOSで以下のようにコマンドを実行しPID1のプロセスを確認します。おそらくinitだと思います。

    ps -ef
  2. 以下コマンドでcentosのコンテナをバックグランドで実行します。コンテナの実行コマンドは/bin/sh -c "sleep 1111"を指定します。

    sudo docker run -d centos:8 /bin/sh -c "sleep 11111"
  3. 以下コマンドでcentosのコンテナをバックグランドでもう1つ実行します。コンテナの実行コマンドは/bin/sh -c "sleep 2222"を指定します。

    sudo docker run -d centos:8 /bin/sh -c "sleep 22222"
  4. 以下コマンドで動いているコンテナを確認します。centosイメージのコンテナが2つ動いているはずです。

    sudo docker ps
  5. 以下コマンドで各コンテナの中のプロセスを確認します。PID1のプロセスがsleepコマンドを実行しているプロセスになっているはずです。

    sudo docker exec {1つ目のコンテナID} ps -ef
    sudo docker exec {2つ目のコンテナID} ps -ef
  6. 以下コマンドで各コンテナに一時ファイルを作成し、ディレクトリの状態を確認します。ファイルは指定したコンテナ内にのみ作成されていることを確認してください。

    # 1つ目のコンテナ
    sudo docker exec {1つ目のコンテナID} touch first-container
    sudo docker exec {1つ目のコンテナID} ls
    
    # 2つ目のコンテナ
    sudo docker exec {2つ目のコンテナID} touch second-container
    sudo docker exec {2つ目のコンテナID} ls
  7. 以下コマンドで各コンテナのIPアドレスを確認します。eth0に172.17.0.0/16アドレス帯の別々のIPアドレスが振られていることを確認してください。

    sudo docker exec {1つ目のコンテナID} ip a
    sudo docker exec {2つ目のコンテナID} ip a
  8. ホストOSで以下のようにコマンドを実行します。sleepを実行しているプロセスが2つ表示され、PIDは1ではないはずです。また、親プロセスのID(PPID)も確認しておきます。

    ps -ef | grep sleep | grep -v grep
  9. 上記確認したプロセスの親のさらに親のプロセスを以下のように確認します。親の親はcontainerdになっていると思います。ここで、親プロセスは左から3番目のIDです。

    ps -ef | grep {1つ目のプロセスの親プロセスID}
    ps -ef | grep {2つ目のプロセスの親プロセスID}
    ps -ef | grep {親の親プロセスID}
  10. 以下コマンドでコンテナを削除してください。

    sudo docker rm -f {1つ目のコンテナID} {2つ目のコンテナID}

上記整理すると以下のことがわかります。

  • コンテナ内のPID1は指定したコマンド(上記の場合はsleep 11111 or 22222)になっている
  • コンテナ内には指定したプロセスしか存在しない
  • コンテナ内のファイルシステムは互いに影響しない
  • コンテナには別々のIPアドレスが付与される
  • コンテナ内からは別のコンテナのプロセスは見えない
  • ホストOSからはコンテナのプロセスが見えるしPID1ではない

このように、Dockerはプロセス、ファイルシステム、IPアドレスなどを隔離されたコンテナという空間で動かします。隔離された空間という意味ではVMも同じです。一方で、OS部分が含まれないためコンテナを起動する時間はプロセスを起動する時間とほぼ一緒です。つまり、OSを立ち上げるVMと比較して圧倒的に起動が早いのです。この互いに影響しない隔離空間起動の早さという特徴は「頻繁な変更を行いたい」、「柔軟なスケールを行いたい」といったシステム要件と相性が良いです。

(この話はすべてDockerの場合です。Docker以外のコンテナランタイムだとホストOSからもコンテナプロセスが見えなかったりと話が変わってきます。ただ、コンテナの大きな特徴という意味では変わりません。)


TOP
前: コンテナの起動
次: 一時的であるということ