Dockerであそぶ(3)Apacheを使う


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

これまでの連載

Apacheを起動する

Apacheのような代表的なソフトウェアはいちいちインストールする必要はありません。公式サイトである「Docker Hub」にインストールされたイメージがたくさん公開されています。
今回はApacheのOfficialイメージをダウンロードします。

$ docker pull httpd:latest
sudoy@SUDOY-NOTE MINGW64 ~
$ docker pull httpd:latest
latest: Pulling from library/httpd

1565e86129b8: Pull complete
a604b236bcde: Pull complete
0408e37ae388: Pull complete
dc12a6e10253: Pull complete
7ed67aea14fa: Pull complete
c606f3c990fb: Pull complete
d603a1c325f5: Pull complete
4824ecf7d40a: Pull complete
fefbaf330d59: Pull complete
ce9d71110ab8: Pull complete
7c020269d93b: Pull complete
d20538a7c132: Pull complete
ec25901cfc0b: Pull complete
42a2ce7ab80a: Pull complete
Digest: sha256:a5a950d8ccef097a1cc4853c184d010e9b333d48e1d315acfa8ae2803d65adec
Status: Downloaded newer image for httpd:latest

ダウンロードできたか確認します。

sudoy@SUDOY-NOTE MINGW64 ~
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
httpd               latest              42a2ce7ab80a        7 days ago          193.4 MB
hello-world         latest              0a6ba66e537a        6 weeks ago         960 B
centos              latest              e9fa5d3a0d0e        6 weeks ago         172.3 MB

ダウンロードしたイメージを起動します。

$ docker run -it --rm -p 80:80 httpd:latest

新しいオプションが2つ登場しました。それぞれ↓のような意味があります。

オプション 意味
–rm コンテナを停止したときに自動的にそのコンテナ情報を削除するオプション。
「docker ps -a」コマンドを実行しても表示されなくなります。コンテナの起動・停止を繰り返すとゴミが溜まっていくためこのオプションをつけます。
-p (–publish) Dockerホストとコンテナのポートマッピングを設定する。
ホストの80番ポートへのアクセスをコンテナの80番へ転送する設定にしています。

起動が成功すると以下の様な動作ログが表示されるはずです。
フォアグラウンドでApacheが起動します。

sudoy@SUDOY-NOTE MINGW64 ~
$ docker run -it --rm -p 80:80 httpd:latest
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
[Fri Nov 27 08:11:15.719394 2015] [mpm_event:notice] [pid 1:tid 140078079252352] AH00489: Apache/2.4.17 (Unix) configured -- resuming normal operations
[Fri Nov 27 08:11:15.719875 2015] [core:notice] [pid 1:tid 140078079252352] AH00094: Command line: 'httpd -D FOREGROUND'

起動確認をしましょう。以下のURLにアクセスします。IPアドレスは「Docker QuickStart Terminal」を起動したときに表示されますので、適宜読み替えてください。

http://192.168.99.100/

スクリーンショット 2015-11-27 17.14.17

これでApacheを起動することができました。
起動したコンテナを終了するには「CTRL+C」を入力します。

HTMLファイルを公開する

次に、作成したHTMLをApacheで公開してみましょう。
ここで注意しなくてはいけないのは、起動したコンテナ(仮想マシン)は停止すると再起動することができなくなってしまうということです。(厳密には再起動することもできるのですが、Dockerではコンテナが持つ情報を変更することは推奨されていないようです。)
つまりコンテナ上に永続化したいファイルを保存してはいけないということになります。
そこでDockerではVolumeという仕組みが用意されており、Dockerホスト側とコンテナ側でファイル共有を行うことができるようになっています。ファイルはDockerホスト側で保存し、そのデータをコンテナ側でマウントしているイメージです。(コンテナ上ではファイルを永続化はしていなく、あくまでもDockerホスト側でデータを保持しているイメージ。)

まずは、Dockerホスト側で共有するフォルダを作ります。

$ mkdir -p Documents/docker/httpd/public-html/

フォルダができたらこの中にサンプルHTMLファイル(index.html)を作成します。

<html lang="ja">
<head>
<meta charset="utf-8">
</head>
<body>
<h1>hello world</h1>
</body>

では、先ほどと同じように「docker run」コマンドでコンテナを起動します。
このときにDockerホスト側とコンテナ側で共有するディレクトリを「-v」オプションで指定します。指定方法は「-v ホスト側の絶対パス:コンテナ側の絶対パス」です。
Dockerホスト側のパスは筆者の環境ですので適宜読み替えてください。

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

実行結果はさきほどと変わりありませんね。

$ docker run -it --rm -p 80:80 -v //c/Users/sudoy/Documents/docker/httpd/public-html/:/usr/local/apache2/htdocs/ httpd:latest
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
[Fri Nov 27 08:56:08.217047 2015] [mpm_event:notice] [pid 1:tid 139702176688000] AH00489: Apache/2.4.17 (Unix) configured -- resuming normal operations
[Fri Nov 27 08:56:08.219036 2015] [core:notice] [pid 1:tid 139702176688000] AH00094: Command line: 'httpd -D FOREGROUND'

以下のURLにアクセスします。

http://192.168.99.100/

スクリーンショット 2015-11-27 17.57.08

実行結果が変わりました。
これでWindows側でファイルを修正すればその内容がダイレクトに反映するようになったはずです。
Eclipseなどの統合開発環境を使っている場合には、この共有ディレクトリ(public-html)以下を参照するようにすればOKです。

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

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

PAGE TOP