ここ1,2年で注目を集めている仮想化技術の1つ「Docker」について、今更感がありますが試していきたいと思います。
他の仮想化技術との違いや特徴、開発環境として使っていくにはどうすればいいかなどを紹介していきたいと考えています。
これまでの連載
- Dockerであそぶ(1)DockerToolboxのインストール
- Dockerであそぶ(2)Centos7を実行する
- Dockerであそぶ(3)Apacheを使う
- Dockerであそぶ(4)Apacheの設定を変える ← 本記事!
- Dockerであそぶ(5)Apache-PHP連携
- Dockerであそぶ(6)Apache-PHP-Mariadb連携
- Dockerであそぶ(7)PhpMyAdminのインストール
- Dockerであそぶ(8)docker-composeでコンテナをまとめて管理
- Dockerであそぶ(9)AWS EC2でdocker-composeを使う
- Dockerであそぶ(10)docker-machineを使ってAWS(EC2)に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/
うまくいきました。
開発プロジェクトなどでは他のメンバーに「Dockerfile」とこれに付随するファイルだけを渡しておけば全メンバーで同じ環境となるわけですね。(今回だとpublic-htmlフォルダ、httpd.confファイル)
では今回はここまでにしたいと思います。