小さなWebページを用意する
新しいディレクトリを作り、その中にindex.htmlとDockerfileを保存します。Dockerfileには拡張子を付けません。
<!doctype html>
<html lang="ja">
<meta charset="utf-8">
<title>Dockerの練習</title>
<h1>コンテナから表示しています</h1>FROM nginx:alpine
WORKDIR /usr/share/nginx/html
COPY index.html .
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]FROMはベースイメージ、WORKDIRは以降の作業場所、COPYはビルドコンテキストからファイルをイメージへコピーする命令です。EXPOSEは利用するポートの説明で、ホストへ公開するには起動時の-pも必要です。CMDはコンテナ開始時の既定コマンドです。
イメージをビルドする
Dockerfileがあるディレクトリでdocker buildを実行します。最後の.は、現在のディレクトリをビルドコンテキストとして送る指定です。
docker build -t study-page:1.0 .[+] Building ... finished
=> [1/3] FROM docker.io/library/nginx:alpine
=> [2/3] WORKDIR /usr/share/nginx/html
=> [3/3] COPY index.html .
=> exporting to image
=> naming to docker.io/library/study-page:1.0-tはイメージ名とタグを付ける指定です。docker image ls study-pageで作成されたイメージを確認できます。Dockerfileの命令ごとにレイヤーが作られ、変更されていない部分はキャッシュが再利用されるため、命令の順番もビルド時間に影響します。
自作イメージから起動する
docker run -d --name study-page -p 8080:80 study-page:1.0
curl http://localhost:8080<!doctype html>
<html lang="ja">
...
<h1>コンテナから表示しています</h1>HTMLを変更しただけでは、すでに作成したイメージの中身は変わりません。docker build -t study-page:1.1 .で再ビルドし、古いコンテナを停止・削除して新しいタグから起動します。開発中に毎回ビルドするのが大変になったら、次のボリュームでバインドマウントを使います。
.dockerignoreで除外する
ビルドコンテキストには、必要なファイルだけを送ります。.env、依存関係のキャッシュ、ログ、Gitの管理情報などを送らないように.dockerignoreを作ります。
.git
.env
*.log
node_modules
vendor.envを除外しても、DockerfileのENV PASSWORD=...やビルド引数へ秘密情報を書くと、履歴やログに残ることがあります。秘密情報は用途に合うシークレット管理を使い、公開ポートや実行ユーザーも本番向けに見直します。