昨日は手作業で構成した 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 が動いているのを確認できた。