同じコンテナ内に複数のサーバを立ち上げ、Reverse Proxyを使用してサブドメインでアクセスWEBサーバを変更

## ■前提

* 一つのコンテナに複数のサーバを立ち上げる
* 各サーバは異なるポートで立ち上げる  
→ コンテナ内から`http://localhost:8000`、`http://localhost:8001`、、`http://localhost:8002`等のポートでアクセスが可能

## ■行いたいこと

* それぞれ 80ポート でアクセスが行いたい  
※外からは 80ポートでアクセスが来ますので、800Xポートへのアクセスは不要
* サブドメインで各サービスにアクセスが行いたい  
→ 外部から `http://api.localhost`、`http://www.localhost`、、`http://sub.localhost`でアクセスが可能にする  

## ■実現方法

リバースプロキシを使用すれば可能です  
今回は`nginx`を使用します

```app.Dockerfile

# 各番号ごとの説明は別途記載します

##### [1]
RUN apt-get install -y \
      sudo \
      nginx
##### [2]
RUN { \
        echo 'www-data ALL=(ALL:ALL) NOPASSWD:ALL'; \
    } > /etc/sudoers.d/www-data
##### [3]
RUN sed -i \
        -e 's/\(access_log .\+\);/log_format proxy_log '\''$remote_addr - $remote_user [$time_local] "$host" "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'\'';\n        \1 proxy_log;/' \
        -e 's|\(include .\+/sites-enabled/\)|#\1|' \
        /etc/nginx/nginx.conf
##### [4]
RUN { \
        echo 'proxy_redirect                      off;'; \
        echo 'proxy_set_header Host               $host;'; \
        echo 'proxy_set_header X-Real-IP          $remote_addr;'; \
        echo 'proxy_set_header X-Forwarded-Host   $host;'; \
        echo 'proxy_set_header X-Forwarded-Server $host;'; \
        echo 'proxy_set_header X-Forwarded-Proto  $scheme;'; \
        echo 'proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;'; \
    } > /etc/nginx/proxy_common
##### [5]
RUN { \
        echo 'server {'; \
        echo "  listen 80;"; \
        echo "  listen [::]:80;"; \
        echo '  server_name api.*;'; \
        echo ''; \
        echo '  location / {'; \
        echo "    proxy_pass http://127.0.0.1:8000;"; \
        echo '    include /etc/nginx/proxy_common;'; \
        echo '  }'; \
        echo '}'; \
        echo 'server {'; \
        echo "  listen 80;"; \
        echo "  listen [::]:80;"; \
        echo '  server_name sub.*;'; \
        echo ''; \
        echo '  location / {'; \
        echo "    proxy_pass http://127.0.0.1:8001;"; \
        echo '    include /etc/nginx/proxy_common;'; \
        echo '  }'; \
        echo '}'; \
        echo 'server {'; \
        echo "  listen 80 default_server;"; \
        echo "  listen [::]:80 default_server;"; \
        echo '  server_name _;'; \
        echo ''; \
        echo '  location / {'; \
        echo "    proxy_pass http://127.0.0.1:8002;"; \
        echo '    include /etc/nginx/proxy_common;'; \
        echo '  }'; \
        echo '}'; \
    } > /etc/nginx/conf.d/proxy.conf
##### [6]
RUN { \
        echo '#!/bin/bash'; \
        echo '-----　複数のサーバを立ち上げ　-----'; \
        echo 'sudo /etc/init.d/nginx start'; \
    } > /usr/local/bin/app.sh \
    && chmod 755 /usr/local/bin/app.sh

##### [7]
EXPOSE 80
ENTRYPOINT ["/usr/local/bin/app.sh"]

##### [8]
USER www-data
```

## ■各番号について

#### ▼ [1]

|app  |comment  |
|---|---|
|nginx  | リバースプロキシとして使用  |
|sudo | root以外のユーザでコンテナを動かしますので、sudoでnginxを実行  |


#### ▼ [2]

ユーザ「www-data」からnginxを実行するため
※環境に合わせてください

#### ▼ [3]

access_logの置換はログ形式を変更しています。
デフォルトのログでは<font color="blue">どのサブドメインにアクセスされたログなのか判別が出来ません。</font>
その為、`$host`を追加で出力するようにしています。

sites-enabledの置換はデフォルトのWEBサーバの定義を使用しないようにしています。
今回はリバースプロキシとしてのみ使用しますので不要です。
※ コメント化しないと default_server を自身で設定できません

#### ▼ [4]

`proxy_common`はリバースプロキシの共通設定です。

#### ▼ [5]

リバースプロキシの設定になります。

サーバ毎に「server」項目を追加します。
最後の「server」項目はデフォルトの設定となります。
※どこにもマッチしなかった場合の設定です。

##### serverの各種項目

|項目  |comment  |
|---|---|
|listen | 外からのアクセスは全て`80ポート`で受けますので、80 を設定しています  |
|server_name | ここで指定したサブドメインの設定になります。ワイルドカードを使用することによりドメインは不問としています |
|proxy_pass | `server_name`で一致したアクセスをどのサーバに渡すかの設定になります  |

#### ▼ [6]

複数のサーバを起動する想定なので、エントリーポイントとして登録するshellになります。

#### ▼ [7]

公開ポートとコンテナのエントリーポイントです。

#### ▼ [8]

`root`から`www-data`にユーザを変更しています。