第4 : Dockerfileについて
第4 : Dockerfileについて 参考:https://knowledge.sakura.ad.jp/15253/
Tomcatをホスト側にダウンロード (※ver 10.1.1)
サイトでtomcatとjreのバージョンを確認する
サイト:https://tomcat.apache.org/tomcat-10.1-doc/setup.html
→tomcat10はjreが11以上
tomcatダウンロード
$ curl -OL http://www-eu.apache.org/dist/tomcat/tomcat-10/v10.1.1/bin/apache-tomcat-10.1.1.tar.gz
移動
$ mkdir -p files $ mv ./apache-tomcat-10.1.1.tar.gz ./files
Dockerfileを使用して、Dockerイメージを作成
Dockerfile作成
サイトのままだとバージョンが古い&バージョン違いでエラーが出るので、以下に変更した。
FROM centos:7 RUN yum install -y java-11 ADD files/apache-tomcat-10.1.1.tar.gz /opt/ CMD [ "/opt/apache-tomcat-10.1.1/bin/catalina.sh", "run" ]
バージョンは、
tomcat:10.1.1
centos:7
java:11.0
Dockerビルド実行
Dockerイメージを作成するコマンド
TomcatのDockerイメージが作成できる
$ docker build -t tomcat:1 . // 略 Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them % docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat 1 d5ab17ea190e 2 minutes ago 577MB
「-t」はイメージのタグ付けオプション
作成されるイメージに対してタグ付けられる
名前とオプションでタグを 「名前:タグ」 の形式で指定
参考:https://docs.docker.jp/engine/reference/commandline/build.html#t
参考:https://docs.docker.jp/engine/reference/commandline/tag.html
書き方は以下のようになる
docker build -t <Dockerイメージ名> <Dockerfileが存在するディレクトリ>
コンテナ起動
% docker run -it -d --name tomcat-1 -p 8081:8080 tomcat:1 3742a78a65c18904ad15b038ada35b05861e1ef1b5ff3323257b9c5e2eb45bf8
確認
% docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3742a78a65c1 tomcat:1 "/opt/apache-tomcat-…" 5 seconds ago Up 4 seconds 0.0.0.0:8081->8080/tcp tomcat-1
ページ確認
ブラウザで以下を入れて表示確認
http://localhost:8081/
log確認
$ docker logs -f tomcat-1
書き方は以下
docker logs [OPTIONS] CONTAINER
「-f」オプション:
「--follow」の略
出力をフォローし続ける(表示し続ける)
「tomcat-1」:
コンテナ名
docker psで「NAMES」の欄に出てくる
参考:https://docs.docker.jp/engine/reference/commandline/logs.html
Dockerfileを書く際のポイントや嵌りどころ、注意点について
毎回コンテナを起動
・dockerコマンドごとに新しく起動したコンテナで実行されるので、次の行が前の行のコマンドを継承していない。
・コマンドを続けて書きたい時は、「&&」で連結させ使用する(シェルと同じように)
・たとえば以下、test.txtは/tmpに作成されない。
RUN cd /tmp # ⑤ RUN touch test.txt # ⑥
キャッシュを意識
・被る部分、似たような部分は最初の方に書いておく ・ex ) Dockerfile_2
FROM centos:7 RUN yum install -y java-11 RUN touch /tmp/test.txt ADD files/apache-tomcat-10.1.1.tar.gz /opt/ CMD ["/opt/apache-tomcat-10.1.1/bin/catalina.sh", "run"]
これをビルドすると
% docker build -t tomcat:2 -f Dockerfile_2 . [+] Building 1.3s (9/9) FINISHED => [internal] load build definition from Dockerfile_2 0.0s => => transferring dockerfile: 39B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/centos:7 1.2s => [1/4] FROM docker.io/library/centos:7@sha256:c73f515d06b0fa07bb18d8202035e739a494ce760aa73129f60f4bf2bd22b407 0.0s => [internal] load build context 0.0s => => transferring context: 82B 0.0s => CACHED [2/4] RUN yum install -y java-11 0.0s => CACHED [3/4] RUN touch /tmp/test.txt 0.0s => CACHED [4/4] ADD files/apache-tomcat-10.1.1.tar.gz /opt/ 0.0s => exporting to image 0.0s => => exporting layers 0.0s => => writing image sha256:fa40a923c1092c078ed002e6aeb6e5bbe6d3d715ad4badbf3fbd2cb0f209dad3 0.0s => => naming to docker.io/library/tomcat:2 0.0s Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
変更がない部分は、以前作成されたレイヤー(中間的なDockerイメージ)が使用されるため、Dockerビルドの処理時間が短くなる。
そのため、コマンドの実行順序を意識してDockerfileを書くとよい
なるべくまとめて実行
・Dockerfileの各コマンドごとにレイヤーが作成されるので、その分Dockerイメージのサイズが大きくなる。そのため、なるべく1コマンドで実行できるものは、まとめて実行する
・作成できるレイヤーには上限(128レイヤー)がある