はじめに
Dockerコンテナはなぜ軽いのか、仮想マシンに比べて高速で動作するのかを確認します。
目的
Dockerを触りながら、コンテナイメージとコンテナレイヤーについて確認する
今回は、下記の操作を行います。
- タグを指定してイメージをDockerHubからダウンロード
- pull済みのイメージを確認
- 同一イメージに複数のタグをつけて管理
- イメージのレイヤーを確認
環境
- macOS Mojave 10.14.6
- Docker engine 19.03.5
まずはDockerのインストール
コンテナをアレコレしてみる
コンテナのタグ
コンテナにはタグがついています。
DockerHubのイメージを見てみると、バージョン
やlatest
mainline
など、タグがついています。
また、タグを指定してイメージをpullすることができるようになっています。
Docker Pull
タグを指定して、3つのnginxイメージをpullしてみます。
# latestタグを指定してイメージをpull
docker pull nginx:latest
# mainlineタグを指定してイメージをpull
docker pull nginx:mainline
# mainline-alpineタグを指定してイメージをpull
docker pull nginx:mainline-alpine
※ Alpine Linux
は超軽量セッティングのOSです。
Docker image ls
今pullしたイメージを確認するには、以下のコマンドを実行します。
docker image ls
先ほどpullしたイメージが以下のように表示されました。
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest ed21b7a8aee9 12 days ago 127MB
nginx mainline ed21b7a8aee9 12 days ago 127MB
nginx mainline-alpine 377c0837328f 5 weeks ago 19.7MB
latest
とmainline
の「IMAGE ID」が同じになっています。
あれ?なんでかな?
とおもったのですが、これがコンテナイメージの肝です。
つまり、latest
のイメージとmainline
のイメージは、実は同一の内容なのです。
イメージはコンテナのメタデータ
そもそもイメージとはコンテナのメタデータであり、起動時の設定です。
内容が同じであれば、Dockerはうまくそれを利用して使い回すことができます。
docker image ls
で出力された内容をみると、127MBのイメージが2つあるように見えますが、実際には127MBの容量しか使用されていません。
イメージはレイヤー構造
イメージはいくつもの層が重なって構成されています。
共通するレイヤーがあれば使い回し、ディスクの容量を節約し、ひいては高速化に繋がります。
docker history
以下のコマンドを使用することで、imageレイヤーの差分をたどることができます。
docker history nginx:latest
イメージがレイヤーの積み重ねであり、その差分を記録していることで、共通部分を使い回すことができます。
それによってコンテナイメージは軽量になっています。
Docker image inspect
以下のコマンドを使用することで、イメージのメタデータを確認することができます。
docker image inspect nginx:mainline
コンテナのIDや、作者はもちろん、
デフォルトで使用するポートや環境変数なども確認することができます。
まとめ
下記の操作を行いながら、Dockerが軽量である理由や、
イメージがメタデータと差分のレイヤーであることを確認しました。
- タグを指定してイメージをDockerHubからダウンロード
- pull済みのイメージを確認
- 同一イメージに複数のタグをつけて管理
- イメージのレイヤーを確認
ちなみに、コンテナを起動してアレコレすると、このイメージにさらに差分が積み重なっていきます。