confdとOpenRestyに続いてHipacheでも動的プロキシを試してみます。
Hipacheは0.4.0を使います。GitHubからソースコードをcloneしてイメージをビルドしますが、このままビルドしたりhipacheをdocker pull
してもうまく動作しませんでした。
もう少し親切なドキュメントかソースを修正してくれると助かるのですが。
config.jsonのJSONでカンマが正しくなかったり、supervisord.confが私の環境だとuser=redis
で起動しませんでした。
TL;DR
DockerのHTTPルーターにconfdとOpenRestyとHipacheの3つを比べました。
Hipacheもよかったのですが、リバースプロキシしたRStudio Server
がなぜか認証エラーになったので、OpenRestyにしました。
イメージのビルド
プロジェクトを作成して、git clone
します。
$ cd ~/docker_apps $ git clone https://github.com/hipache/hipache.git $ cd hipache
|
修正したDockerfileです。opensslをインストールしてオレオレ証明書も作成しました。
~/docker_apps/DockerfileFROM ubuntu:14.04 MAINTAINER Masato Shimizu <ma6ato@gmail.com>
RUN sed -i~ -e 's/archive.ubuntu.com/ftp.jaist.ac.jp/' /etc/apt/sources.list \ && apt-get update
RUN DEBIAN_FRONTEND=noninteractive apt-get -y install supervisor nodejs npm redis-server \ openssl
RUN mkdir ./hipache ADD . ./hipache
RUN npm install -g ./hipache --production
ENV NODE_ENV production
ADD ./supervisord.conf /etc/supervisor/conf.d/supervisord.conf
EXPOSE 80 443 6379
RUN cd /etc/ssl && openssl genrsa -out ssl.key 4096 \ && openssl req -new -batch -key ssl.key -out ssl.csr \ && openssl x509 -req -days 3650 -in ssl.csr -signkey ssl.key -out ssl.crt
CMD ["supervisord", "-n"]
|
supervisord.confも動作しなかったので、redisの起動ユーザーからuser=redis
を削除しました。
hipacheの設定ファイルもconfig.jsonを使うようにしています。
~/docker_apps/supervisord.conf[supervisord] nodaemon=true
[program:hipache] command=/usr/local/bin/hipache -c /usr/local/lib/node_modules/hipache/config/config.json stdout_logfile=/var/log/supervisor/%(program_name)s.log stderr_logfile=/var/log/supervisor/%(program_name)s.log autorestart=true
[program:redis] command=/usr/bin/redis-server stdout_logfile=/var/log/supervisor/%(program_name)s.log stderr_logfile=/var/log/supervisor/%(program_name)s.log autorestart=true
|
config.jsonも余計なカンマを削除して、accessLog
のパスも修正しています。
bindもローカルホストから、外部から接続可能にしました。
~/docker_apps/config/config.json{ "server": { "accessLog": "/var/log/hipache.log", "workers": 10, "maxSockets": 100, "deadBackendTTL": 30, "tcpTimeout": 30, "retryOnError": 3, "deadBackendOn500": true, "httpKeepAlive": false }, "https": { "port": 443, "bind": "0.0.0.0", "key": "/etc/ssl/ssl.key", "cert": "/etc/ssl/ssl.crt" }, "http": { "port": 80, "bind": "0.0.0.0" }, "driver": "redis://127.0.0.1:6379" }
|
イメージをbuildします。
$ docker build -t masato/hipache .
|
コンテナを起動します。
$ docker run --name hipache -d -p 80:80 -p 443:443 masato/hipache
|
redis-cliでルーティング設定
redis-cli用のコンテナを起動して、Redisの動作確認をします。
$ docker run -it --rm --link hipache:redis dockerfile/redis bash -c 'redis-cli -h $REDIS_PORT_6379_TCP_ADDR' 172.17.1.36:6379> exit
|
sinatra1.10.1.2.164.xip.io
とsinatra2.10.1.2.164.xip.io
がそれぞれのSinatraコンテナにルーティングされるように設定します。
$ docker run -it --rm --link hipache:redis dockerfile/redis bash -c 'redis-cli -h $REDIS_PORT_6379_TCP_ADDR rpush frontend:sinatra1.10.1.2.164.xip.io sinatra1' (integer) 1 $ docker run -it --rm --link hipache:redis dockerfile/redis bash -c 'redis-cli -h $REDIS_PORT_6379_TCP_ADDR rpush frontend:sinatra1.10.1.2.164.xip.io http://172.17.0.37:5000' (integer) 2 $ docker run -it --rm --link hipache:redis dockerfile/redis bash -c 'redis-cli -h $REDIS_PORT_6379_TCP_ADDR rpush frontend:sinatra2.10.1.2.164.xip.io sinatra2' (integer) 1 $ docker run -it --rm --link hipache:redis dockerfile/redis bash -c 'redis-cli -h $REDIS_PORT_6379_TCP_ADDR rpush frontend:sinatra2.10.1.2.164.xip.io http://172.17.0.191:5000' (integer) 2
|
Redisに登録されたルーティングを確認します。
$ docker run -it --rm --link hipache:redis dockerfile/redis bash -c 'redis-cli -h $REDIS_PORT_6379_TCP_ADDR LRANGE 'frontend:sinatra1.10.1.2.164.xip.io' 0 -1' 1) "sinatra1" 2) "http://172.17.0.37:5000" $ docker run -it --rm --link hipache:redis dockerfile/redis bash -c 'redis-cli -h $REDIS_PORT_6379_TCP_ADDR LRANGE 'frontend:sinatra2.10.1.2.164.xip.io' 0 -1' 1) "sinatra2" 2) "http://172.17.0.191:5000"
|
確認
curlでHTTPSの通信を確認します。オレオレ証明書なので-k
オプションをつけます。
$ curl -k https://sinatra1.10.1.2.164.xip.io Hello world! $ curl -k https://sinatra2.10.1.2.164.xip.io Hello world!
|
まとめ
Hipacheのイメージを作るところまで時間がかかりましたが、オープンソースなので自分でソースを読みながら調べれば動かせます。
バックエンドのデータベースは、Redisの他にetcdも選べるようになりました。CoreOSにデプロイするときにつかってみようと思います。
HTTP Routing
の実装をOpenRestyとconfdとHipacheの3つを比べてみました。