Edited at

nginxを使ったリバースプロキシ on Docker


はじめに

Dockerを使っていく上でほぼ必須なリバースプロキシを構築します。

今回は素晴らしいコンテナが有ったので1からビルドせずそれを利用させてもらいます。

jwilder/nginx-proxy

https://hub.docker.com/r/jwilder/nginx-proxy/

このコンテナの素晴らしい所は同じネットワーク内にVIRTUAL_HOSTを指定して

コンテナを起動すればそれだけでリバースプロキシしてくれる所です。

confファイルの都度編集は不要です。


事前準備


ディレクトリ構成

私はこんな感じに組みましたが環境に合わせてカスタマイズして下さい。

/etc

└docker-compose.d
├certs
│├mydomain.com.crt
│└mydomain.com.key
├proxy
│└docker-compose.yml
└service.name
└docker-compose.yml


certsディレクトリ

certsディレクトリにはSSL証明書を入れます。

mydomain.com.crt、mydomain.com.keyは自社ドメインに合わせてリネームして下さい。

今回はワイルドカード証明書を使うのでドメイン名だけでOKです。

もしサービス毎の証明書を使用する場合は

servicename.mydomain.com.crt

servicename.mydomain.com.key

等で個別に作成して下さい。


proxyディレクトリ

ここにリバースプロキシ用docker-compose.ymlを作成します。


その他

proxyディレクトリと同列にサービス用ディレクトリを作成し

docker-compose.ymlをガンガン作っていきます。


リバースプロキシ


/etc/docker-compose.d/proxy/docker-compose.yml

version: '2'

# proxy
services:

proxy:
image: jwilder/nginx-proxy
container_name: nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- /etc/docker-compose.d/certs:/etc/nginx/certs
- /var/run/docker.sock:/tmp/docker.sock:ro
restart: always

networks:
default:
external:
name: common_link



ポイント

今回サービス毎にdocker-compose.ymlを作成するのでネットワークを指定しています。

サービス用のdocker-compose.ymlと同じネットワークを指定して下さい。


サービス用(例)


/etc/docker-compose.d/service.name/docker-compose.yml

version: '2'

# service
services:

web:
image: nginx
container_name: web
environment:
VIRTUAL_HOST: web.mydomain.com
restart: always

networks:
default:
external:
name: common_link



共通ネットワークの作成

docker-compose.ymlで指定したcommon_linkを作成します。

docker network create --driver bridge common_link


動作確認

コンテナを立ち上げる順番はproxyが先でもサービスが先でも大丈夫です。

proxyとサービスをdocker-compose up -dして下さい。

ブラウザからhttps://web.mydomain.comへアクセス出来れば成功です。

証明書が正しく読み込まれていればhttpでアクセスしてもhttpsへリダイレクトされます。

もしhttpでしか繋がらない場合は証明書に問題が有る可能性が高いです。


追記2017/1/12

このリバースプロキシはデフォルトで100MBまでしかファイル転送できません。

必要が有れば下記の様にDockerfileを作成しビルドして下さい。

下記例では10GBまで拡張しています。

FROM jwilder/nginx-proxy

RUN { \
echo 'server_tokens off;'; \
echo 'client_max_body_size 100g;'; \
} > /etc/nginx/conf.d/my_proxy.conf


最後に

この様な素晴らしいコンテナを提供してくれているjwilderさんに感謝です。