設定ファイルでコンテナの状態を残す

Dockerに慣れる : 変更したコンテナイメージを保存する では変更毎にコンテナイメージを生成することで変更内容を保存していたが、ほかにスマートな方法がいくつかあるらしい。 その内で今回は Dockerfile からコンテナイメージを生成する方法を見てみる。

参考:

Dockerfile とは

Dockerfileとは、Dockerイメージをビルドする指示を記載したプレーンテキストファイルです。開発環境におけるMakefileのように、Dockerで定義されている書式に従って記述します。

ファイルには、ベースとするイメージの取得やコンテナ内部で処理を行うコマンド等を記載していきます。


Dockerfileを使用するメリットとして、以下が挙げられます。

  • ファイルを配布することで同一の環境を複製できる。常に同じ構成で環境構築することができる。
  • ファイルの記述を読むことで、アプリケーション構成や構築手順などの情報を確認することができる。
  • ビルドコマンド1つでコンテナが生成できるため、構築作業の省力化や作業ミスの低減にも役立つ。

Dockerに慣れる : 変更したコンテナイメージを保存する で内部に入って変更していたことを Dockerfile で自動化できるらしい。 同時に、他人に Dockerfile を渡せば同様の環境をすぐに構築できるらしい。

Dockerfile を作成する

まず任意の場所(今回はユーザーディレクトリ直下に「docker」ディレクトリを用意しました)に、 「Dockerfile_httpd_build」という名前でファイルを作成します。

$ touch Dockerfile_httpd_build

そして、以下の様にファイルを編集してみます。

#--------------------------------------------------------
# ベースイメージを指定
#--------------------------------------------------------
FROM httpd:latest
#--------------------------------------------------------
# イメージの作成者
#--------------------------------------------------------
MAINTAINER PublicRelations
#--------------------------------------------------------
# 環境変数
#--------------------------------------------------------
ENV DIRPATH /usr/local/apache2
#--------------------------------------------------------
# ワークディレクトリ指定
#--------------------------------------------------------
WORKDIR $DIRPATH/htdocs
#--------------------------------------------------------
# コマンド実行
#--------------------------------------------------------
RUN echo "Hello Dockerfile!" > index.html
#--------------------------------------------------------
# 特定のネットワーク・ポートをコンテナ実行時にリッスンさせる
#--------------------------------------------------------
EXPOSE 80
FROM
ベースとなるイメージを指定します。一番始めに書かれていなくてはなりません。
MAINTAINER
生成するイメージの製作者(Author)を指定します。
ENV
環境変数を「 <変数名> <値>」で指定します。
WORKDIR
作業ディレクトリを指定します。
RUN
シェル形式のコマンドを実行します。
EXPOSE
コンテナが接続用にリッスンするポートを指定します。

やってみる。 適当なディレクトリを作成し、以下に Dockerfile を作成する。

$ mkdir test
$ cd test
$ vimr Dockerfile

以下のように Dockerfile を作成する。

FROM httpd:latest

MAINTAINER dummy

ENV DIRPATH /usr/local/apache2

WORKDIR $DIRPATH/htdocs

RUN echo "Hello Dockerfile!" > index.html

EXPOSE 80

コンテナイメージをビルドする。

ファイルを保存したら、以下のコマンドでイメージのビルドを実行します。

$ docker build -f ./Dockerfile_httpd_build -t httpd_build .
  • -f でDockerfileを指定、-t で生成するイメージ名を指定します。
  • 最後の「ピリオド」は Dockerfile のあるディレクトリを指定しますが、 今回はカレントに置いてあるので「ピリオド」のみとしています。

やってみる。

$ docker build -t httpd_build .
Sending build context to Docker daemon  2.048kB
Step 1/6 : FROM httpd:latest
latest: Pulling from library/httpd
8559a31e96f4: Pull complete 
bd517d441028: Pull complete 
f67007e59c3c: Pull complete 
83c578481926: Pull complete 
f3cbcb88690d: Pull complete 
Digest: sha256:387f896f9b6867c7fa543f7d1a686b0ebe777ed13f6f11efc8b94bec743a1e51
Status: Downloaded newer image for httpd:latest
 ---> ccbcea8a6757
Step 2/6 : MAINTAINER dummy
 ---> Running in 96183640bed4
Removing intermediate container 96183640bed4
 ---> 33aa3e26cb4e
Step 3/6 : ENV DIRPATH /usr/local/apache2
 ---> Running in a5cc85ee0490
Removing intermediate container a5cc85ee0490
 ---> 1dd11a332f5e
Step 4/6 : WORKDIR $DIRPATH/htdocs
 ---> Running in 0b6bdf1a69d4
Removing intermediate container 0b6bdf1a69d4
 ---> 2a34893eedb0
Step 5/6 : RUN echo "Hello Dockerfile!" > index.html
 ---> Running in a4a269148851
Removing intermediate container a4a269148851
 ---> 62ee492879cf
Step 6/6 : EXPOSE 80
 ---> Running in 19421a303205
Removing intermediate container 19421a303205
 ---> 204640489621
Successfully built 204640489621
Successfully tagged httpd_build:latest

できたらしいのでコンテナイメージを確認する。

 $ docker images
REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
httpd_build                            latest              204640489621        6 seconds ago       166MB
dotnetsdk3.1alpine3.12                 latest              25db00bce912        7 hours ago         422MB
mcr.microsoft.com/dotnet/core/aspnet   3.1-alpine3.12      4213a3f7e30c        8 days ago          105MB
httpd                                  latest              ccbcea8a6757        2 weeks ago         166MB

httpd_build イメージができている。動作させてみる

$ docker run -d -p 8080:80 httpd_build
96f8aede5a011f2624a40a44c17287154e52c7a4a6a0b8c2781f3641c3acca3f
$ docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
96f8aede5a01        httpd_build         "httpd-foreground"   6 seconds ago       Up 5 seconds        0.0.0.0:8080->80/tcp   brave_kowalevski

ブラウザで動作を確認する

Dockerfile が変更できたようだ