■前提
- 一つのコンテナに複数のサーバを立ち上げる
- 各サーバは異なるポートで立ち上げる
→ コンテナ内から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の置換はログ形式を変更しています。
デフォルトのログではどのサブドメインにアクセスされたログなのか判別が出来ません。
その為、$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
にユーザを変更しています。