こんにちは、Mashです。
本業でDockerを触る機会がありまして、自分の知識整理のためと、せっかくならということで初学者さんに向けて記事を作成しています。
今回はDocker入門第2回です。
第1回で構築した環境や知識が前提となっていますので、もしまだご覧になられていない方がいらっしゃいましたらぜひご一読いただけるとうれしいです。
- Dockerfileを使って、独自のDockerイメージをビルド(作成)できるようになる
※本シリーズはDocker初心者向けではありますが、前提として多少のLinux知識が必要となります。ご了承ください。
それではいきましょう!
Dockerfileでカスタムイメージをビルドする
前回記事では、Docker Hubですでに公開されているnginxコンテナイメージをダウンロード(pull)して、起動したり停止したりしましたね。

実際にはこのように既製品のDockerイメージをそのまま使うことはあまりなく、各現場ごとに様々なカスタマイズ要件がでてきます。(この設定値がデフォルトだとダメ とか、追加のパッケージが必要 とか)

オリジナルのDockerイメージをつくりたい!
こんなときに使用するのが Dockerfile です。
What is Dockerfile?
繰り返しになりますが、Docker Hubにすでに公開されているDockerイメージで事足りることはほぼありません。
そうなると、各々でカスタマイズを加える必要がでてくるわけですが、このような状況でDockerfileが利用されます。
Dockerfileは独自のDockerイメージを作成する際の設計図です。
後ほど具体例を紹介しますが、いくつかの命令文から成り立っていて手順書代わりになります。実際には記載した内容が自動で実行されるので、Docker利用者の手間を省いてくれます。
下準備
それでは実機で確認していきましょう。
まずは今回実施する作業をわかりやすくするため、関係ないDockerコンテナやイメージはお掃除します。
# 今回実施する作業内容をわかりしやすくするためにお掃除
# 全コンテナ停止削除、全イメージ削除
$ docker rm -f $(docker ps -q)
$ docker image rm $(docker image ls -q)
$ docker ps -a
-> 結果なし。コンテナ削除完了
$ docker image ls
-> 結果なし。イメージ削除完了
カスタマイズイメージを作成するための準備を整えます。
# 練習用のディレクトリを作成(homeディレクトリが汚れるのが嫌いなだけです)
mkdir ./dockerfile-test01
cd ./dockerfile-test01
# Dockerfileを作成(中身は後ほどご紹介)
touch Dockerfile
# 動作確認用のindex.htmlを作成(中身は後ほどご紹介)
touch index.html
# ファイル確認
$ ls
Dockerfile index.html
説明の便宜上、先にindex.htmlの中身から。
<html> <body> Dockerfile TEST with nginx!! </body> </html>
めっちゃ適当だけど許して。笑
カスタマイズしたことがわかるだけでよいので、今回はシンプルなHTMLファイルを用意しました。
Dockerfileの作成
そして本題、Dockerfileを編集します。
前回記事では既製品のnginxイメージを使ってコンテナを起動しましたが、今回は素のdebianイメージに後からnginxをインストールする方法でオリジナルのDockerイメージを作成してみましょう。
FROM debian RUN echo "now bilding..." RUN apt-get update && apt-get install -y nginx RUN echo "docker file test dayo" > /etc/dockerfiletest EXPOSE 80 COPY ./index.html /var/www/html/ CMD ["nginx", "-g", "daemon off;"]
何が何やらわかりませんよね。ご説明します。
Dockerfileはいくつかの命令句から成り立っています。
命令句はもっといろいろ種類があるのですが、今回は概要を理解することが目的ですので最低限にしています。
こちらの概念図をしっかりイメージしながら以下読み進めてください。

FROM
FROM 句でカスタマイズのもととなるDockerイメージを指定します。
今回のようにDocker Hub公式リポジトリで公開されているものでもかまいませんし、自分で作成したオリジナルのDockerイメージを指定してもかまいません。
RUN
FROMで指定したDockerイメージは一度コンテナとして起動します。
RUN 句ではコンテナ内で実行するコマンドを指定します。
今回は下記3つのコマンドを実行します。
- echo コマンドで “now bilding…”と標準出力(あんまり意味ないです)
- apt-get コマンドでパッケージ更新と、nginxをインストール
- echo コマンドをリダイレクトし、”docker file test dayo” という中身のファイルを作成
大事なのは2だけですね。笑
EXPOSE
EXPOSE 句でコンテナ側の待受ポート番号を指定します。
特別な理由がない限りはコンテナで起動するプロセスのデフォルトポートでOKです。
今回はnginxを起動するDockerイメージなので80番ポートを指定しています。
COPY
COPY 句でDockerホストからコンテナへファイルをコピーします。
今回はnginxのデフォルトページを変更するために、index.htmlファイルをコンテナの/var/www/html/ディレクトリへコピーしています。
CMD
最後にCMD 句でDockerイメージからコンテナを起動した際に実行するコマンドを指定します。
今回はnginxをオプションつきで実行しています。
イメージをビルド
準備が整いましたので、Dockerイメージを作成(ビルド)してみましょう!
-t オプションでイメージ名を指定しています。
$ docker build . -t custom_nginx
Sending build context to Docker daemon 3.072kB
Step 1/7 : FROM debian
latest: Pulling from library/debian
e4c3d3e4f7b0: Pull complete
Digest: sha256:8414aa82208bc4c2761dc149df67e25c6b8a9380e5d8c4e7b5c84ca2d04bb244
Status: Downloaded newer image for debian:latest
---> 1510e8501783
Step 2/7 : RUN echo "now bilding..."
---> Running in 62a6fdceb324
now bilding...
Removing intermediate container 62a6fdceb324
---> 1a557cdf4074
Step 3/7 : RUN apt-get update && apt-get install -y nginx
---> Running in e7cd361de852
Get:1 http://security.debian.org/debian-security buster/updates InRelease [65.4 kB]
(中略)
Removing intermediate container e7cd361de852
---> 216fd9f4cab8
Step 4/7 : RUN echo "docker file test dayo" > /etc/dockerfiletest
---> Running in a726a72f1881
Removing intermediate container a726a72f1881
---> bbcd5378e3b2
Step 5/7 : EXPOSE 80
---> Running in 2bff206316e0
Removing intermediate container 2bff206316e0
---> eb0353f3590c
Step 6/7 : COPY ./index.html /var/www/html/
---> 31ccfdf67bbc
Step 7/7 : CMD ["nginx", "-g", "daemon off;"]
---> Running in 937d7f9e1d7a
Removing intermediate container 937d7f9e1d7a
---> 61711ab2539a
Successfully built 61711ab2539a
Successfully tagged custom_nginx:latest
「Step x/x」の部分にご注目ください。
Dockerfileの内容が処理されていることがおわかりいただけるかと思います。
さて、処理が終わったようですのでイメージが作成されているか確認してみましょう。
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
custom_nginx latest 61711ab2539a About a minute ago 196MB
debian latest 1510e8501783 4 weeks ago 114MB
元になったdebianのイメージ「debian」と、作成されたカスタマイズイメージ「custom_nginx」が作成されていますね!
それでは作成したイメージからコンテナを起動して、
$ docker run -d -p 80:80 custom_nginx
ブラウザでアクセスしてみると、、、

Webサービス(nginx)が起動してくれています!
また、nginxのデフォルトページではなくコピーしたテキトーHTML(index.html)の内容になってくれていますね。いいかんじ!
で、最後に。
DockerfileのRUN句で実行したこれ。
RUN echo "docker file test dayo" > /etc/dockerfiletest
正しく実行されていれば、コンテナ内に /etc/dockerfiletest ファイルが作成されているはず。

コンテナの中ってどうやって覗くの?
答えはこちら。
# コンテナIDを確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0beaa31ac77 custom_nginx "nginx -g 'daemon of…" 11 minutes ago Up 11 minutes 0.0.0.0:80->80/tcp vigilant_stonebraker
# docker execコマンドでコンテナ内でbashを実行
$ docker exec -it a0beaa31ac77 /bin/bash
-> コンテナへログイン成功
# コンテナ内でlsコマンドを実行
root@a0beaa31ac77:/# ls /etc/ |grep docker
dockerfiletest
# コンテナ内でcatコマンドを実行。ファイルの内容を確認
root@a0beaa31ac77:/# cat /etc/dockerfiletest
docker file test dayo
# exitコマンドでコンテナから抜ける
root@a0beaa31ac77:/# exit
$
ファイルが作成されて中身も意図したものになっていますね~。バッチリです!
ちなみに、コンテナの中でbashを起動するコマンド
docker exec -it <コンテナID> /bin/bash
これはよく使うので覚えちゃってください。
まとめ
以上、Dockerfileをつかったオリジナルイメージの作成方法をご紹介しました。
うまくできましたか?
コマンドのオプションなどは覚えなくてもいいですが、全体の流れを掴んでいただけてれば嬉しいです。
さて、せっかく作ったDockerイメージですからみんなにも使ってもらいたいですよね?
次回はDockerイメージを配布するための仕組み、Docker Hub についてお勉強します。
おたのしみに!
今回は以上です。
それじゃあまたね。
第3回をアップしました!ぜひご一読ください!