Dockerであそぶ(4)Apacheの設定を変える


ここ1,2年で注目を集めている仮想化技術の1つ「Docker」について、今更感がありますが試していきたいと思います。
他の仮想化技術との違いや特徴、開発環境として使っていくにはどうすればいいかなどを紹介していきたいと考えています。

これまでの連載

コンテナの設定を変えるには…?

Dockerのコンセプトとしてコンテナは状態が変化せず、いつ起動しても同じ状態になっているという点があります。今回の題目である「Apacheの設定を変える」を実現するためにただ単に設定を変えるだけならば、前回やったように設定ファイルをホスト側に持たせてvolumeを使ってマウントさせる方法をとることもできます。
しかし、一般的にサーバーの設定を変更するときにはコンテナの元となるコンテナイメージを変更し、設定変更を永続化しておくという方法がとられるようです。

コンテナイメージを変更するには「Dockerfile」というChefでいうところレシピにあたるファイル、VagrantでいうところVagrantfileにあたるファイルを作成し、そのレシピを使ってイメージを再作成(ビルド)します。
Dockerfileに記述できるコマンドはたくさんありますが、ひとまず詳しい説明は省き使ってみたいと思います。

コンテナのhttpd.confを取得する

今回作成するオリジナルイメージのベースには前回pullしたhttpdの公式イメージを使いたいと思います。
ひとまずその公式イメージで使われているhttpd.confファイルを取得しましょう。

コンテナを起動します。基本的には前回実行したコマンドと同じですが、起動したコンテナを残しておきたいため、「–rm」オプションは外しています。

$ docker run -it -p 80:80 -v //c/Users/sudoy/Documents/docker/httpd/public-html/:/usr/local/apache2/htdocs/ httpd:latest

起動したら「CTRL+C」でコンテナを終了しておきましょう。

次のコマンドでコンテナIDを確認します。

$ docker ps -a
sudoy@SUDOY-NOTE MINGW64 ~
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS                     PORTS               NAMES
1d3ad56d0c6e        httpd:latest        "httpd-foreground"   13 seconds ago      Exited (0) 9 seconds ago                       small_pare

この場合は「1d3ad56d0c6e」になります。このIDを使ってコンテナの内部からファイルをコピーすることができます。

コンテナ内部からファイルをコピーするには「docker cp」コマンドを使用します。
引数は「コンテナID:コンテナパス ローカルパス」と指定します。

$ docker cp 1d3ad56d0c6e:/usr/local/apache2/conf/httpd.conf Documents/docker/httpd/

以下のフォルダをエクスプローラーで確認してみてください。httpd.confが保存されているはずです。

C:\Users\sudoy\Documents\docker\httpd

※パスは筆者の環境になりますので、適宜読み替えてください。

httpd.confの設定を変更する

では、取得した「httpd.conf」ファイルの設定を変更してみましょう。
あまり意味はないですが、今回はポート番号を80から8080に変更してみました。

変更前

#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the 
# directive.
#
# Change this to Listen on specific IP addresses as shown below to 
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 80


変更後

#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the 
# directive.
#
# Change this to Listen on specific IP addresses as shown below to 
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
#Listen 80
Listen 8080 # ← 変更箇所!

コンテナイメージを作成する

いよいよオリジナルのコンテナイメージの作成です。
以下のフォルダにレシピとなる「Dockerfile」を作成します。

FROM httpd:latest
COPY ./httpd.conf /usr/local/apache2/conf/httpd.conf
コマンド 説明
FROM 作成するイメージのベースとなるコンテナイメージを指定します。
今回は前回使用したhttpd:lastestを指定しています。
COPY ホストのファイルをコンテナイメージ内部にコピーするコマンドです。
変更したhttpd.confファイルと置き換えています。

このファイルを使ってオリジナルのコンテナイメージを作成します。

$ cd Documents/docker/httpd/
$ docker build -t my-httpd .

「docker build」コマンドの「-t」オプションは作成するコンテナイメージにタイトル(名前)をつけるためのオプションです。最後の「.」はカレントディレクトリにある「Dockerfile」を使用するということを表しますので、忘れずに付けておきましょう。

イメージが作成できたかどうか確認しましょう。

$ docker images
sudoy@SUDOY-NOTE MINGW64 ~/Documents/docker/httpd
$ docker images
                    TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
my-httpd            latest              de8e2a171178        4 minutes ago       193.4 MB
httpd               latest              42a2ce7ab80a        13 days ago         193.4 MB
hello-world         latest              0a6ba66e537a        7 weeks ago         960 B
centos              latest              e9fa5d3a0d0e        7 weeks ago         172.3 MB

「my-httpd」というイメージができていればOKです。

オリジナルのコンテナイメージを起動する

では、このイメージを元にコンテナを起動してみましょう。
Apacheのポートを変えましたので、ポートマッピングのオプション「-p」も変えておきます。

$ docker run -it --rm -p 8080:8080 my-httpd
sudoy@SUDOY-NOTE MINGW64 ~/Documents/docker/httpd
$ docker run -it --rm -p 8080:8080 my-httpd
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
[Thu Dec 03 11:37:18.367487 2015] [mpm_event:notice] [pid 1:tid 140467213105024] AH00489: Apache/2.4.17 (Unix) configured -- resuming normal operations
[Thu Dec 03 11:37:18.368211 2015] [core:notice] [pid 1:tid 140467213105024] AH00094: Command line: 'httpd -D FOREGROUND'

実行結果は変わりありませんね。

以下のURLへアクセスしてみましょう。

http://192.168.99.100:8080/

スクリーンショット 2015-12-03 20.38.16

うまくいきました。
開発プロジェクトなどでは他のメンバーに「Dockerfile」とこれに付随するファイルだけを渡しておけば全メンバーで同じ環境となるわけですね。(今回だとpublic-htmlフォルダ、httpd.confファイル)

では今回はここまでにしたいと思います。

  • このエントリーをはてなブックマークに追加

PAGE TOP