Dockerfileを使ってDockerイメージを作る

昨日は手作業で構成した Docker コンテナから Docker イメージを作った。

だけど、この方法だと同じイメージを再度作るにも手作業を行わなければならない。全く同じイメージでいいならイメージを使い回せばいいけど、ちょっと何かを付け足したいとしたら?あるいは構成するソフトウェアをバージョンアップしたいとしたら?

Docker にはイメージを構成する手順を既述したファイル(Dockerfile という名前)を使ってイメージをビルドする機能がある。Dockerfile はテキストファイルなので、変更するのも簡単だし、何より Git 等で管理することができる。これは OS 設定などを含めたインフラ構築をコード化できることを意味していて、「Infrastructure as Code (IaC)」と呼ぶ。

今日は Dockerfile を記述して、それをもとに Docker イメージを作り、コンテナを起動するまでを試してみる。

目標

昨日と同じ、CentOS 上で Tomcat が動作するコンテナを作る。

参考ページと作業前の準備

つぎのページを参考にした。

また、混乱しないように、昨日までに作ったイメージとコンテナは全て削除した。

ファイル構成

つぎの通り:

takatoh@apostrophe $ tree .
.
├── Dockerfile
└── files
      └── apache-tomcat-9.0.34.tar.gz

Dockerfile のほかに ./files/apache-tomcat-9.0.34.tar.gz があるのは、コンテナの外(ホスト側)からコピーしたいから。コンテナの中でダウンロードしてもいいのかもしれないけど、昨日までの例に従って、予めダウンロードしておいたファイルをコピーする。

で、Dockerfile はつぎのように記述した。

FROM centos:7
RUN yum install -y java
ADD files/apache-tomcat-9.0.34.tar.gz /opt/
CMD [ "/opt/apache-tomcat-9.0.34/bin/catalina.sh", "run" ]

4行ある。各行は <命令> <引数> ... となっていて、Docker はこれを1行ずつ実行してイメージを構成する。順に見ていこう。

  • FROM はベースとなる Docker イメージを指定する。Dockerfile の命令は FROM で始まる必要がある。イメージがローカルになくても Docker Hub から取ってきてくれる。
  • RUN はコンテナの中で実行するコマンドを指示する。ここでは java をインストールしている。
  • ADD はホスト側にあるファイルをコンテナ内にコピーして展開する。
  • CMD はコンテナを起動した時に実行するコマンドを指定する。

イメージの作成

準備ができたので Docker イメージを作ろう。docker build コマンドを使う。

takatoh@apostrophe $ sudo docker build -t tomcat:1 .

-t オプションはイメージ名の指定、引数の . は Dockerfile のあるディレクトリを指定している。

これでイメージができた。

takatoh@apostrophe $ sudo docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
tomcat              1                   6f24f0e76833        About a minute ago   477MB
centos              7                   b5b4d78bc90c        2 days ago           203MB

tomcat というイメージがいま作ったもの。centos はベースとするために Docker Hub から撮ってきたものだ。

起動確認

最後に、ちゃんとコンテナが起動するか、確認しよう。

takatoh@apostrophe $ sudo docker run -it -d --name tomcat-1 -p 18081:8080 tomcat:1

ブラウザで localhost:18081 にアクセスすると、期待通り Tomcat が動いているのを確認できた。