自分でイメージを構築

whalesay イメージは更に改良できます。もしかすると、何も喋らせたくないかもしれません。あるいは、もっと喋らせることもできます。

docker run docker/whalesay cowsay boo-boo

このセクションでは whalesay イメージを改良します。(オプションを指定しなくても)「自分で何かシャベル」新しいバージョンのイメージを作成します。実行に必要なのは、ほんの少しの単語です。

ステップ1:Docker クイックスタート・ターミナルを開く

このステップでは、任意のテキストエディタを使い短い Dockerfile を書きます。Dockerfile にはイメージを構成するソフトウェア要素を記述します。Dockerfile は単に素材を記述するだけではありません。どのような環境を使うかや、コンテナの中で実行するコマンドも記述できます。今回の Dockerfile は非常に短いものです。

  1. ターミナル・ウインドウに戻ります。
  1. 新しいディレクトリを作成するため、 mkdir mydockerbuild を入力してリターンキーを押します。
$ mkdir mydockerbuild

このディレクトリは構築時の「コンテクスト」(context;内容物)の役割があります。このコンテクストとは、イメージを構築するために必要な全てを指します。

  1. 新しいディレクトリに移動します。

    $ cd mydockerbuild

この時点でディレクトリには何もありません。

  1. 現在のディレクトリに Dockerfile という名称のテキストファイルを作成します。

vinano などの任意のテキストエディタを使えます。

  1. Dockerfile ファイルを開きます。
  1. 次のように行を追加します。
FROM docker/whalesay:latest

FROM キーワードは Docker に対してイメージの元となるイメージを伝えます。これから作成する新しいイメージは、既存の whalesay イメージを使います。

  1. 次はイメージに fortunes プログラムを追加します。
RUN apt-get -y update && apt-get install -y fortunes

fortunes プログラムは賢そうなことを表示するプログラムです。これを今回のこの鯨プログラムに喋らせます。そのため、最初のステップはソフトウェアのインストールです。

  1. イメージに必要なソフトウェアをインストールしたら、イメージの読み込み時に実行するソフトウェアを命令します。
CMD /usr/games/fortune -a | cowsay

この行は fortune プログラム(の結果)を、気の利いたことを喋る cowsay プログラムに送ります。

  1. これまでの作業内容を確認します。ファイルは次のようになっているでしょう。
FROM docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay
  1. Dockerfile を保存して閉じます。

以上で Dockerfile 中にソフトウエア全ての要素と挙動を記述しました。これで新しいイメージを構築する準備が整いました。

ステップ2:Dockerfile を使ってイメージ構築

  1. 次は新しいイメージを構築するため docker build -t docker-whale . コマンドをターミナル上で実行します(最後にピリオド . を忘れないでください)。
$ docker build -t docker-whale .
Sending build context to Docker daemon 158.8 MB
...省略...
Removing intermediate container a8e6faa88df3
Successfully built 7d9495d03763

このコマンドを実行すると、結果が出るまで数秒ほどかかります。この新しいイメージを使う前に、Dockerfile の構築時の流れを学びましょう。

ステップ3:構築時の流れを学ぶ

docker build -t docker-whale . コマンドは現在のディレクトリ内にある Dockerfile を使います。そして、自分のマシン上に docker-whale という名称のイメージを構築します。コマンドの処理には少し時間がかかります。処理結果の表示は少し複雑に見えるでしょう。このセクションでは、各メッセージの意味を学びます。

まず Docker は構築時に必要な全てを確認します。

Sending build context to Docker daemon 158.8 MB

それから Docker は whalesay イメージを読み込みます。読み込むイメージは、先ほどのステップで既にローカルにあります。そのため、Docker は改めてダウンロードしません。

Step 0 : FROM docker/whalesay:latest
 ---> fb434121fc77

Docker は次の行に移ります。 apt-get パッケージ・マネージャを更新します。ここでは多くのメッセージが表示されますが、表示されるのは初回だけです。

Step 1 : RUN apt-get -y update && apt-get install -y fortunes
 ---> Running in 27d224dfa5b2
Ign http://archive.ubuntu.com trusty InRelease
Ign http://archive.ubuntu.com trusty-updates InRelease
Ign http://archive.ubuntu.com trusty-security InRelease
Hit http://archive.ubuntu.com trusty Release.gpg
....snip...
Get:15 http://archive.ubuntu.com trusty-security/restricted amd64 Packages [14.8 kB]
Get:16 http://archive.ubuntu.com trusty-security/universe amd64 Packages [134 kB]
Reading package lists...
---> eb06e47a01d2

それから、Docker は新しい fortunes ソフトウエアをインストールします。

Removing intermediate container e2a84b5f390f
Step 2 : RUN apt-get install -y fortunes
 ---> Running in 23aa52c1897c
Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:
  fortune-mod fortunes-min librecode0
Suggested packages:
  x11-utils bsdmainutils
The following NEW packages will be installed:
  fortune-mod fortunes fortunes-min librecode0
0 upgraded, 4 newly installed, 0 to remove and 3 not upgraded.
Need to get 1961 kB of archives.
After this operation, 4817 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ trusty/main librecode0 amd64 3.6-21 [771 kB]
...snip......
Setting up fortunes (1:1.99.1-7) ...
Processing triggers for libc-bin (2.19-0ubuntu6.6) ...
 ---> c81071adeeb5
Removing intermediate container 23aa52c1897c

最後に Docker は構築の終了を画面に表示します。

Step 3 : CMD /usr/games/fortune -a | cowsay
 ---> Running in a8e6faa88df3
 ---> 7d9495d03763
Removing intermediate container a8e6faa88df3
Successfully built 7d9495d03763

ステップ4:新しい docker-whale を実行

このステップではコンピュータ上にイメージがあるかどうか確認してから、新しいイメージを実行します。

  1. ターミナル・ウインドウ上でなければ、画面にカーソルを合わせます。
  1. docker images を実行してリターンキーを押します。

このコマンドはローカルにあるイメージの一覧を表示します。覚えておくと良いでしょう。

$ docker images
REPOSITORY           TAG          IMAGE ID          CREATED             VIRTUAL SIZE
docker-whale         latest       7d9495d03763      4 minutes ago       273.7 MB
docker/whalesay      latest       fb434121fc77      4 hours ago         247 MB
hello-world          latest       91c95931e552      5 weeks ago         910 B
  1. 新しいイメージを実行します。docker run docker-whale を入力して、エンターキーを押します。
$ docker run docker-whale
 _________________________________________
/ "He was a modest, good-humored boy. It  \
\ was Oxford that made him insufferable." /
 -----------------------------------------
          \
           \
            \
                          ##        .
                    ## ## ##       ==
                 ## ## ## ##      ===
             /""""""""""""""""___/ ===
        ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
             \______ o          __/
              \    \        __/
                \____\______/

ご覧の通り、少し賢くなった鯨プログラムを作りました。コマンドラインで何かを自分で指定すると、それの表示もできます! Docker は何もダウンロードしないことにも注目します。これはイメージをローカルで構築しており、ダウンロードする必要がないからです。

次は何をしますか

このページでは自分で Dockerfile を記述してイメージを構築する方法を学びました。そして、自分のイメージを使ってコンテナを実行しました。次のセクションではイメージを共有する第一歩として、 Docker Hub アカウントを作成 します。

参考

Biuld your own image
https://docs.docker.com/linux/step_four/