Chapter03 Docker File

はじめに

ここではDockerファイルの基本的な内容と記述方法をまとめます。Dockerでは、インフラ構成=コンテナの構成をDockerインストラクションに従って、Dockerファイルに記述することで、イメージを生成し、コンテナを構築します。Dockerファイルのベストプラクティスはこちら。

Dockerファイル

Dockerファイルは下記のDockerインストラクションによって記述されます。Dockerファイルはインフラ構成を記述するもので、ベースになるOSのイメージ、コンテナ内のコマンド、環境変数の設定などをDockerインストラクションなどを記述します。

インストラクション

説明

FROM

ベースイメージの指定

MAINTAINER

Dockerファイルのメンテナ

RUN

コマンド実行

CMD

コンテナの実行コマンド

LABEL

ラベルの設定

EXPOSE

ポートのエクスポート

ENV

環境変数の設定

ADD

ファイル/ディレクトリの追加。圧縮tarなどを解凍して追加したい場合。

COPY

ファイルのコピー

VOLUME

ボリュームのマウント

ENTRYPOINT

コンテナの実行コマンド

USER

ユーザの指定

WORKDIR

作業ディレクトリの

ONBUILD

ビルド完了後に実行されるコマンド

Dockerファイルの作成

それではDockerファイルを作成していきましょう。今回はデスクトップにdocker_contextというディレクトリを作成し、その中にDockerfileを作成します。

➜ cd ~/Desktop/

➜ mkdir docker_context

➜ cd docker_context/

➜ touch Dockerfile

ベースとなるOSを記述するFROMは必須で先頭に記述します。今回はこれだけでイメージビルドして、Dockerイメージが作成されるか確認します。

➜ cat Dockerfile 
FROM ubuntu:latest

buildコマンドでDockerfileがあるディレクトリを指定します。このDockerfileを格納している環境をビルドコンテキストなどと呼ばれます。

➜ docker build -t build_ubuntu:0.0 ~/Desktop/docker_context/
Sending build context to Docker daemon  2.048kB
Step 1/1 : FROM ubuntu:latest
latest: Pulling from library/ubuntu
a4a2a29f9ba4: Pull complete 
127c9761dcba: Pull complete 
d13bf203e905: Pull complete 
4039240d2e0b: Pull complete 
Digest: sha256:35c4a2c15539c6c1e4e5fa4e554dac323ad0107d8eb5c582d6ff386b383b7dce
Status: Downloaded newer image for ubuntu:latest
 ---> 74435f89ab78
Successfully built 74435f89ab78
Successfully tagged build_ubuntu:0.0

イメージが作成されているか確認すると、たしかに-tで指定したbuild_ubuntu:0.0というイメージが作成されている事がわかります。

➜ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
build_ubuntu        0.0                 74435f89ab78        2 weeks ago         73.9MB
ubuntu              latest              74435f89ab78        2 weeks ago         73.9MB

Dockerイメージのレイヤー

さきほどubuntuのイメージを取得した際に、下記のように表示されたと思います。これは、ubuntuのイメージが4つのイメージレイヤーから構成されていることを意味します。

a4a2a29f9ba4: Pull complete 
127c9761dcba: Pull complete 
d13bf203e905: Pull complete 
4039240d2e0b: Pull complete 

Dockerファイルからイメージを構成する場合、特定のDockerインストラクションごとにイメージレイヤーを構築しながらイメージを構成します。例えばRUNコマンドはイメージレイヤーを追加するコマンドです。下記のようにDockerイメージを書き換えて、

➜ cat Dockerfile 
FROM ubuntu:latest

RUN apt-get update

RUN apt-get install -y nginx

イメージビルドしてみるとわかります。-yはインストール中の選択肢でyesを選択するオプションです。Running inの部分でイメージレイヤーが構成されています。

~/Desktop/docker_context 
➜ docker build -t build_ubuntu:1.0 ~/Desktop/docker_context/
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM ubuntu:latest
 ---> 74435f89ab78            # 1つ目のイメージレイヤ
Step 2/3 : RUN apt-get update
 ---> Running in 3de940847895 # 2つ目のイメージレイヤ
Get:1 http://security.ubuntu.com/ubuntu focal-security InRelease [107 kB]
【略】
Get:17 http://archive.ubuntu.com/ubuntu focal-backports/universe amd64 Packages [2900 B]
Fetched 14.1 MB in 6s (2317 kB/s)
Reading package lists...
Removing intermediate container 3de940847895
 ---> c4f8c8b3b51c
Step 3/3 : RUN apt-get install -y nginx
 ---> Running in 0c821298759c # 3つ目のイメージレイヤ
Reading package lists...
【略】
Processing triggers for libc-bin (2.31-0ubuntu9) ...
Removing intermediate container 0c821298759c
 ---> cc2bb24d43c0
Successfully built cc2bb24d43c0
Successfully tagged build_ubuntu:1.0

➜ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
build_ubuntu        1.0                 cc2bb24d43c0        About a minute ago   155MB
build_ubuntu        0.0                 74435f89ab78        2 weeks ago          73.9MB
ubuntu              latest              74435f89ab78        2 weeks ago          73.9MB

ここでDockerファイルを作成する際に便利な知識としてキャッシュというものがあります。これは、再度同じコマンドを実行するのであれば、キャッシュを使うことで2回目以降は処理が速くおわります。curlというパッケージを更に追加して、

➜ cat Dockerfile 
FROM ubuntu:latest

RUN apt-get update

RUN apt-get install -y nginx

RUN apt-get install -y curl

イメージビルドしてみます。Using cacheと表示され、先程インストールしていたものはキャッシュが利用されインストールがすぐに終了します。Dockerファイルを作成する際はこのキャッシュを使いながら作成することで効率化を図ることができます。

➜ docker build -t build_ubuntu:2.0 ~/Desktop/docker_context/
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM ubuntu:latest
 ---> 74435f89ab78
Step 2/4 : RUN apt-get update
 ---> Using cache
 ---> c4f8c8b3b51c
Step 3/4 : RUN apt-get install -y nginx
 ---> Using cache
 ---> cc2bb24d43c0
Step 4/4 : RUN apt-get install -y curl
 ---> Running in 8de1bda56284
Reading package lists...
【略】
Processing triggers for ca-certificates (20190110ubuntu1.1) ...
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
Removing intermediate container 8de1bda56284
 ---> ccf5101224bc
Successfully built ccf5101224bc
Successfully tagged build_ubuntu:2.0

Dockerインストラクション

冒頭に紹介したDockerインストラクションの各役割について、基本的なコマンドについて、もう少し詳しくまとめていきます。

RUNコマンド

まずはRUNコマンドからです。RUNコマンドはDockerイメージを生成する際に実行したいコマンドがある場合に記述します。

下記のように記述すれば、Dockerイメージを生成する際に、apt-get updateapt-get install nginxapt-get install curlが実行されます。

$ cat Dockerfile
RUN apt-get update

RUN apt-get install -y nginx

RUN apt-get install -y curl

このままだと、Dockerファイルを構築する際に3つのイメージレイヤがRUNごとに生成されるので、まとめて記述します。

RUN apt-get update && apt-get install -y \
    nginx \
    curl

CMDコマンド

CMDコマンドはDockerイメージを生成したあとに、コンテナ内でコマンドを実行する場合に利用します。例えばubuntuのイメージのDockerファイルの最後には、コンテナに入るとbashが起動するように設定されています。

CMD ["/bin/bash"]

ENVコマンド

ENVコマンドは環境変数を設定するコマンドです。ENVコマンドで環境変数を指定しておけばコンテナを起動した際に環境変数を設定した状態で起動します。環境変数の指定の仕方はキーバリュー型で下記のように記述できます。

$ cat Dockerfile
FROM ubuntu:latest

ENV key1 "val1"
ENV key2=val2

CMD ["/bin/bash"]

イメージビルドしてコンテナを起動してみます。コンテナの環境変数にDockerファイルで指定した環境変数が指定されていることがわかります。

➜ docker build -t build_ubuntu ~/Desktop/docker_context/
Sending build context to Docker daemon  2.048kB
【略】
Successfully built 6ce0d7130333
Successfully tagged build_ubuntu:latest

➜ docker run -it --rm build_ubuntu bash
root@fefd4c983663:/# env | grep "key"
key2=val2
key1=val1

WORKDIRコマンド

WORKDIRコマンドはコマンドを実行するディレクトリを指定するコマンドです。WORKDIRコマンドで作業ディレクトリを指定して、テキストファイルをDockerファイルから作ってみます。

$ cat Dockerfile
FROM ubuntu:latest

WORKDIR /sample

RUN touch sample.txt

CMD ["/bin/bash"]

イメージビルドしていきます。コンテナを起動するとWORKDIRコマンドで指定したディレクトリにアクセスすることになります。テキストファイルも問題なく生成されていることが確認できます。

➜ docker build -t build_ubuntu ~/Desktop/docker_context/
【略】
Successfully built db587f73412b
Successfully tagged build_ubuntu:latest

➜ docker run -it --rm build_ubuntu bash
root@af616c59e1b5:/sample# ls  
sample.txt

ADDコマンド

ADDコマンドは、ビルドコンテキストにあるデータをイメージビルドの際に、tarなどの圧縮ファイルをコンテナで解凍して利用する場合になどに利用します。ここではビルドコンテキスト内に、data_in_hostというテキストファイルを保存して、これをコンテナに持っていきます。

➜ touch data_in_host
➜ echo "Data in Host" > data_in_host 

Dockerファイルは下記のように記述します。ADD <ホストのファイルパス> <コンテナのファイルパス>です。この際に、コンテナに指定したディレクトリがない場合、作成してくれます。

$ cat Dockerfile
FROM ubuntu:latest

ADD data_in_host /add_dir/

CMD ["/bin/bash"]

イメージビルドしてコンテナの中で確認すると、data_in_hostadd_dirに保存されていることがわかります。

➜ docker build -t build_ubuntu ~/Desktop/docker_context/
【略】
Successfully built fb8e25a8a40c
Successfully tagged build_ubuntu:latest

➜ docker run -it --rm build_ubuntu bash
root@6e66629a84b9:/# ls
add_dir  bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

root@6e66629a84b9:/# cd add_dir/

root@6e66629a84b9:/add_dir# cat data_in_host 
Data in Host

ADDコマンドと似たコマンドでCOPYコマンドがありますが、この例のようにコピーするだけの場合は、COPYコマンドを利用します。

以上でこのチャプターは終わりです。不要なイメージとコンテナを削除して次のチャプターに移動しましょう。

Last updated

Was this helpful?