はじめに
こんにちは。株式会社ジールの @yszdh です。
Dockerを学び始めると、必ず登場するのが "Dockerfile" です。
Dockerイメージを作成するために必要なファイルですが、「Dockerfileってそもそも何?」「なぜ必要なの?」といった疑問を持つことが多いと思います。
この記事では、公式のnginxイメージを例にしながら、Dockerfileの役割と主要命令について整理します。
Dockerfileとは
Dockerfileとは、Dockerイメージを作成するための設計書です。
Dockerコンテナは「Dockerイメージ」から作成されます。
そしてDockerイメージは、Dockerfileに書かれた手順をもとに作成されます。
例えば以下のように記述します。
FROM nginx:latest
COPY ./html /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
このDockerfileを使うことで、
- nginxをベースにする
- ローカルのhtmlファイルをコピーする
- 80番ポートを公開する
- nginxを起動する
という環境を再現できます。
なぜDockerfileが必要なのか
1. 環境をコードとして管理できる
Dockerfileがない場合、コンテナを新しく作成するたびに、必要な設定を手動で実施する必要があります。
手作業で構築すると、「手順を忘れる」「人によって差異が出る」「再現性がない」といった問題が発生します。
しかし、Dockerfileを使えば、環境構築手順をコードとして保存ができるため
docker buildだけで同じ環境を再現できます。
つまりDockerfileは、環境構築を自動化し、再現可能にするための仕組み、と言えます。
2. チーム開発で同じ環境を共有できる
DockerfileをGitHubで共有すれば、チーム全員が同じ環境を構築できます。
例えば、OS、ライブラリ、バージョンなどを統一できます。
「自分のPCでは動くが、他の人のPCでは動かない」という問題がなくなるのがメリットです。
3. 自動化しやすい
CI/CDでもDockerfileはよく使われます。
例えばGitHub Actionsで、docker buildを実行すれば、自動で同じDockerイメージを作成できます。
Dockerfileの基本構成
今回は公式のnginxイメージを使ったシンプルな例を見ていきます。
FROM nginx:latest
WORKDIR /usr/share/nginx/html
COPY index.html index.html
EXPOSE 80
RUN apt update && apt install -y curl
ENV env_key env_value
CMD ["nginx", "-g", "daemon off;"]
Dockerfileの主要命令
FROM
ベースとなるDockerイメージを指定します。
ここでは、nginxとlatestタグのイメージを利用しています。
WORKDIR
コンテナ内での作業ディレクトリを指定します。
Linuxでいう "cd" のようなものです。
以降の命令は、このディレクトリを基準に実行されます。
COPY
ローカルファイルをコンテナ内へコピーします。
この例では、ローカルの index.html を、作業ディレクトリの index.html へコピーしています。
EXPOSE
コンテナが利用するポートを示します。
ここではnginxが使用する80番ポートを指定しています。
ただし、EXPOSEだけでは外部公開されません。
実際に公開するには、docker run -p 8080:80のようにポートマッピングが必要です。
CMD
コンテナ起動時に実行するコマンドを指定します。
ここではnginxを起動しています。
daemon off; とは?
通常nginxはバックグラウンド起動します。
しかしDockerコンテナでは、メインプロセスが終了するとコンテナも終了してしまいます。
そのため、daemon off;を指定してフォアグラウンド実行しています。
docker run -d との違い
daemon off; と docker run -d は別の概念です。
| 意味 | |
|---|---|
daemon off; |
nginxがコンテナ内でフォアグラウンド実行される |
docker run -d |
コンテナ自体をターミナルから切り離して実行する |
-d はターミナルを占有しないだけで、コンテナ内のプロセスの動作には影響しません。
daemon off; があることで、-d で起動してもコンテナは終了せず動き続けます。
RUN
Dockerイメージ作成時にコマンドを実行します。
主に、パッケージインストール・ライブラリ追加・ビルドなどで利用されます。
ENV
コンテナ内の環境変数を設定します。
設定した環境変数は、コンテナ内のアプリケーションから参照できます。
実際に試してみる
ファイルを準備する
ここでは、ローカルの Documents フォルダ内に my-nginx ディレクトリを作成して進めます。
以下のディレクトリ構成でファイルを作成します。
Documents/
└── my-nginx/
├── Dockerfile # 拡張子なし・先頭大文字
└── index.html
index.html の内容は以下のとおりです。
<!DOCTYPE html>
<html>
<body>
<h1>Hello Docker</h1>
</body>
</html>
Dockerfile は index.html と同じディレクトリに配置します。
Dockerfileからイメージを作成する
my-nginx ディレクトリへ移動し、以下でイメージを作成できます。
本記事では WSL2 で実行していますが、Mac・Linux・Windows PowerShell でも同様に実行できます。
cd ~/Documents/my-nginx
docker build -t my-nginx .
コンテナを起動する
docker run -p 8080:80 my-nginx
フォアグラウンドで実行されるため、ターミナルがnginxのログ出力に占有されます。
停止するにはCtrl + Cを押してください。
ブラウザで以下へアクセスができます。
http://localhost:8080
アクセスすると、「Hello Docker」と表示されます。
クリーンアップ
Ctrl + C でコンテナを停止した後、以下のコマンドで後片付けができます。
# コンテナの停止・削除
docker stop <コンテナID>
docker rm <コンテナID>
# イメージの削除
docker rmi my-nginx
まとめ
Dockerfileとは、Dockerイメージを作成するための設計書です。
Dockerfileを使うことで、
- 環境構築をコード化できる
- 同じ環境を再現できる
- チーム共有しやすい
- CI/CDで自動化しやすい
というメリットがあります。
今回紹介した、FROM・WORKDIR・COPY・EXPOSE・RUN・ENV・CMDを理解すると、Dockerfileが読みやすくなります。
参考
本記事を作成するうえで、以下の資料を参考にさせていただきました。
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください:
