Dockerコンテナが他の仮想マシンとどこが異なっているのか

Docker
Docker公式ロゴ1a
©2020 Docker Inc. All rights reserved

 Dockerコンテナは、Dockerの仮想環境内の仮想マシンです。

 Dockerはコンテナ型の仮想環境に分類されまして、ハイパーバイザー型やホスト型などの仮想環境とは仕組みが異なっています。

 本記事をお読みになることで、Dockerと他の仮想環境でどこが異なっているのか、Dockerはどのような用途に向いているのか、についての概要をご理解いただけると思います。

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

Dockerコンテナとは

 Dockerコンテナとは、仮想環境でいうところの仮想マシンのことです。

 仮想環境といいますと、Hyper-vやvmwareなどのハイパーバイザー型のものが一般的ですが、Dockerの仮想環境はコンテナ型に分類されます。

 ハイパーバイザー型とコンテナ型の違いはいろいろありますが、一番大きいのは仮想マシンごとのカーネルの持ち方です。

 ハイパーバイザー型は各仮想マシンごとにカーネルを持ちますが、コンテナ型の場合は1台の物理マシン内の仮想マシンでカーネルを共有します。

 コンテナ型仮想環境につきましては、別記事「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コマンドを実行してみてください。

$ docker run -dit --name testvm ubuntu bash

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

 少々強引で実用的ではありませんが、bashモジュールをDockerコンテナ内に常駐させてみました。

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

 上のbashが常駐しているDockerコンテナは以下のコマンドで停止・削除できます。

$ docker stop testvm
$ docker rm testvm

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

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

 Dockerイメージといいますのは、一般的な仮想環境での仮想ハードディスクとお考えください。

 Dockerイメージの中には、OSに含まれるツール群やアプリケーションの実行ファイルなどが格納されています。

 しかし、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はスペース区切りで複数並べて実行することが可能です。

おわりに

 速く、少ないリソースで、効率よく仮想マシンを作りあげるためにDockerがどのような仕組みになっているか、少しでも感じをつかんでいただけましたでしょうか。

 Dockerは、大規模な仮想マシンを作るよりも、小規模な仮想マシンを必要な分だけ数多く作るというシステムに向いている仮想環境です。

 ハイパーバイザー型仮想環境が合っているシステム、コンテナ型仮想環境が向いているシステムをキチンと見定めて、最適なインフラ環境を構築することが重要と考えます。

 最後までお読みいただきありがとうございました!

コメント

タイトルとURLをコピーしました