はじめに
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をガンガン作っていきます。
リバースプロキシ
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と同じネットワークを指定して下さい。
サービス用(例)
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さんに感謝です。