Docker超入門⑤〜Dockerfileを使う〜【初心者向け】

グローバルでAI開発者・データサイエンティストを目指す人向け
おすすめUdemy講座一覧

TOEIC300→海外就職の英語勉強法まとめ

こんにちは,米国データサイエンティストのかめ(@usdatascientist)です.

Docker超入門第5回です.今回はついにDockerfileを使ってDocker imageをビルドしてみます!

実業務ではこのDockerfileを使ってDocker imageやコンテナを作ることが多く,DockerfileをメンテすることがDockerを使いこなすことに繋がります.(*なので一番重要)

Dockerfileは学ぶことがたくさんありますが,今回は「とりあえず使ってみる」ってとこまで.

「とりあえず使ってみる」のは簡単なのでサクッとやってみましょう!

前回の記事をまだ読んでない人はこちら↓

Docker超入門④〜コンテナをcommitしてレジストリにアップロードする〜【初心者向け】

(追記:Docker動画講座作りました.Dockerについてもっと学びたい人は是非!14時間にも及ぶ超壮大講座です.

【全14時間超え】Dockerの動画講座を公開します【徹底的にわかりやすく解説】

 

Dockerfileってなんだっけ?

DockerfileはDocker imageの設計図で,DockerfileをビルドすることでDocker imageを作成できます.

うさぎ
今までのDocker imageはDocker Hubからpullしてきたんだったね

そう.今回はDocker Hubにあるものを使うのではなくて,Dockerfileからビルドして作ってみます

DockerfileはDocker imageを作るための設計図のようなもので,1行に1コマンドが記載されているテキストファイルです.

例えば「◯◯をインストールする」とか「△△のファイルを作成する」と言った具合にそのDocker imageがどういう手順で作られるのかがわかるようになっています.

これがDockerfileだ!

2020年1月現在のubuntu:latest(version18.04)のDockerfileはこちらです.(大抵Docker Hubのリポジトリにリンクがあります.) (Versionが変わっている場合は最新(lastetタグ)のDockerfileをみてください.)

うさぎ
それぞれの行でlinuxコマンドを実行してるんだね!

その通り!ubuntuのDocker imageはこれらのコマンドが実行されて作られたものなんですね.

Dockerfileを作成しビルドしてみよう

それでは,まだDockerfileの中身についてはあまりわかってないけど,試しに自分でDockerfileを作ってビルドしてみよう!

dockerフォルダを作成し,その中にDockerfileというファイルを作ります.

私は ~/Desktop に作りました. $subl コマンドでSublimeでDockerfileを開き,以下のコードをコピーしてください.(どのエディタでも構いませんが,本ブログではSublimeの使用を進めています.Sublimeについてはこちら. $subl コマンドが動かない人は正しくPathが通っていないので,こちらの記事のsublime使い方④を参考にしてください.sublimeは必須ではないので,他のエディタでももちろん問題ないです)

  • FROM ubuntu:latest  ベースになるDocker image
  • RUN touch test ubuntu:latest の上に $ touch test を実行したimage layerを作成
FROM とか RUN がDockerfile独自のコマンドになります.他にも COPY とか ADD とか,たくさんありますが,徐々に知っていけばOK. 次回詳しくやります.

それでは,Dockerfileをビルドしてみましょう.Dockerfileが保存されているフォルダに移動し, $ docker build . でビルドします.

するとDockerはカレントディレクトリのなかにあるDockerfileというファイルを探してビルドします.

補足
– 今回はDockerfileを保存したフォルダに移動しましたが,.(カレントディレクトリ)の代わりにpathを指定する場合もあります.(が,少しイレギュラーなので次回の記事で)
– Dockerfileという名前ではないDockerfileを使う場合は -f optionでファイル名を指定します.が,基本はDockerfileという名前にするのが一般的です.

出力結果をみると,Dockerfileに記述したコマンドが実行されているのがわかるのと思います.
最後に出力されたIDがimage IDです.(ここでは 46e8b7ef60ea )

$ docker image コマンドでimageリストをみると,確かに新しいimageが作成されているのがわかると思います.
名前をつけてビルドするには $ docker build -t {IMAGE}:{TAG} . のように -t (タグoption)をつけます.

ビルドしたimageをrunしてコンテナに入る

runしてコンテナに入ってみましょう.名前がないので今回はIDを指定します.

ちゃんとtestファイルがあることがわかりますね!

前回までの記事では,pullしてきたimageをrunしてコンテナに入り, $touch test を実行して test ファイルを作成しました.

しかし,今回の記事ではDockerfileにRUN touch testを記述することで test ファイルを作成しています.

基本的にこの二つのやり方

  • コンテナを直接更新
  • Dockerfileを更新

でDockerコンテナをどんどん更新していきますが,実業務ではなるべく「Dockerfileを更新」するようにしましょう.そうすることで,そのコンテナがどういうコンテナなのかがわかります.

今回の例では「このDockerコンテナはubuntuのimageにtestというファイルを作ったコンテナなんだな」とわかるわけです.

Dockerfileは最後の行に付け加えて更新していく

もうお気付きの通り,Dockerfileに記述された各行は各image layerに値します.

既にそのlayerがローカルにある場合は新しく作らず使い回すという話をしました.

そのため,基本はDockerfileを更新する際には最後の行に新しい命令文を追加していきます.

なぜなら途中の行を変えると,そのあとの行のlayerは全て新しいものとみなされ再度layerが作成されます

Dockerfileが大きくなると実行するのに時間がかかり,コンテナを更新するたびにrunするので毎回時間がかかってしまいます.

そのため,基本は最後の行に付け足していって,時間があるときに綺麗にするようにしましょう.

まとめ

さて,今日はDockerfileをビルドしてimageとコンテナを作りました.

  • DockerfileはDocker imageを作成するための設計図のようなもの
  • コンテナを更新するときはなるべくDockerfileをメンテする
  • Dockerfileは基本Dockerfileという名前にする
  • Dockerfileを更新するときは最後の行に追加する
  • Dockerfileをビルドするには保存されているフォルダに移動し $docker build . を実行する

Dockerのもっとも重要なスキルは「Dockerfileをメンテする」ことです

いかに自分たちの環境をDockerfileに効率よく綺麗に安全に記せるかが重要になってきます.

なので次回の次回はもっと複雑なDockerfileを作ってみようと思います!では!

追記:第5回書きました.↓ 次回は第1回〜5回で学んだことをまとめます!

Docker超入門⑥〜Docker基本操作フローまとめ〜【初心者向け】