セクション 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: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 dadjokes
は dadjokesファイルからランダムに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の 公式ガイドはとても充実しているので、より詳しく知りたい人は参考にしてほしい。 🐮