第4 : Dockerfileについて

第4 : Dockerfileについて 参考:https://knowledge.sakura.ad.jp/15253/

Tomcatをホスト側にダウンロード (※ver 10.1.1)

サイトでtomcatjreのバージョンを確認する

サイト: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」はイメージのタグ付けオプション
作成されるイメージに対してタグ付けられる
名前とオプションでタグを 「名前:タグ」 の形式で指定

リポジトリ名 → tomcat タグ → 1

参考: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レイヤー)がある

Dockerfileを使うことの利点

Infrastructure as Code (IaC)、CI/CD

Dockerイメージの管理