Posted at

Dockerを使って簡易的なwebサーバーを作成する

More than 1 year has passed since last update.

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サーバーとして機能していることが確認出来ました。