はじめる前に
- 必須Docker Desktopをインストール・起動できること
- 必須
docker pull・docker runなど基本コマンドの実行経験 - 必須テキストエディタでファイルを作成・編集できること
- あると良いフォルダ階層(どのフォルダに何のファイルがあるか)のイメージができる
※ このハンズオンは AWSのリソースを一切使いません。お使いのパソコンの中だけで完結します。
参照する公式ドキュメント
手順に迷ったときや、用語の意味を確かめたいときに開きましょう。
FROM・COPYなど、Dockerfileで使える命令の一覧と詳細です。
docs.docker.com/reference/dockerfile/
docker build コマンドリファレンス
↗
Dockerfileからイメージをビルドする docker build コマンドについての説明です。
docs.docker.com/reference/cli/docker/buildx/build/
※ Docker社の公式ドキュメント(英語)です。リンク切れの場合は、ページタイトルで検索してください。
背景・シナリオ
公開されているイメージをそのまま使うだけでは、自分のアプリケーションを動かすことはできません。実際の開発では、「何をベースにして、どんなファイルを追加し、どう動かすか」を自分で定義する必要があります。これを記述したものがDockerfileです。
今回は、Web サーバーの公開イメージ(nginx)をベースに、自分で書いたHTMLファイルを組み込んだDockerfileを作成し、そこから自分専用のイメージをビルドします。ビルドしたイメージからコンテナを起動し、既定のページではなく自分のページが表示されることを確認します。
DockerfileのFROM行は何をしているの?
FROM は、土台として使う既存のイメージを指定する命令です。今回はnginxの公式イメージを土台にし、ゼロからWebサーバーの仕組みを作り直すことはしません。
COPYは何をしているの?
COPY は、ローカルのファイルをイメージの中の指定した場所にコピーする命令です。今回は、自分で書いたHTMLファイルを、nginxが既定で表示する場所にコピーします。
自分で書いたDockerfileから、HTMLファイルを組み込んだ独自のイメージをビルドする。そのイメージからコンテナを起動し、ブラウザで自分の書いた内容が表示されることを確認する。
つくる流れ
「設計図を書く」→「イメージにする」→「起動して確かめる」という流れを体験します。
要件
以下の要件を満たし、Dockerfileからのイメージビルドを体験してください。
| No | 要件 |
|---|---|
| 1 | 適当なフォルダに、簡単な内容のHTMLファイル(index.html)を1つ作成する。 |
| 2 | 同じフォルダに、nginxをベースにしてこのHTMLファイルを組み込む Dockerfile を作成する。 |
| 3 | docker build で、作成したDockerfileから任意のタグ名を付けてイメージをビルドする。 |
| 4 | ビルドしたイメージからコンテナを起動し、ブラウザでアクセスして自分で書いたHTMLの内容が表示されることを確認する。 |
| 5 | docker images でビルドしたイメージが一覧に表示されていることを確認し、不要なコンテナ・イメージを削除する。 |
構築の進め方
「素材を準備する」→「イメージをビルドする」→「起動して確認する」→「後片付けする」という順番で進めます。
- フェーズ1 — 素材を準備する
-
作業用フォルダとHTMLファイルを作成する
適当な名前のフォルダを作成し(例:
my-custom-image)、その中にindex.htmlを作成します。内容は自由ですが、後で確認しやすいよう、自分が書いたと分かる文言を入れておきましょう。<!DOCTYPE html> <html> <head><title>My Custom Page</title></head> <body> <h1>これは自分で作ったイメージのページです</h1> </body> </html>
-
Dockerfileを作成する
同じフォルダに、拡張子のないファイル名
Dockerfileを作成し、次の内容を書きます。# 土台にするイメージ FROM nginx:latest # HTMLファイルを、nginxが既定で表示する場所にコピーする COPY index.html /usr/share/nginx/html/index.html
フォルダ構成を確認するこの時点で、フォルダの中に
index.htmlとDockerfileの2つのファイルが並んでいる状態になっているはずです。 - フェーズ2 — イメージをビルドする
-
docker buildでイメージを作成する
ターミナルで作業用フォルダに移動し、次のコマンドを実行します。
docker build -t my-custom-nginx:1.0 .
末尾の
.は「今いるフォルダを材料として使う」という意味です。実行後、ビルドが成功したことを示す表示が出ることを確認します。 - フェーズ3 — 起動して確認する
-
ビルドしたイメージからコンテナを起動する
docker run --name my-custom-site -d -p 8080:80 my-custom-nginx:1.0
ブラウザで
http://localhost:8080を開き、nginxの既定ページではなく、自分で書いたHTMLの内容が表示されることを確認します。これがゴール自分で書いた設計図(Dockerfile)どおりに、自分だけのページが表示されている——この状態を確認できたら、このハンズオンの目的は達成です。
- フェーズ4 — 後片付けする
-
イメージの一覧を確認し、不要なものを削除する
docker images docker stop my-custom-site docker rm my-custom-site
docker imagesの一覧に、my-custom-nginxというタグ名のイメージが表示されていることを確認します。
つまずきポイント
初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直すか」の手がかりとして使ってください。
「docker buildを実行すると、ファイルが見つからないというエラーが出る」
Dockerfileとindex.htmlが同じフォルダにあるか、docker buildを実行しているフォルダ(カレントディレクトリ)が正しいかを見直しましょう。
「Dockerfileを直して再ビルドしたのに、ブラウザの表示が変わらない」
同じタグ名で再ビルドした場合、すでに起動しているコンテナは古いイメージのまま動き続けています。コンテナを一度削除してから、新しいイメージで起動し直しているかを見直しましょう。
完了チェック
要件の再確認ではなく、画面・ターミナルのどこを見れば達成を確認できるかをまとめました。次を順に確かめましょう。
docker buildの実行ログの最後に、ビルド成功を示す表示が出ている。docker imagesの一覧に、指定したタグ名のイメージが表示されている。- ブラウザでアクセスすると、nginxの既定ページではなく、自分で書いた内容が表示される。
- 不要なコンテナ・イメージを削除した後、それぞれの一覧から消えている。
考えてみよう
手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。
- なぜゼロからWebサーバーを作らず、既存のnginxイメージを土台(FROM)にしたのでしょうか。
ヒント
すでに用意されている機能を再利用することで、自分が書く部分がどれだけ少なく済むか考えてみましょう。 - 同じDockerfileから内容を変えて何度もビルドし直す場合、タグ名はどのように管理するとよいでしょうか。
ヒント
毎回同じタグ名を使う場合と、バージョン番号を変えていく場合で、後から見たときの分かりやすさがどう変わるか考えてみましょう。 - このカスタムイメージを、別のパソコンや、将来的にAWSのコンテナサービスで動かしたい場合、次に何が必要になりそうでしょうか。
ヒント
今はこのパソコンの中にしかないイメージを、他の場所からも使えるようにするには、どこかに「保管・共有」する場所が必要になります(このハンズオンでは扱っていない発展的な内容です)。
後片づけ
本編の中で削除し忘れたものがあれば、ここで確認します。
- コンテナを削除する:本編のフェーズ4で削除済みの場合は不要です。
docker ps -aで残っていないか確認してください。 - イメージを削除する:今後使わない場合は、
docker rmi my-custom-nginx:1.0でビルドしたイメージを削除できます。 - ローカルのファイルを削除する:作業用フォルダが不要であれば削除します。
コストに関する注意: このハンズオンではAWSのリソースを作成していないため、料金はかかりません。Docker Desktopは個人利用や小規模なチームでの利用では無料ですが、一定規模以上の組織での利用には別途ライセンスが必要になる場合があります。組織で利用する場合は、Docker社の利用規約を確認してください。