前に仕事で作ったdockerを使ったwebアプリの開発環境の覚書です。
実環境はAWSで動いていて、ALBがhttpsでリクエストを受けてALBとwebアプリはhttpで通信します。このような構成をdockerで作りたかったわけです。 簡単な概要はこんな図になります。
ALBのところをNginxのリバースプロキシに置き換えて作りました。
Nginxのリバースプロキシはこんな設定です。
server { listen 443; server_name www.webapp-test.local; ssl on; ssl_certificate /etc/nginx/server.crt; ssl_certificate_key /etc/nginx/server.key; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # name is docker's link alias. proxy_pass http://local.webapp-test.local:3000/; proxy_redirect http:// https://; } }
アプリの方でX-Forwarded-*を参照するのでセットしたり、hostヘッダはそのまま流したりしてます。 server_nameは実際にはちゃんとしたサーバ名ですがここではこんな名前にしてます。この名前はdocker-compose.ymlファイルのlinkで使う名前と合わせています。 www.webapp-test.localがブラウザでアクセスするURLになって、proxy_passで記述しているのがアプリのURLですね。どっちもlinkする時に使います。
Dockerfileはこの程度です。ベースのイメージは軽めなやつがよかったのでalpineを使ってます。
FROM alpine:latest RUN apk update && \ apk add nginx && \ mkdir -p /run/nginx && \ rm -rf /var/cache/apk/* COPY nginx/nginx.conf /etc/nginx/nginx.conf COPY nginx/server.conf /etc/nginx/conf.d/server.conf COPY nginx/server.crt /etc/nginx/server.crt COPY nginx/server.key /etc/nginx/server.key CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
webアプリの方はDockerfileとかは特に変わったことはしてません。webaアプリのほうにあるdocker-compose.ymlでlinkしてあげるだけです。
version: '2' services: webapp: build: . image: webapp hostname: local domainname: local.webapp-test.local proxy: image: local_dev_proxy ports: - 443:443 links: - webapp:local.webapp-test.local hostname: www domainname: www.webapp-test.local
webappがwebアプリ、proxyがリバースプロキシです。hostとdomainnameはNginxの設定と合わせています。proxyのほうは443ポートを公開してます。ホストからアクセスする時は普通にhttpsの443番ポートを使います。で、proxyからwebappにアクセスを流したいのでlinkを使ってます。 あ、リバースプロキシもdocker-compose.yml使ってビルドしていて、名前はlocal_dev_proxyとしてます。
docker-compose upでwebアプリとリバースプロキシを起動しておいてcurlでアクセスを確認するとこうなります。
とまあ、ローカルの開発環境でALBの代わりにNginxでリバースプロキシを作ったというめもでした。
Docker実践ガイド impress top gearシリーズ
- 作者: 古賀政純
- 出版社/メーカー: インプレス
- 発売日: 2015/12/17
- メディア: Kindle版
- この商品を含むブログ (1件) を見る