docker-composeでnginxを使用してリバースプロキシを行う
dockerでnginxを利用してアプリサーバをリバースプロキシしたい
こんなやつ
設定
docker-compose.yml
version: "3" services: # nginx nginx: # コンテナ名 container_name: nginx # image image: nginx:alpine # スタブサーバー起動後に動く depends_on: - mocky - staticsite # コンテナに入るようにできる tty: true # ポート ports: - "80:80" # ボリューム(マウント) volumes: - ./dockers/nginx/conf.d:/etc/nginx/conf.d # スタブサーバ用 mocky: # コンテナ名 container_name: mocky # Dockerfile場所 build: ./dockers/mocky # コンテナに入るようにできる tty: true # ボリューム volumes: - "./dockers/mocky/app:/usr/src/app" # ポート ports: - "4321:4321" # 作業ディレクトリ working_dir: /usr/src/app # 実行コマンド entrypoint: npm start # 静的サーバ用 staticsite: # コンテナ名 container_name: staticsite # image image: panubo/staticsite # コンテナに入るようにできる tty: true # ポート ports: - "8000:80" # ボリューム volumes: - "./dockers/staticsite/html:/var/www/html"
docker-compose.yml自体はほとんど変化なし 2つのホストでそれぞれ異なるサーバへプロキシを行う検証として1つコンテナは追加しました。
dockers/nginx/conf.d/vhost1.conf
# スタブサーバ接続用設定 upstream backend1 { server host.docker.internal:4321; } server { listen 80; server_name sample.mocky.com; root /var/www/html; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://backend1/; } }
dockers/nginx/conf.d/vhost2.conf
# スタブサーバ接続用設定 upstream backend2 { server host.docker.internal:8000; } server { listen 80; server_name sample.staticsite.com; root /var/www/html; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://backend2/; } }
基本的なプロキシ設定自体は同じ それぞれ異なるポートを利用すること
結果
sample.mocky.com/
% curl http://sample.mocky.com/api/v01/users | jq % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 42 0 42 0 0 8400 0 --:--:-- --:--:-- --:--:-- 8400 { "users": [ { "name": "hoge" }, { "name": "foo" } ] } %
sample.staticsite.com
% curl http://sample.staticsite.com <html> <head> <title>test</title> </head> <body> <p> test </p> </body> </html> %
コンテナから他のコンテナへのアクセス
コンテナ名を指定したり、ネットワークを作成して割り当てる方法などもあるようですが、
今回はhost.docker.internal
で対応
参考
Docker上のリバースプロキシで静的コンテンツを複数コンテナ間と共有 | Tech Memo
Dockerコンテナ内からホストへ`localhost` でアクセスしてみる | iret.media
github
https://github.com/mshige1979/mocky_docker_sample/tree/nginx