セクション 4 練習問題

初めて使う人にとってDockerはとても難解なものに見えるが、慣れてしまえばその使い方はとても直観的で楽しい。そのためには、小さな練習問題を解くことが効果的である。このセクションでは簡単な練習問題を解きながらDockerの基本を復習できる。Dockerがインストールされている環境を用意する必要がある。まだ用意していない場合はインストール Dockerを使い始めるにはを参考に準備してほしい。

4.1 Hello World

この練習問題では公式の hello-world Docker Imageを使って、コンテナを立ち上げる。コンテナが起動すると、メッセージが画面にプリントされて自動的に停止する。

docker runを使ってhello-world Imageからコンテナを立ち上げてみよう:

回答はこちら
docker run hello-world


コンテナがメインコマンドを実行して自動的に停止しても、この時点ではコンテナがまだ破棄されていない。コンテナのステータスはExitedになっているはずだ。docker ps --allを実行することで全てのコンテナのステータスを確認することができる。この例では、立ち上げの際にコンテナに名前を付与しなかったため、Dockerがランダムに名前を付けてくれた。その名前はdocker ps --allコマンドで確認できる。筆者がこの例を作成した際にはgallant_archimedesという名前が付けられた。

不要なコンテナは邪魔なので、 docker rmとDockerが付与してくれたコンテナの名前を使って破棄してみよう:

回答はこちら
docker rm gallant_archimedes


もう一度hello-worldからコンテナを立ち上げる。今回はmy-containerという名前を付けてみよう:

回答はこちら
docker run --name my-container hello-world


コンテナが停止したらdocker ps --allを使って、my-containerというコンテナがあることを確認できる。 確認できたらdocker rm my-containerを使って破棄しよう。

毎回コンテナを破棄するならば、停止とともに自動的に破棄されるようにしたほうが効率がいい。もう一度コンテナを立ち上げてみよう。今回は rmオプションを使う。確認しやすくするために、my-containerという名前を付けておこう。

回答はこちら
docker run --name my-container --rm hello-world


コンテナが停止したらdocker ps --allを使って、my-containerというコンテナがないことを確認してみてほしい。コンテナが破棄されていれば見つからないはずだ。

全部上手くいっただろうか?お疲れ様! 🍵

4.2 牛を喋らせる

Dockerfileを使ってDocker Imageをビルドしてみよう。 まずフォルダーを作成し、その中にDockerfileというファイルを作成する。ファイルの内容は下記のようにしてみよう:

FROM rancher/cowsay

このファイルから作成されるDocker Imageは cowsayの公式イメージをベースにしている。 cowsayはコマンドラインの使い方を学習するためによく使われているLinuxのプログラムである。この練習問題ではDockerfileを編集して、牛を喋らせていく。

同じフォルダーからdocker buildを使ってDocker Imageをビルドしよう。イメージの名前をmy-cow:v1にしよう。

回答はこちら
docker build --tag my-cow:v1 .


初めてrancher/cowsayイメージを使う際には、Docker Hubから自動的にダウンロードされる。ビルドが無事に終わったらdocker imagesというコマンドを実行して、レポジトリ名 my-cow、tag v1というイメージがあることを確認しよう。 そのイメージからコンテナを立ち上げよう:

docker run --rm my-cow:v1 moo

下記のような牛が表示されるはずだ。

 _____
< moo >
 -----
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

実行したコマンドにあるmooはDocker ImageのEntrypoint(入口)に渡される引数である。そのEntrypointはDockerfileで設定できる。

cowsayというプログラムの使い方を説明しよう。例えば cowsay "hello world"を実行すると、牛が hello worldと喋る。つまり、hello worldcowsayに渡される引数である。先ほど作ったイメージのEntrypointcowsayというコマンドなので、docker runコマンドのDocker Imageの次にmooと書いて実行することは、コンテナ内でcowsay mooを実行するのと同じである。

ベースのDocker ImageのEntrypointを上書きするために、自分の作成したDockerfileに定義する必要がある。

先ほど作成したDockerfileを編集して、牛がデフォルトで経済セミナーはすごい!と喋る ようにしよう。

回答はこちら
FROM rancher/cowsay 
ENTRYPOINT cowsay "経済セミナーはすごい!"


my-cow:v2と名付けしてイメージをビルドする。

回答はこちら
docker build --tag my-cow:v2 .


コンテナを立ち上げてみよう:

docker run --rm my-cow:v2

Dockerfileが正しければ牛は次のように喋る:

 ___________________________________
< 経済セミナーはすごい! >
 -----------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

素晴らしいメッセージだが、毎回実行するたびに同じメッセージが表示されるのはつまらないかもしれない。 ファイルに複数のメッセージを書き込んで、そこから牛がランダムに台詞を選ぶようにしてみよう!

まず、dadjokesというファイルを作成する、内容は牛の台詞である。:

マイケル・ジョーダンの冗談はまぁいける冗談
そのメロン、食べるのやめろん
朝食食べて超ショック!
車が来るまで待とう
パジャマを着ているパパ、邪魔だ
ライスだけでは、辛いっす!
係長になるまで、まだまだ時間がかかりちょー
下手なシャレは、辞めなしゃれ
ソーダは美味しそーだ
都会から来たって、「ホントかい?」

このサイトからとてもレベルの高いおやじギャグを選んでみた。

dadjokesファイルをDocker Imageの中に追加するように、Dockerfileを編集してみる。

回答はこちら
FROM rancher/cowsay 
ADD ./dadjokes dadjokes
ENTRYPOINT cowsay "経済セミナーはすごい!"


ADDコマンドはDockerfileと同じフォルダーにあるdadjokesというファイルをコピーして、Imageの中に dadjokesという名前で保存する。

次に、ファイルから1つの台詞がランダムに選択されて、その内容がcowsayに渡されるようにしよう。Entrypointを下記のように書き換える:

ENTRYPOINT shuf -n 1 dadjokes | cowsay

簡単にコマンドを解釈すると、shuf -n 1 dadjokesdadjokesファイルからランダムに1行を選択する。|はその結果を次のコマンド(この場合はcowsay)に渡す。

つまり、Dockerfileは下記のようになる:

FROM rancher/cowsay
ADD ./dadjokes dadjokes
ENTRYPOINT shuf -n 1 dadjokes | cowsay

my-cow:v3と名付けしてイメージをビルドする:

docker build --tag my-cow:v3 .

では、コンテナを立ち上げてみよう:

docker run --rm my-cow:v3

全てが正しければ、牛は次のようにレベルの高いおやじギャグを喋るだろう:

 ___________________________________
< 朝食食べて超ショック! >
 -----------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

これでDockerfileの書き方の基本を練習できた。Dockerfileの 公式ガイドはとても充実しているので、より詳しく知りたい人は参考にしてほしい。 🐮