webアプリケーションを作成していると、WEB-APIの実装はまだ完了していないけど、
とりあえず、JSONデータを返すモックサーバーのようなものが欲しいといったことが
あります。こういった時に使用できるようにDockerで簡易的なwebサーバーを構築
してみます。
ベースイメージの動作確認
webサーバーとして使えるdocker imageは色々あります。今回はh2oのサイトでも
紹介されているlkwg82/h2o-http2-serverを元にサーバーを作成しました。
まずは、lkwg82/h2o-http2-serverのイメージを起動してみます。
$ docker run -p "8080:8080" -ti lkwg82/h2o-http2-server
[INFO] raised RLIMIT_NOFILE to 1048576
h2o server (pid:5) is ready to serve requests
上記のコマンドを打つと、dockerのイメージが起動してh2oが動作していることが
わかります。
$ curl --head http://127.0.0.1:8080
HTTP/1.1 404 File Not Found
Date: Wed, 24 May 2017 12:41:04 GMT
Connection: keep-alive
Content-Length: 9
Server: h2o/2.2.2
content-type: text/plain; charset=utf-8
返ってくる結果は404ですが、少なくともサーバーが動いていることは、確認出来ました。
docker psでdockerのプロセスを確認しても、h2oが動いていることが確認できます。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d08eed931b64 lkwg82/h2o-http2-server "/bin/sh -c 'h2o -..." 10 minutes ago Up 10 minutes 0.0.0.0:8080->8080/tcp, 8443/tcp frosty_keller
イメージの内部の調査
webサーバーを起動出来たので、webサーバーの内部がどうなっているかを確認します。
$ docker exec -ti d08eed931b64 ash
/etc/h2o # ls
h2o.conf
/etc/h2o # cat h2o.conf
hosts:
default:
listen:
port: 8080
paths:
/:
file.dir: /var/www/html
file.dirlisting: ON
access-log: /dev/stdout
error-log: /dev/stderr
コンテナの中には/etc/h2o.confがあり、file.dirが/var/www/htmlを示しています。
先ほど404エラーが出ていたので、/var/www/htmlがこのコンテナにはないことをわかります。
このイメージをベースとして/var/www/htmlのディレクトリを作成したイメージを作成すれば、
webサーバーとして動作することが想定されます。
状況の確認が出来たので、起動しているコンテナは停止しておきます。
$ docker kill d08eed931b64
d08eed931b64
イメージの修正とコンテナの起動
/var/www/htmlのディレクトリを作成するDockerfileを作成します。
From lkwg82/h2o-http2-server:latest
RUN mkdir -p /var/www/html
Dockerfileを修正したら、イメージをbuildして、docker runを実行します。
$ docker build ./ -t simple_server
$ docker run -p "8080:8080" -v {$pwd}/:/var/www/html -d simple_server
585346cc6eff75082911c33eaf6a5c7823dc9dd27a36f05a19800e5ec787bf76
-vオプションを使用することでホストのディレクトリをコンテナにマウントすることができます。
{$pwd}の部分にホストのディレクトリの絶対パスを入れます。例えば/tmpを指定していた
としてファイルを作成して、curlで参照すると、
$ echo "hello world" > /tmp/hello_world
$ curl http://127.0.0.1:8080/hello_world
hello world
上記のような結果となり、webサーバーとして機能していることが確認出来ました。