nginx-proxy 導入

created at 2019-08-21 16:18+0900

nginx-proxyとはDockerコンテナへリバースプロキシするためのnginx設定(/etc/nginx/conf.d/default.conf)を自動で書き換えてくれちゃう神コンテナ。

ブラウザからのアクセスはnginx-proxyを介して、こういうふうにプロキシされちゃうイメージ。httpプロトコル以外のアクセスはシカト(そもそもlistenしてない)。

digraph { graph[ rankdir = LR; nodesep = 0.5; ranksep = 0.8; ]; subgraph cluster_0 { label = "ubuntu"; subgraph cluster_1 { label = "docker_nw1"; node [style=filled,bgcolor="#F3F3F3"]; proxy; www1; www2; jenkins gitbucket; proxy -> {jenkins gitbucket www1 www2}; {rank=same; www1; www2; jenkins; gitbucket;} } subgraph cluster_2 { label="docker_nw2" mcsrv[label="minecraft server"]; } } browser[label="ブラウザ"] browser -> proxy; minecraft -> mcsrv; }

See also ネットワーク図.

以下、nginx-proxyの導入手順についての覚書。

docker-composeファイル作成

次のようにdocker-compose.ymlファイルを作成する。

version: '3.7'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    environment:
      - DEFAULT_HOST=www.r-square.net
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - /etc/localtime:/etc/localtime:ro
      - /etc/letsencrypt/live/r-square.net/fullchain.pem:/etc/nginx/certs/r-square.net.crt:ro
      - /etc/letsencrypt/live/r-square.net/privkey.pem:/etc/nginx/certs/r-square.net.key:ro
      - /var/docker.d/nginx-proxy/vhost.d:/etc/nginx/vhost.d
      - /var/docker.d/nginx-proxy/conf.d/my_proxy.conf:/etc/nginx/conf.d/my_proxy.conf:ro
    logging:
      driver: journald
    networks:
      - common_link
    restart: always
networks:
  common_link:
    external: true
  • /var/run/docker.sock:/tmp/docker.sock:ro はDocker神とnginx-proxy神がお話するために必要なものらしい。

  • /etc/localtime:/etc/localtime:ro はコンテナ内のタイムゾーンをホスト側へ合わせるためのもの。

  • ワイルドカードSSL証明書の場合、{ドメイン}.crt,{ドメイン}.keyで指定する。

    • サブドメインごとのSSL証明書の場合、サブドメインごとに指定が必要(sub1.domain.crt,sub2.domain.crt,,,}。

  • /etc/nginx/vhost.d はバーチャルホストごとに個別の設定を追加したい時に設定ファイルを置く場所(ファイル名はsub1.domain_locationという形式)。

  • /etc/nginx/conf.d/my_proxy.conf はnginx-proxyの設定を追加する場合に指定する。

  • loggingドライバーはお好みで。

docker network 作成

このネットワークに入ったコンテナへプロキシしてくださいと頼むためのdocker networkを作成する。

# 事前確認
docker network ls

# ネットワーク作成
docker network create --driver bridge common_link

# 事後確認
docker network ls

docker-compose 起動

バックグラウンドで起動させる。

sudo docker-compose up -d

まとまらないまとめ

この後、サービス(のまとまり)ごとのdocker-compose.ymlファイルを作成し docker-compose up すれば、nginx-proxy神がよきにはからってくださる。ありがたや。

グローバルドメイン一個しかなくても、これでサブドメイン使いたい放題だー\(^o^)/

このネットワークへ参加させる個々のコンテナについては以下参照のこと。