DockerfileでDockerイメージの作成を自動化する
Docker Machine + Vagrantで任意のLinuxディストリビューションでDockerホストを構築するでは、自分の好きなLinuxディストリビューションでVMを作り、docker-machineでDockerホスト化させた。今回はDockerホスト上で生成するコンテナの素とも言えるコンテナイメージをDockerfileから自動生成する。
Dockerfileとは
DockerfileはDocker Imageの生成手順をまとめたものである。説明は色んなところにあるのでリンクを貼って割愛。
検証環境
➤ system_profiler SPSoftwareDataType
Software:
System Software Overview:
System Version: OS X 10.10.5 (14F27)
Kernel Version: Darwin 14.5.0
➤ docker-machine -v
docker-machine version 0.5.1 (7e8e38e)
(Dockerホスト)
* Docker version 1.9.1
commitを重ねてJoke Boxのイメージを作成する
普通にDockerイメージを作る。今回は、slやcowsayなど著名なジョークコマンドが詰め込まれたコンテナイメージの作成を行う。以降、➤がMacのシェル、#がDockerホストのシェルを示す。
まずはubuntuのイメージを取得してコンテナを起動し、cowsayコマンドをインストールする。
➤ CONTAINER_ID=$(docker run -it ubuntu:trusty /bin/bash)
# apt-get update
# apt-get install -y cowsay
# /usr/games/cowsay "Dockerfile Demo"
__________________
< Docker file Demo >
------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
# /usr/games/cowsay -f dragon "Dockerfile Demo"
_________________
< Dockerfile Demo >
-----------------
\ / \ //\
\ |\___/| / \// \\
/0 0 \__ / // | \ \
/ / \/_/ // | \ \
@_^_@'/ \/_ // | \ \
//_^_/ \/_ // | \ \
( //) | \/// | \ \
( / /) _|_ / ) // | \ _\
( // /) '/,_ _ _/ ( ; -. | _ _\.-~ .-~~~^-.
(( / / )) ,-{ _ `-.|.-~-. .~ `.
(( // / )) '/\ / ~-. _ .-~ .-~^-. \
(( /// )) `. { } / \ \
(( / )) .----~-.\ \-' .~ \ `. \^-.
///.----..> \ _ -~ `. ^-` ^-_
///-._ _ _ _ _ _ _}^ - - - - ~ ~-- ,.-~
/.-~
# exit
コンテナが停止している状態であれば、イメージのcommitができる。
➤ docker commit -m "Add cowsay command" -a $CONTAINER_ID takanabe/joke-box:v1 ➤ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE takanabe/joke-box v1 82c9575a4323 4 seconds ago 218.3 MB ubuntu trusty e9ae3c220b23 2 weeks ago 187.9 MB
イメージのコミットが終わったらDocker Hubにイメージをアップロードする。(事前にレポジトリは作っておく)
➤ docker login ➤ docker push takanabe/joke-box:v1
joke-box:v1イメージから新規コンテナを作成し、slコマンドをインストールする。
➤ CONTAINER_ID=$(docker run -it takanabe/joke-box:v1 /bin/bash)
# apt-get install -y sl
# /usr/games/sl
(@@) ( ) (@) ( ) @@ () @ O @ O @
( )
(@@@@)
( )
(@@@)
==== ________ ___________
_D _| |_______/ \__I_I_____===__|_________|
|(_)--- | H\________/ | | =|___ ___| _________________
/ | | H | | | | ||_| |_|| _| \_____A
| | | H |__--------------------| [___] | =| |
| ________|___H__/__|_____/[][]~\_______| | -| |
|/ | |-----------I_____I [][] [] D |=======|____|________________________|_
__/ =| o |=-~~\ /~~\ /~~\ /~~\ ____Y___________|__|__________________________|_
|/-=|___|=O=====O=====O=====O |_____/~\___/ |_D__D__D_| |_D__D__D_|
\_/ \__/ \__/ \__/ \__/ \_/ \_/ \_/ \_/ \_/
# exit
takanabe/joke-box:v1とslコマンドをインストールしたコンテナの差分を調べるにはdocker diffを使う。
➤ docker diff $CONTAINER_ID C /root C /root/.bash_history C /tmp C /usr C /usr/games A /usr/games/LS A /usr/games/sl A /usr/games/sl-h (略)
slコマンドが追加されたイメージをDocker Hubにアップロードする。
➤ docker commit -m "Add sl command" b8d18ffe7284 takanabe/joke-box:v2 ➤ docker push takanabe/joke-box:v2
Dockerfileを書いてみる
ここまでイメージのアップデートをコンテナを直接編集→コミット→Docker Hubへアップロードというフローで行った。しかし、一々コンテナに入ってコマンドを実行するのは面倒だし、イメージの編集履歴を辿るのが困難という問題がある。そこでDockerfileを使いイメージの生成を自動化することでイメージ作成フローをコード化する。
➤ cat Dockerfile
FROM takanabe/joke-box:v2
MAINTAINER T.W <takanabe.w@gmail.com>
RUN apt-get update && apt-get install -y \
cmatrix \
libaa-bin \
rig \
bb \
上記内容のDockerfileをビルドする。
➤ docker build -t takanabe/joke-box:v3 . Sending build context to Docker daemon 15.36 kB Step 1 : FROM takanabe/joke-box:v2 ---> c8785c56263f Step 2 : MAINTAINER T.W <takanabe.w@gmail.com> ---> Using cache ---> ec0f46384cb4 Step 3 : RUN apt-get update && apt-get install -y cmatrix libaa-bin rig bb ---> Using cache ---> 2853d67b7c7c Successfully built 2853d67b7c7c ➤ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE takanabe/joke-box v3 2853d67b7c7c 15 minutes ago 296.6 MB takanabe/joke-box v2 c8785c56263f 24 minutes ago 219.5 MB takanabe/joke-box v1 82c9575a4323 35 minutes ago 218.3 MB ubuntu trusty e9ae3c220b23 2 weeks ago 187.9 MB
作成されたイメージからコンテナを作る。
➤ docker run -it takanabe/joke-box:v3 /bin/bash # rig Andre Roberson 503 Ashland St Orange, NJ 07051 (201) xxx-xxxx
最後に生成されたイメージをDocker Hubにアップロードする。
➤ docker push takanabe/joke-box:v3
できた。
参考
公式ドキュメント
- Build your own images
- Dockerfile reference
- Best practices for writing Dockerfiles
- Create a base image
Dockerfileで開発環境を準備する
先人達のTips
- Dockerfileの命令を理解して、よりDockerを有効活用したい! - aspec7's garage
- Qoosky - Dockerfile ベストプラクティス (仮)
- DockerfileのONBUILD | SOTA