nginxをリバースプロキシとして使用する
リバースプロキシーはロードバランサの一種で、クライアントからのアクセスを別のサーバに転送する
### 環境変数を使ったイメージのパラメーター
環境変数はシステムやアプリのパラメータを設定するもので、「キーとバリュー」の形式で管理されている。
アプリサーバー: 表示するメッセージ、ポート番号
リバースプロキシー: アプリサーバーのアドレス、待ち受けポート
pythonではosモジュールのenviron変数を使うことが一般的
server.py
import os, flask MESSAGE = os.environ['MESSAGE'] PORT = int(os.environ['PORT']) app = flask.Flask('c2env1_app') @app.route('/') def index(): return MESSAGE app.run(debug=True, host='0.0.0.0', port=PORT)
$ sudo docker run –name c2env1_app_base -d python:3.7.5-slim tail -f /dev/null
$ sudo docker exec c2env1_app_base pip install flask==1.1.1
$ sudo docker cp server.py c2env1_app_base:/
$ sudo docker stop c2env1_app_base
$ sudo docker commit c2env1_app_base c2env1_app
$ sudo docker run –name c2env1_app -p 8081:80 -d \
-e MESSAGE=”Hello Docker Env” -e PORT=80 \
c2env1_app python -u /server.py
nginx.tpl
events { worker_connections } http { server { server_name localhost: listen {{PORT}}; 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; location / { proxy_pass {{APP_SERVER}}; } } }
start.sh
#!/bin/sh sed -e "s/{{PORT}}/$PORT/g" /etc/nginx/nginx.tpl > /etc/nginx/nginx.conf sed -i -e "s^{{APP_SERVER}}^$APP_SERVER^g" /etc/nginx/nginx.conf exec nginx -g "daemon off;"
$ sudo docker run –name c2env1_web_base -d nginx:1.17.6-alpine tail -f /dev/null
$ sudo docker cp start.sh c2env1_web_base:/
$ sudo docker exec c2env1_web_base chmod +x /start.sh
$ sudo docker cp nginx.tpl c2env1_web_base:/etc/nginx/
$ sudo docker stop c2env1_web_base
$ sudo docker commit c2env1_web_base c2env1_web
$ sudo docker run –name c2env1_web -p 8080:80 -d \
-e APP_SERVER=”http://172.17.0.2:80″ -e PORT=80 \
c2env1_web /start.sh
この様にも書ける
.env
APP_SERVER="http://172.17.0.2:80" PORT=80
$ sudo docker run –name c2env1_web -p 8080:80 -d \
–env-file .env c2env1_web /start.sh
.envに変数入れて、–env-file .envでコマンド打てば、環境変数として扱えるのね。
これ凄いわ… ガチでビビるレベルや…