Centos7.3で構築したDocker専用仮想マシンのDockerコンテナにNginxリバースプロキシを導入します。Nginxリバースプロキシは先人の力を借りてDocker-Hubのjwilder/nginx-proxyコンテナを使用します。
目次
1.構成と目的
1台の仮想マシンで複数のWebサービスをホストするのが目的です。DockerコンテナでWebサービスを構成し依存関係をなくして独立性を高めます。Webサービスの追加や停止を他のサービスに影響を与えずにできるようにします。
【イメージ図】
【Docker-Compose構成】
以下リバースプロキシ用1つ、Webサービス用に2つの計3つのDocker-Composeファイルを準備します。
1 2 3 4 5 6 7 8 |
├─rvproxy ←リバースプロキシ用 │ docker-compose.yml │ ├─Websv1 ←Webサービス1用 │ docker-compose.yml │ └─Websv2 ←Webサービス2用 docker-compose.yml |
2.Docker-Composeの構成
(1)リバースプロキシ用のYMLファイル
今回はまずはhttpだけの設定とします。httpsの設定は当ブログ内の記事「Dockerリバースプロキシ環境にRAINLOOPをインストール」を参照してください。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
version: '2' services: proxy: image: jwilder/nginx-proxy container_name: nginx-proxy ports: - "80:80" volumes: - /var/run/docker.sock:/tmp/docker.sock:ro logging: driver: syslog restart: always networks: default: external: name: common_link |
NO | キー | 値 | 説明 |
---|---|---|---|
1 | contener_name | nginx-proxy | サーバで一意にするためコンテナ名を明示的に指定します。 |
2 | ports | 80:80 | httpを外部からコンテナに受け渡す設定 |
3 | volumes | /var/run/docker.sock:/tmp/docker.sock:ro | nginx-proxyがDockerコンテナの起動・終了を検知するために必要な設定 |
4 | restart | always | nginx-proxyが異常終了してもコンテナを自動再起動する設定 |
5 | logging | driver: syslog | ログをホストのsyslogへ出力する設定 |
5 | networks | name: common_link | common_linkという名前のネットワークブリッジに参加 |
(2)Webサービス用のYMLファイル
Webサービス1用の設定です。他にmysqlやphpのサービス定義もありますが省略です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
version: '2' services: web: image: nginx container_name: web1 environment: VIRTUAL_HOST: hogehoge1.com ※1 logging: driver: syslog restart: always networks: default: external: name: common_link |
NO | キー | 値 | 説明 |
---|---|---|---|
1 | VIRTUAL_HOST | hogehoge1.com | nginx-proxyはこのホスト名を基にアクセスを振り分けてくれます。 |
2 | logging | driver: syslog | ログをホストのsyslogへ出力する設定 |
3 | networks | name: common_link | nginx-proxyと同じネットワークブリッジに参加 |
Webサービス2は上記のcontainer_nameとVIRTUAL_HOSTの1を2に変更すれば作成できますので省略します。
3.ネットワーク作成と起動
(1)ネットワークブリッジ作成
1 |
# docker network create --driver bridge common_link |
(2)nginx-proxy起動
rvproxyにcdしてからコンテナ起動。Docker-HubよりイメージをPullした後コンテナが起動します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# cd rvproxy # docker-compose up -d Pulling proxy (jwilder/nginx-proxy:latest)... latest: Pulling from jwilder/nginx-proxy ff3d52d8f55f: Pull complete b05436c68d6a: Pull complete 961dd3f5d836: Pull complete 1af2a02201b6: Pull complete dbd38f4fbb63: Pull complete 4deea5ff664a: Pull complete ffd7332f6184: Pull complete 7ad6c288817a: Pull complete 1d06b5495ca2: Pull complete Digest: sha256:6ec0e8ba1cb6510235187eacf09122d38c434b6a611f03fe970c1f16bc35f2b5 Status: Downloaded newer image for jwilder/nginx-proxy:latest Creating nginx-proxy |
(3)Webサービスの起動
同様に、websv1,websv2にcdしコンテナを起動します。
1 |
docker-compose up -d |
4.リバースプロキシ確認
jwilder/nginx-proxyはVIRTUAL_HOSTを指定してコンテナを起動すればそれだけで自動的にリバースプロキをしてくれます。nginxの設定ファイルdefault.confがどのようになっているかコンテナに接続して確認してみます。
1 2 |
# docker exec -it nginx-proxy bash root@e8d2cd885ac1:/# cat /etc/nginx/conf.d/default.conf |
/etc/nginx/conf.d/default.confの内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# Mitigate httpoxy attack (see README for details) proxy_set_header Proxy ""; server { server_name _; # This is just an invalid value which will never trigger on a real hostname. listen 80; access_log /var/log/nginx/access.log vhost; return 503; } # hogehoge1.com upstream hogehoge1.com { ## Can be connect with "common_link" network # web1 server 172.21.0.4:80; } server { server_name hogehoge1.com; listen 80 ; access_log /var/log/nginx/access.log vhost; location / { proxy_pass http://hgehoge1.com; } } # hogehoge2.com upstream hogehoge2.com { ## Can be connect with "common_link" network # web2 server 172.21.0.5:80; } server { server_name hogehoge2.com; listen 80 ; access_log /var/log/nginx/access.log vhost; location / { proxy_pass http://hgehoge2.com; } } |
9行目から22行目がhogehoge1.com用、23行目から36行目がhogehoge2.com用のリバースプロキシ設定が存在します。
jwilder/nginx-proxyが起動したWebサービスに応じてdefault.confを自動的に書き変えていることがわかります。
5.参考にさせて頂いたサイト
ありがとうございます。