Dockerコンテナに関するもう少し詳しい説明


 Dockerの仮想環境の本体であるDockerコンテナ。

 コンテナ型の仮想環境の初心者だった私は、コンテナ型仮想化はカーネル部分が共有化されている単なるchroot環境と勝手に思い込んでおり、それほど重要視していませんでした。

 しかし、Dockerに興味が沸き、色々調べながら検証しながら、仕組みを詳しく知っていくほどに、最初の勝手な思い込みは間違いだったことが恥ずかしくなりました。

 ここでは、Dockerのコンテナについて、もう少し詳しく仕組みを紹介してます。

 本ページの内容を読んでいただき、Dockerをより深く知るきっかけになっていただければ幸いです。

 

Dockerコンテナについての詳細説明

 サービス利用者から見れば、Dockerコンテナが最も重要なコンポーネントになります。システム運用者は、サービスの利用状況に応じて、どのようにDockerコンテナを操るかが腕の見せ所になると思います。

Dockerコンテナとは

 Dockerコンテナとは、Dockerにおける個々の仮想環境のことを指します。

 Dockerの仮想環境は、コンテナ型仮想環境に分類されます。コンテナ型仮想環境につきましては、こちらをご参照ください。

 Dockerコンテナは、Dockerイメージを指定して起動することで、仮想環境として生成されます。Dockerイメージについてはこちらをご参照ください。

 

2種類のDockerコンテナの使い方

 Dockerコンテナは、使い方として、大きく2種類あります。

 

 1つ目は、指示した処理を行い、その処理が終わったら、起動したDockerコンテナも停止する使い方です。

 例えば、以下のDockerコマンドを実行してみてください。

$ docker run ubuntu ls -l /var

 このDockerコマンドは、「ubuntu」というDockerイメージを使ってDockerコンテナを起動し、その仮想環境内で「ls -l /var」の命令を実行する、ということを行います。

 結果として、何やらファイルの一覧が表示されたと思います。それは、起動したDockerコンテナ内の/var以下のファイル一覧になります。

 lsコマンドの処理が終わったら、Dockerコンテナは止まってしまいます。

 

 2つ目は、Dockerコンテナをデーモンモードで起動し、常駐させる使い方です。これによって、Dockerコンテナをサービスとして起動することが出来ます。

 こちらも例を示しておきます。

$ docker run -d ubuntu mysql

 このコマンドは、「ubuntu」というDockerイメージを使ってDockerコンテナをデーモン起動し、起動したDockerコンテナの中で、mysqlモジュールをデーモンとして実行する、ということを行います。

 2つ目の方法ですと、Dockerコマンドを実行し終わっても、起動されたDockerコンテナは停止しません。

 

 1つ目の使い方のように、Dockerコンテナはコンピュータの仮想環境なのですが、他の仮想化技術とは少し異なる使い方をすることも可能です。

 では次に、Dockerコンテナの基になるDockerイメージとの関連性について解説いたします。

■ 本記事の目次に戻る ■

DockerイメージとDockerコンテナの関係

 Dockerコンテナは、Dockerイメージを使って起動されます。

 しかし、Dockerイメージは、各Dockerコンテナ内に存在しません。Dockerコンテナの実体内には、起動するために使用したDockerイメージからの更新分の情報(コンテナレイヤ)しか存在しません。

 つまり、下図に示す通り、Dockerの内部的には、Dockerイメージは読み込み専用の共有リソースとして扱います。

docker_container

 しかし、Dockerコンテナ内から見ても、共有していることは全く解りません。Dockerイメージ内に存在するファイルは、Dockerコンテナ内に存在しているかのように普通に更新できます。

 その更新情報は、Dockerイメージ内に存在するファイルを更新したものであったとしても、Dockerコンテナ内のコンテナレイヤに保存されます。これは「コピー・オン・ライト」という技術を使用してます。詳細はDocker公式サイトをご参照ください。後日、当サイトでもまとめるつもりです。

 Docker環境は、カーネルを共有するため、オーバーヘッドが小さいといわれてますが、DockerコンテナのベースとなるDockerイメージに関しても、更にコンピュータ資源に優しい構造になってます。

■ 本記事の目次に戻る ■

 

DockerコマンドにてDockerコンテナを10個起動する検証

 Dockerコンテナは、Dockerイメージを共有利用していることを確認するために、簡単な実験を行いたいと思います。

 まずDockerホストの現状のハードディスク容量を確認します。

$ df -k
ファイルシス             1K-ブロック  使用     使用可    使用% マウント位置
/dev/mapper/centos-root 28784916    11161656 17623260  39%   /

 11161656キロバイト使用してます。

 ここで、UbuntuのDockerコンテナを10個起動してみます。起動する前にUbuntuのDockerイメージの容量を確認しておきます。

$ docker images ubuntu
REPOSITORY   TAG     IMAGE ID      CREATED    SIZE
ubuntu       latest  bd3d4369aebc  5 days ago 126.6 MB

 126メガバイトですね。

 では、ubuntuのDockerコンテナを10個起動してみます。

$ docker run -d ubuntu init
c717716997a06916f603f509cf5db0249930ad5e9dc4a06147dbb0d88904c723
$ docker run -d ubuntu init
3763ba6ce1c1e80f5efeffec00d4d05fed857b5d5bd877218f2be4f2f17f026a
$ docker run -d ubuntu init
aca178146642c13bdd06e41e039da4296dc66198bbd38e20177385b4cf429020
$ docker run -d ubuntu init
1714d417f19e5e10aa517cce8a2f116e25770b0b3a11972193d4f0a317474b28
$ docker run -d ubuntu init
5da7add26fa1980c289d38957353b85330c0f8b0d03e4c7d379c284071638071
$ docker run -d ubuntu init
a238eeeb74aa1f4e0b739ff999a4764a2c31f5b2abfbbd4282d6aa14fe408369
$ docker run -d ubuntu init
3accd52041b6e62bc2f61471cfa21419a60b205abf742024e8c8852bf0d2833d
$ docker run -d ubuntu init
0dd7f5581ab7c00e8ff7a915a485cc3b04bfc2dcf58d9065ec1e017f437bcb57
$ docker run -d ubuntu init
9fcf935e3a156f4762cc67e1b288117572a3eba93005b969399389fe108f236f
$ docker run -d ubuntu init
956607e7fdf6cf07b4deb671709bec2bf46bbe99240a42569855ebddca0ea841

 Dockerコンテナの起動状態を確認します。

$ docker ps
CONTAINER ID IMAGE   COMMAND CREATED        STATUS     PORTS   NAMES
956607e7fdf6 ubuntu "init"   9 seconds ago  Up 8 seconds reverent_colden
9fcf935e3a15 ubuntu "init"   10 seconds ago Up 9 seconds boring_feynman
0dd7f5581ab7 ubuntu "init"   11 seconds ago Up 10 seconds evil_lovelace
3accd52041b6 ubuntu "init"   11 seconds ago Up 10 seconds suspicious_shaw
a238eeeb74aa ubuntu "init"   11 seconds ago Up 11 seconds sad_bartik
5da7add26fa1 ubuntu "init"   12 seconds ago Up 11 seconds pedantic_murdock
1714d417f19e ubuntu "init"   13 seconds ago Up 12 seconds happy_swirles
aca178146642 ubuntu "init"   13 seconds ago Up 13 seconds gloomy_hoover
3763ba6ce1c1 ubuntu "init"   14 seconds ago Up 13 seconds big_noyce
c717716997a0 ubuntu "init"   15 seconds ago Up 14 seconds backstabbing_pasteur

 10個のDockerコンテナが起動されていることが確認できました。

 では、Dockerホストのハードディスク容量を確認します。

$ df -k
ファイルシス             1K-ブロック 使用     使用可    使用% マウント位置
/dev/mapper/centos-root 28784916   11215328 17569588 39%   /

 11215328キロバイト使用しているようです。

 起動前の使用量が11161656キロバイトでしたので、10個のDockerコンテナを起動したことで、

53672キロバイト、約54メガバイト増えたことになります。

 もし、ubuntuのDockerイメージが各Dockerコンテナにコピーされるとしたら、Dockerコンテナを10個起動することによって、126メガバイト×10の1.2ギガバイトほど増えるはずですね。

 この実験結果からも、DockerイメージはDockerコンテナに共有されていることが解ると思います。

 

 もし同じことを試された方がいらっしゃいましたら、必ず「docker stop」と「docker rm」コマンドで、起動した10個のDockerコンテナの停止及び削除を行って下さい。

 ちなみにコマンド実行時、DockerコンテナのIDはスペース区切りで複数並べて実行することが可能です。

 今回はここまでです。

 最後までお付き合い頂きありがとうございました。

■ 本記事の目次に戻る ■


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください