m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

docker-composeでnginxを使用してリバースプロキシを行う

dockerでnginxを利用してアプリサーバをリバースプロキシしたい

こんなやつ

f:id:m_shige1979:20210904220418p:plain

設定

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

GitHub - panubo/docker-staticsite: Docker image with nginx, awscli and scripts for automated configuration and deployment of static sites

Dockerコンテナ内からホストへ`localhost` でアクセスしてみる | iret.media

github

https://github.com/mshige1979/mocky_docker_sample/tree/nginx