Docker

Dockerfileでイメージを作る

環境の作り方をファイルに書き、自分のアプリケーション用イメージをビルドします。

Docker入門の講座一覧

01

小さなWebページを用意する

新しいディレクトリを作り、その中にindex.htmlとDockerfileを保存します。Dockerfileには拡張子を付けません。

index.htmlHTML
<!doctype html>
<html lang="ja">
<meta charset="utf-8">
<title>Dockerの練習</title>
<h1>コンテナから表示しています</h1>
DockerfileDOCKERFILE
FROM nginx:alpine
WORKDIR /usr/share/nginx/html
COPY index.html .
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

FROMはベースイメージ、WORKDIRは以降の作業場所、COPYはビルドコンテキストからファイルをイメージへコピーする命令です。EXPOSEは利用するポートの説明で、ホストへ公開するには起動時の-pも必要です。CMDはコンテナ開始時の既定コマンドです。

02

イメージをビルドする

Dockerfileがあるディレクトリでdocker buildを実行します。最後の.は、現在のディレクトリをビルドコンテキストとして送る指定です。

ビルドCOMMAND
docker build -t study-page:1.0 .
出力の一部OUTPUT
[+] 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の命令ごとにレイヤーが作られ、変更されていない部分はキャッシュが再利用されるため、命令の順番もビルド時間に影響します。

03

自作イメージから起動する

作成したイメージを起動COMMAND
docker run -d --name study-page -p 8080:80 study-page:1.0
curl http://localhost:8080
実行結果OUTPUT
<!doctype html>
<html lang="ja">
...
<h1>コンテナから表示しています</h1>

HTMLを変更しただけでは、すでに作成したイメージの中身は変わりません。docker build -t study-page:1.1 .で再ビルドし、古いコンテナを停止・削除して新しいタグから起動します。開発中に毎回ビルドするのが大変になったら、次のボリュームでバインドマウントを使います。

04

.dockerignoreで除外する

ビルドコンテキストには、必要なファイルだけを送ります。.env、依存関係のキャッシュ、ログ、Gitの管理情報などを送らないように.dockerignoreを作ります。

.dockerignoreTEXT
.git
.env
*.log
node_modules
vendor
秘密情報をイメージへ入れない

.envを除外しても、DockerfileのENV PASSWORD=...やビルド引数へ秘密情報を書くと、履歴やログに残ることがあります。秘密情報は用途に合うシークレット管理を使い、公開ポートや実行ユーザーも本番向けに見直します。