前回はDocker Incが提供するofficalのコンテナイメージを用いてWordPressを起動したが、実際に利用するときにはPHPやApacheを必要な設定に変更することがしばしばある。これに対応するひとつの手段として、独自のWordPressのコンテナイメージを作成する、という方法がある。今回は、この独自コンテナイメージの作成について説明する。

Dockerのコンテナイメージの作成方法

コンテナイメージを作成する前に、第2回で構成したDocker環境(Dockerホスト)が所有しているコンテナイメージを確認する。

$ docker  image ls

コマンドを実行すると、第2回で起動したhello-word、第3回で起動したwordpress、mysqlと今まで使用したコンテナイメージが表示されるはずだ。

本来はdocker image pullコマンドでDocker Hubなどからコンテナイメージをダウンロードしてから、docker container runコマンドを実行してコンテナイメージを起動する。

docker container run コマンドは、Dockerホストに対象のコンテナイメージがない場合、Docker Hubなどから自動的にダウンロードされる

前回までの説明では、コンテナを簡単に理解するために詳細は省略してきたが、本来は、コンテナイメージをDockerホストにダウンロードして利用するコンテナを起動する。ユーザが独自に作成したコンテナイメージは、Dockerホストでコンテナイメージを作成することにより、利用できる。

コンテナイメージ作成には2つの方法がある。

1.コンテナからイメージを作成する

利用しているコンテナをそのままコンテナイメージにしたい場合は、docker container commitコマンドを実行する必要がある。nginxという名前のコンテナを、別名のwebserverというコンテナイメージで管理するには、以下のdocker container commitコマンドを実行すればよい。

$ docker container  commit  nginx webserver

このコンテナイメージの作成方法は、コンテナを個人で利用するには直感的でわかりやすいが、次のようなデメリットがある。

・対象のコンテナイメージを誰が作成したかわからない
・対象のコンテナイメージはどういった処理がおこなわれたイメージだかわからない

これに対しDockerでは、もうひとつコンテナイメージの作成方法を提供している。それが、Dockerfileをビルドしてイメージを作成する方法だ。

2.Dockerfileをビルドしてイメージを作成する

Dockerfileとは、コンテナを構成する実行コマンドなどが記載されているテキストファイルである。Dockerfileでのコンテナイメージ作成は、docker image buildコマンドでビルドする必要がある。docker image buildコマンドは以下の形式となる。

docker  image build [OPTIONS] PATH | URL | -

上記のPATHをDockerfileのあるディレクトリに指定して実行することで、DockerはDockerfileを記載順に読み取り、実行し、コンテナイメージを作成する。

簡単なDockerfileで手順を説明しよう。

①Dockerfileを用意する

適当なディレクトリを作成し、そこにDockerfileという名前のテキストファイルを作成する。ここではubuntu-nginxというディレクトリを作成し、そこにDockerfileを作成する。


$ mkdir ubuntu-httpd; cd $_
$ touch Dockerfile

②Dockerfileを編集する

Ubuntuのコンテナにnginxパッケージをインストールしたコンテナイメージを作成したい場合は、このように記載すればよい。

FROM ubuntu
LABEL maintainer="docker_image_creator"
RUN apt-get update && apt-get install -y nginx 

Dockerfileは、1行ごとに以下の形式で記載していくことで、1行目から実行される。

[命令] [引数]

このDockerfileで使用した命令は、下記にまとめた。

命令 説明
FROM 作成元となるコンテナイメージを指定する。今回は、Ubuntuのコンテナイメージを指定している。
LABEL コンテナイメージにメタデータを追加する。追加したメタデータは、docker image inspectコマンドで確認することができる。今回は、作成者を記載するmaintainerというキーに作成者の名前を追加している。
RUN 作成元のコンテナイメージに記載したコマンドを実行し、実行結果を反映する。今回は、以下のコマンドを実行している。
apt-get update && apt-get install -y nginx

そのほかの命令はDockerfile referenceにまとめられているので、興味がある人はチェックしてほしい。

Dockerfile reference | Docker Documation

③Dockerfileをビルドしてコンテナイメージにする

Dockerfileが作成できたら、docker image buildコマンドを実行してコンテナイメージにする。コンテナイメージの名前をubuntu-nginxにしたい場合は、以下のコマンドを実行すればよい。

docker  image build ?t ubuntu-nginx .

このdocker image buildコマンドで使用しているオプションは、下記にまとめた。

命令 説明
-t コンテナイメージの名前、およびタグを設定する。
(コンテナイメージの名前):(タグ※)
今回は、コンテナイメージの名前をubuntu-nginxとしており、タグを設定していないので自動的にlatestが挿入される。

※コンテナイメージにはタグを設定することができ、タグごとに別のコンテナイメージとして管理することができる。主な利用用途として、バージョン管理が挙げられる。

このコンテナイメージの作成方法は、初めにDockerfileを作成して構築手順を記載する手間はある。しかしながら、構築内容や作成者が明確にすることができるため、とても保守性が高くなっていることに加えて、Dockerfileを共有すれば誰でも構築が可能である。そのため、Dockerでのコンテナイメージ作成はDockerfileによる作成手順が主流となっている。

それでは、独自のコンテナイメージをDockerfileで作成したい場合はどのようにすればよいのか、WordPressのコンテナイメージ作成を例に説明する。

独自のWordPressコンテナイメージの作成

いざ、Dockerfileで独自のコンテナイメージを作成しようとしても、サンプルなど参考となる情報がなければ作成は不可能だ。では、Dockerfileはどこにあるのか。WordPressであれば、Docker HubにDockerfileが公開されている。

Library/wordpress ? Docker Hub

WordPressにかぎらず、Docker HubにあるコンテナイメージはDockerfileが公開されているので、書き方がわからない、設定方法がわからないなどがあればDocker HubにあるDockerfileを参考にすればよい。今回参考にするDockerfileは、php7.0とApacheで構成されたWordPressとする。

php7.0/apache/Dockerfile

このDockerfileについて、行ごとに説明する。

行数 説明
1 PHP 7.0とApacheが構成されたコンテナイメージを利用
2~14 WorePressに必要なパッケージのインストールと不必要なパッケージの削除
19~26 Opcacheの設定追加
28 Apacheのrewrite、expiresモジュールを有効化
30 サーバホストにコンテナ内の/var/www/htmlをマウント
32~33 環境変数の設定
35~41 WordPressのダウンロードと展開
43 docker runコマンドで設定する環境変数の処理をおこなうシェルスクリプトファイル配置
45 43のシェルスクリプトファイルを実行
46 Apacheを実行

このようにDockerfileの内容を確認すると、php.iniはカスタマイズされていないことがわかる。カスタマイズしたphp.iniを格納したコンテナイメージにしたいのであれば、Dockerfileがあるディレクトリへ独自に作成したphp.iniを配置し、以下のコマンドを追加すればよい。

COPY php.ini /usr/local/etc/php/

php.iniの配置場所については、phpのコンテナイメージに記載してある。

library/php ? Docker Hub

ApacheのpreforkのMaxConnectionsPerChildを1,500に切り替えたいのであれば、以下のコマンドを追加すればよい。

RUN sed -e "s/MaxConnectionsPerChild   0/ MaxConnectionsPerChild   1500/g" /etc/apache2/mods-available/mpm_prefork.conf

このように、いちからDockerfileを作らなくても、カスタマイズした独自のコンテナイメージ用のDockerfileを作成できることも大きな魅力のひとつだ。では、作成したDockerfileをビルドしてみる。ビルドに必要なファイルは、以下の3つだ。

・上記コマンドを追記したDockerfile
docker-entrypoint.sh
・独自に作成したphp.ini

これを同一のディレクトリに配置した後、docker image buildコマンドを実行する。コンテナイメージの名前をmy-wordpressとした場合、以下のコマンドを実行すればよい。

docker  image build ?t my-wordpress .

上記コマンド実行後、docker image lsコマンドでmy-wordpressという名のコンテナイメージを確認することができれば、コンテナイメージの作成は完了だ。あとは、このコンテナイメージをdocker container runコマンドで起動するだけである。


$ docker container run \
   --name my-wordpress \
   --link wordpress-mysql:mysql \
   -e WORDPRESS_DB_PASSWORD=mysql \
   -p 8080:80 \
   -d \
   my-wordpress

今回までコンテナの起動、作成方法を説明してきたが、実際に運用ではこのような手間が発生するのではと想像する人もいるであろう。

・複数のコンテナイメージを運用する場合、コンテナをひとつひとつdocker container runコマンドで起動しなければいけない
・独自のコンテナイメージは、DockerホストにDockerfileをダウンロードしてビルドしなければいけない

では、もっと便利にDockerを活用するにはどのようにすればいいのかか、次回の「Dockerを便利に活用する」で説明する。

CloudGarage開発担当
IaaS型パブリッククラウドサービス「CloudGarage」の開発エンジニア。バックエンドのサーバ構築からフロントのアプリケーション開発まで幅広く行う。「Docker」は実務でも頻繁に利用するため、実際に使っている立場から「Docker」について解説をする。