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

できた。

参考

公式ドキュメント

Dockerfileで開発環境を準備する

先人達のTips

ジョークコマンド