Edited at

HTTPリクエストの内容を出力するお手軽なWebサーバを作ってDocker対応させてみた

More than 1 year has passed since last update.


はじめに

HTTPリクエストの内容を表示するだけ、という単機能WebサーバをExpressで作ってみました。

告知を兼ねて記事としてシェアします。


TL;DR

作ったコードは一式GitHubに上がっています。


用途

こんな時に使うと便利だと思います。


  • APIでリクエストする時に、正しくHTTPヘッダが設定できているか確認したい

  • POSTした値が正しく解釈されるか確認したい

  • 複数のコンテナアプリケーションを作って、互いに通信する構成を作る時、とりあえずのイメージを使いたい

  • ALBでECSに振り分ける構成をCloudFormationで作る時、アプリがまだできていないけど、とりあえずECRのリポジトリがほしい時


背景

用途の4つ目を叶えたかったのが、今回一番の目的でした。


PHPからインスパイア

PHPには<? phpinfo(); ?>という便利メソッドがあって、Apache + PHPで環境作った後、このphpinfo();でサーバの構成情報やHTTPリクエスト情報を確認していました。


Dockerに載せやすい形

Node.jsにはhttp-serverという便利サーバがあって、簡単にインストール&静的ファイルをサーブできます。

このツールと同じくらい簡単にインストールできて、HTTPリクエスト情報が目視しやすくって、Dockerに載せやすい形を模索していました。


便利ポイント


環境変数でポートを指定できる

環境変数でサーバがリスニングするポートを変えることができます。

Dockerはポートマッピングが重要だからこそ、イメージを作成した後にポートを変更できるのは便利です。


使い方

3つの使い方ができます。


  1. コマンドラインツールとしてインストール

  2. Dockerイメージとしてビルド


  3. npmパッケージとしてライブラリ利用


コマンドラインツールとしてインストール

npmでグローバルインストールすると、どのワーキングディレクトリからでも一発起動します。


インストール

$ npm install http-ephemeral-server -g


起動

$ http-ephemeral-server

デフォルトポートは3000になっているので、 http://localhost:3000 にアクセスすると、こんな感じの画面が表示されます。

Screenshot_2018-07-06 Screenshot.png


ポート番号を変更する

ポート番号は、環境変数PORTで指定します。

$ PORT=8000 http-ephemeral-server

今度は、 http://localhost:8000 で表示されます。


短いコマンド

http-ephemeral-serverは長すぎてタイポしそうです。

短いバージョンを用意しています。

$ hes


URLは自由

http://localhost:3000/hoge/bar/foo?The:quick:brown:fox:jumps:over:the:lazy:dog

というURLにアクセスすると、画面は同じでurlの項目が変化します。

Screenshot_2018-07-06 Screenshot(1).png


Dockerイメージとしてビルド

Dockerfileをリポジトリ内に用意しています。

GitHubからcloneしてローカルでビルドします。


ローカルにclone

$ git clone https://github.com/kulikala/http-ephemeral-server.git

$ cd http-ephemeral-server


dockerコマンドを使う

docker image buildでビルドします。

-t http-ephemeral-server:latestでビルドしたイメージにタグを付けています。

$ docker image build -t http-ephemeral-server:latest .

docker container runで起動します。

$ docker container run -d -p 3000:80 http-ephemeral-server:latest

デフォルトでは、コンテナ内ではEXPOSE 80するようにDockerfileで記述しています。

ブラウザからアクセスできるようにするには、-p 3000:80などホストポートをコンテナポートにマッピングしてあげます。

-dオプションを指定しないで起動すると、Nodeのプロセスにアタッチします。


ポートを変更してビルド

--build-argオプションでPORT変数に値を渡してあげます。

$ docker image build -t http-ephemeral-server:latest --build-arg PORT=3000 .


起動時にポート番号を変更

PORT環境変数を渡して起動すると、実行時のポート番号を変更します。

実行時に8000番ポートに変更し、 http://localhost:8000 にマッピングするには次のようにします。

$ docker container run -d -p 8000:8000 -e PORT=8000 http-ephemeral-server:latest


docker-composeコマンドを使う

便利ですよね、docker-compose

docker起動時のオプションなどはよく忘れてしまうので、起動するコンテナが1つの場合でも、docker-compose.yml書いておくことにしています。

$ docker-compose build

$ docker-compose start

リポジトリ内のdocker-compose.ymlではホストの8000番ポートにマッピングしているので、ブラウザから http://localhost:8000 にアクセスすると応答するようになります。


npmパッケージとしてライブラリ利用

http-ephemeral-serverは、Express application generator で生成したExpressアプリケーションになっています。


npmでインストール

$ npm install http-ephemeral-server --save


require()する

require('http-ephemeral-server')するとExpressのApplicationインスタンスが取得できるので、

const app = require('http-ephemeral-server')

app.listen(3000)

みたいな形で利用できます。

ぜひ、使ってみてください!