此筆記為筆者學習建立一個Nginx整合uWSGI Server服務 Docker映像檔,紀錄建立一個Dockerfile檔案到建置完成過程。
Docker Contianer → 在筆記稱為容器。
Docker Image →在筆記稱為映像檔。
相關參考資源:
GitHub: https://github.com/s123600g/FlaskDemoNotes/tree/master/Docker/Nginx_uWSGI_Flask
根據 Docker\Nginx_uWSGI_Flask\ 底下會有檔案內容如下:
Step1. 開啟終端機並將起始位置切換至Dockerfile位置底下
cd path to\dockerfile
Setp2. 執行建立映像檔
docker build -t "自訂映像檔名稱:自訂Tag" .
實際範例,建置一個命名為nginxflaskserver映像檔
docker build -t nginx_flask_server .
完成後畫面如下
docker save --output 檔案名稱.tar image識別標籤
實際範例,匯出一個映像實體檔(nginx_flask_server.tar)
docker save --output nginx_flask_server.tar nginx_flask_server
docker load --input 檔案名稱.tar
實際範例,匯入一個映像實體檔(nginx_flask_server.tar)
docker load --input nginx_flask_server.tar
docker rmi image識別標籤
實際範例,刪除一個映像媒體(nginx_flask_server)
docker rmi nginx_flask_server
docker images
Dockerfile檔案內容如下:
FROM nginx:stable
ENV web_project="web_data"
ENV web_port=85
RUN apt-get update && apt-get install -y curl python3 python3-dev python3-pip nano gcc default-libmysqlclient-dev iputils-ping
RUN mkdir /web \
&& mkdir /web/${web_project} \
&& mkdir /etc/nginx/sites-enabled
COPY "nginx.conf" "/web"
COPY "web.conf" "/etc/nginx/sites-enabled"
COPY "requirements.txt" "/web"
COPY "start_up.sh" "/var/local"
RUN chmod 777 /var/local/start_up.sh
RUN pip3 install -r /web/requirements.txt
RUN mv /etc/nginx/nginx.conf /etc/nginx/nginx_old.conf \
&& cp /web/nginx.conf /etc/nginx/
EXPOSE ${web_port}
CMD [ "/bin/bash", "-c" , "/var/local/start_up.sh ;"]
ENV web_port=85
預設是設定85為容器開放Port
請注意此設置代表之後以此映像檔建立之容器,對開放有效溝通端口為85 Port ,實際上還需要在docker run進行開通設定才能完全讓本機跟容器對接起來,關於設置詳細可參考 使用Docker運行Nginx與uWSGI容器服務
對應在建立容器時,掛載本機上實體網站位置導向到container內部網站目錄,在uwsgi.ini內參數chdir也需要與此相對應。
chdir=/web/web_data/
COPY '檔案名稱' '容器內部位置'
映像檔在建置過程中,會複製當前所在位置底下內有存在指定檔案至內部對應位置。
COPY "nginx.conf" "/web"
更改Nginx內部主設定配置檔案,覆蓋掉原本官方預設配置檔案內容。
先複製要覆蓋的配置檔在內部"/web"底下,再透過下面程序環節更新覆蓋掉官方預設配置檔案
RUN mv /etc/nginx/nginx.conf /etc/nginx/nginx_old.conf \
&& cp /web/nginx.conf /etc/nginx/
COPY "web.conf" "/etc/nginx/sites-enabled"
Nginx對應uWSGI Socket配置檔放置內部"/etc/nginx/sites-enabled"底下,此為Nginx反向代理器與Flask網站uWSGi Server對接配置。
COPY "requirements.txt" "/web"
Python套件需求名單文字檔,在映像檔建置過程中,順便安裝運行Python環境所需要套件,會依據此文字檔內紀錄套件名稱進行下載安裝。
套件內容如下:
alembic==1.3.0
aniso8601==8.0.0
astroid==2.3.1
autopep8==1.4.4
certifi==2019.9.11
Click==7.0
colorama==0.4.1
DateTime==4.3
Flask==1.1.1
Flask-Admin==1.5.4
Flask-CKEditor==0.4.3
Flask-Login==0.4.1
Flask-Migrate==2.5.2
Flask-RESTful==0.3.7
Flask-Script==2.0.6
Flask-Session==0.3.1
Flask-SQLAlchemy==2.4.1
Flask-WTF==0.14.2
isort==4.3.21
itsdangerous==1.1.0
Jinja2==2.10.3
lazy-object-proxy==1.4.2
Mako==1.1.0
MarkupSafe==1.1.1
mccabe==0.6.1
pycodestyle==2.5.0
pylint==2.4.2
python-dateutil==2.8.0
python-editor==1.0.4
pytz==2019.3
pymssql==2.1.4
six==1.12.0
SQLAlchemy==1.3.10
typed-ast==1.4.0
Werkzeug==0.16.0
wincertstore==0.2
wrapt==1.11.2
WTForms==2.2.1
zope.interface==4.6.0
openpyxl==3.0.3
uWSGI==2.0.18
mysqlclient==1.4.6
COPY "start_up.sh" "/var/local"
此為Nginx與uWSGI自啟動腳本,在映像檔建置最後步驟中,設置每當以此映像檔建置之容器,每一次啟動時,優先執行此自啟動腳本設置網站服務運作。
透過最後一道程序,來設置每次容器啟動時首先執行此腳本
CMD [ "/bin/bash", "-c" , "/var/local/start_up.sh ;"]
關於此自啟動腳本內容如下
#!/bin/bash
nginx -g 'daemon off;' | uwsgi --ini /web/web_data/uwsgi.ini
添加nginx全域設定-關掉守護線程
nginx -g 'daemon off;'
將Nginx設置為執行啟動時不依附上層核心程序進行,避免因為上層核心程序終結而導致連帶中止結束,因為容器啟動執行時,Nginx服務是以程序驅動執行腳本而不是一個獨立程序,導致腳本執行完畢時,因上層執行驅動腳本核心程序結束,導致連帶一起關閉腳本所啟用服務程序連帶中止,也就是一開始pid=1為執行腳本核心程序,一但結束此核心程序那Nginx也連帶一起中止,docker會判定此容器工作已經結束執行,自動關閉容器服務。
uWSGI配置檔為uwsgi.ini,此檔案不需要配進去容器裡面,只需要放在網站實體目錄內即可,容器使用此配置檔是在掛載網站實體目錄時所使用。
有關介紹可參考另一個筆記內容Flask 基本框架配置
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 50;
types_hash_max_size 2048;
client_header_timeout 15;
client_body_timeout 15;
send_timeout 15;
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn addr 100;
##
# Upload File Body Max Size Settings
##
client_max_body_size 10M;
##
# Gzip Settings
##
gzip on;
##
# Virtual Host Configs
##
#include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
server {
listen 80;
server_name 127.0.0.1;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
uwsgi_pass unix:///tmp/uwsgi.sock;
include uwsgi_params;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Nginx參數說明: