セクション 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 worldはcowsayに渡される引数である。先ほど作ったイメージのEntrypointは cowsayというコマンドなので、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:v2Dockerfileが正しければ牛は次のように喋る:
 ___________________________________
< 経済セミナーはすごい! >
 -----------------------------------
        \   ^__^
         \  (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 dadjokesは dadjokesファイルからランダムに1行を選択する。|はその結果を次のコマンド(この場合はcowsay)に渡す。
つまり、Dockerfileは下記のようになる:
FROM rancher/cowsay
ADD ./dadjokes dadjokes
ENTRYPOINT shuf -n 1 dadjokes | cowsaymy-cow:v3と名付けしてイメージをビルドする:
docker build --tag my-cow:v3 .では、コンテナを立ち上げてみよう:
docker run --rm my-cow:v3全てが正しければ、牛は次のようにレベルの高いおやじギャグを喋るだろう:
 ___________________________________
< 朝食食べて超ショック! >
 -----------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||これでDockerfileの書き方の基本を練習できた。Dockerfileの 公式ガイドはとても充実しているので、より詳しく知りたい人は参考にしてほしい。 🐮