SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【Docker】入門⑥ 初めてのDockerfile どんなものか理解する

Dockerfile

Dockerfileとは

Dockerについて調べたりしたことがある人なら一度は見たことがあるであろうDockerfileとはいったいなんなのでしょうか。

Dockerfileとは、Docker上で動作させるコンテナの構成情報を記述するためのファイルのことです。
Dockerfileを活用することでこれまで一つ一つコマンドで実行してきたDockerイメージの取得や設定を省くことができるわけです。

ここで言うコンテナの構成情報と以下のようなものです。

・ベースとなるDockerイメージ
・Dockerコンテナでのコマンド(インストール、アプリの設定など)
・環境変数などの設定
・Dockerコンテナ内で動作させるデーモン実行


DockerfileをDockerBuildコマンドによりイメージを生成することになります。
イメージ的には以下のような感じでしょうか。

f:id:wantanBlog:20200219231547p:plain

Dockerfileの作成

実際にDockerfileの作成を行ってみます。
Dockerfileは識別子などは不要で「Dockerfile」という名前で生成するか、任意の名前で生成し実行時に名前を指定して実行するようです。

Dockerfileは記述は通常使用しているエディタでOKです。
私の場合はLinux上にDockerをインストールしているのでvimを使用しています。

簡単なことを実行する場合には記述方法もシンプルで以下の形式で記述していきます。

[命令] [引数]

実際にイメージを沸かすために具体的なものを例示してみます。

mysqlのDockerイメージを取得するDockerfile

# ベースイメージの取得
FROM mysql

Pythonやシェルスクリプトと同様に「#」でコメントとして認識させることができます。
命令自体はいろいろあり、様々なことができるようになりますが、それはおいおい。

Dockerfileのビルドとイメージレイヤー

Dockerfileのビルド

先ほど作成したDockerfileのビルドを実行してみます。
Dockerfileのビルドは以下のコマンドにより実行します。

docker build -t [イメージ名]:[タグ名] [Dockerfileの格納場所]


私の場合、実際の実行コマンドは以下のようになります。

docker build -t mysqldb:1.0 /home/ec2-user/docker_work

今回の場合はmysqlのイメージをプルしているので以下のような実行の様子が表示されます。

Sending build context to Docker daemon 2.048kB
Step 1/1 : FROM mysql
latest: Pulling from library/mysql
619014d83c02: Pull complete
9ced578c3a5f: Pull complete
731f6e13d8ea: Pull complete
3c183de42679: Pull complete
6de69b5c2f3c: Pull complete
00f0a4086406: Pull complete
84d93aea836d: Pull complete
f18efbfd8d76: Pull complete
012b302865d1: Pull complete
fe16fd240f59: Pull complete
ca3e793e545e: Pull complete
51d0f2cb2610: Pull complete
Digest: sha256:6d0741319b6a2ae22c384a97f4bbee411b01e75f6284af0cce339fee83d7e314
Status: Downloaded newer image for mysql:latest
---> 791b6e40940c
Successfully built 791b6e40940c
Successfully tagged mysqldb:1.0

Dockerイメージのlsコマンドでイメージ一覧を表示すると以下のようにイメージが生成されていることがわかります。

REPOSITORY TAG IMAGE ID CREATED SIZE
mysqldb 1.0 791b6e40940c 2 weeks ago 465MB
mysql latest 791b6e40940c 2 weeks ago 465MB

上記の例では上(mysqldb)が名前を指定して生成したイメージで、下はベースイメージそのままになります。
このことから、さきほどのDockerfileを再度利用すると今後は実行環境に存在するベースイメージからイメージを生成できます。

例えば、先ほどのコマンドで指定したタグ名を変えることで全く同様のイメージを生成できるということです。

docker build -t mysqldb:2.0 /home/ec2-user/docker_work

・実行後

REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 791b6e40940c 2 weeks ago 465MB
mysqldb 1.0 791b6e40940c 2 weeks ago 465MB
mysqldb 2.0 791b6e40940c 2 weeks ago 465MB

Dockerイメージのレイヤー構造

DockerfileをビルドしてDockerイメージを作成させると、Dockerイメージは命令ごとのレイヤー構造を生成します。

Dockerfileに以下のような記述をした場合を考えます。

# ベースイメージの取得
FROM centos

#tmuxのインストール
RUN yum -y install tmux

#ファイルのコピー
COPY copy.txt /home

Dockerfileを実行します。

docker build -t testos:1.0 /home/ec2-user/docker_work

イメージのレイヤー構造を以下のコマンドで確認できます。

docker build -t testos .

・出力結果

Sending build context to Docker daemon 2.56kB
Step 1/3 : FROM centos
---> 470671670cac
Step 2/3 : RUN yum -y install tmux
---> Using cache
---> 97b96915d6ad
Step 3/3 : COPY copy.txt /home
---> Using cache
---> a0b84c803041
Successfully built a0b84c803041
Successfully tagged testos:latest

イメージの一覧を確認すると最後の更新後のイメージIDと一致していることが分かります。

REPOSITORY TAG IMAGE ID CREATED SIZE
testos 1.0 a0b84c803041 17 minutes ago 275MB

以下のような感じになっているということでしょうか。

f:id:wantanBlog:20200222160800p:plain


次回はRUNコマンドについて細かく見ていき、もう少し実践的に使えるレベルまでに行きたいと思います。