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