kzk-casino.com

一人前のITエンジニアを目指して

dockerについて勉強してみた2「docker imageの理解・操作」

dockerについての研修会の復習第二回です。

前回はdockerの概念と基本操作についてまとめてみました。
kzk-casino.hatenablog.com


今回はコンテナを操作する上で必要な"docker image"についてまとめたいと思います。

docker imageについて

dockerのコンテナは、イメージの上に成り立っています。
もう少し正確に言うと、イメージはコンテナの"雛形"であり、コンテナはイメージの書き込み可能領域に関する差分情報だけを持ちます。

f:id:kzk_casino:20160703121722p:plain
出典: What is Docker?

イメージは下記の特徴を持ちます。

  • イメージは複数の層(レイヤー)で構成される
  • 各イメージは"base layer"を持つ
  • 各レイヤーは読み込み専用である
  • dockerは"Copy on Write"のシステムを使う

"Copy on Write"とは、コンテナに変更が行われた時、イメージレイヤーに直接変更を書き込まず、
変更が加えられる内容のコピーをコンテナに作り、変更情報(イメージとの差分情報)をコンテナに保持させることを言います。


上述のように、イメージは読み込み専用であるため、コンテナ間で共有することもできます。

docker imageの作成

docker imageは3種類あります。

  • 新しいイメージとしてコンテナの変更内容をコミットする
  • Dockerfileから構築する
  • 独立したベースレイヤとしてtarボールからDockerに取り込む
新しいイメージとしてコンテナの変更内容をコミット

まずは新しいイメージとしてコンテナの変更内容をコミットしてみましょう。

今回はDocker Hubから提供されているUbuntuイメージにwgetvimのパッケージをインストールしたイメージを作成します。

$ docker run -i -t ubuntu:14.04 bash  #ubuntuイメージを立ち上げて標準入出力を起動する
root@2fd583b0b9c9:/# apt-get update
root@2fd583b0b9c9:/# apt-get install -y wget vim  #終了したらCtl+P+Qで抜ける
$ docker diff $(docker ps -ql)  #最新のコンテナとイメージの差分を表示する

ここまでで、Ubuntuイメージにwgetvimがインストールされたコンテナが作成されました。

次にこのコンテナをイメージとしてCommitします。

$ docker commit $(docker ps -ql) kzk_casino/myapp:1.0
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
kzk_casino/myapp    1.0                 897fe57414d3        6 seconds ago       266.7 MB
ubuntu              14.04               38c759202e30        8 days ago          196.6 MB

"kzk_casino/myapp1.0"というイメージが作成されました。

ここでは"kzk_casino"という名前で"myapp1.0"というイメージを作成しました。
Docker Hubに作成したイメージをPushする場合には名前にDocker Hubのアカウント名を指定してください。


Dockerfileに記載

次にDockerfileに記載してイメージ構築時の処理を指定しましょう。
作成するイメージは上の例と同じく、Ubuntuwgetvimをインストールしたものとします。

$ mkdir my_image
$ cd my_image/
$ vim Dockerfile

作成するDockerfileは下記です。

FROM ubuntu:14.04

RUN apt-get update
RUN apt-get install -y wget vim

では、Dockerfileからbuildしてみます。

$ docker build -t kzk_casino/myapp2:1.0 .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM ubuntu:14.04
 ---> 38c759202e30
Step 2 : RUN apt-get update
 ---> Using cache
 ---> 373f855439a2
Step 3 : RUN apt-get install -y wget vim
 ---> Running in bb050c6c3899
(中略)
Removing intermediate container bb050c6c3899
Successfully built db5bb0efac68
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
kzk_casino/myapp2   1.0                 db5bb0efac68        7 minutes ago       266.7 MB
kzk_casino/myapp    1.0                 897fe57414d3        About an hour ago   266.7 MB
ubuntu              14.04               38c759202e30        8 days ago          196.6 MB

docker imageが作成されたことがわかります。

また、Dockerはイメージ構築Stepごとにスナップショットを作成します。
処理済みのスナップショットが残っている場合、その結果を再利用します。

試しに、今使用したDockerFileを使用してイメージを再作成すると、時間がとても短くなっていることがわかります。

Dockerfileは他にもいろいろ細かな指定ができますが、ここでは一旦割愛します。

イメージの管理・配布

作成したイメージはDocker HubにPushすることで管理・配布が容易になります。

Docker Hubへのリポジトリの作成方法は割愛しますが、GitHubのように簡単にリポジトリを作成することができ、
Pushすることができるので是非自身のリポジトリを作成してみてください。


次はボリュームとネットワークについてまとめたいと思います。