如何使用Docker部署Nginx+Flask+Mongo的應用

nginx做為服務器,mongo為數據庫支持,flaskpython語言的web框架,利用docker的容器特性,可以簡單地部署在linux服務器上

項目準備

項目主要目錄如下

__?project-name ??|__?docker-file ????|__?ningx ??????|__?dockerfile ??????|__?conf ????????|__?nginx.conf ????|__?flask ??????|__?dockerfile ??????|__?requirements.txt ????|__?mongo ??????|__?dockerfile ??????|__?setup.sh ????|__?docker-compose.yml ??|__?src ????|__?app ??????|__?... ????|__?run.py

簡要說明

docker-file目錄為docker部署的配置文件

src目錄為flask應用的python代碼

docker的詳細配置

docker-compose配置

version:?'2.2' services: ?mongo: ??build:?./mongo ??volumes: ???-?"./mongo/db:/data/db" ??restart:?always ??ports: ???-?"27017:27017" ??environment: ???mongo_initdb_root_username:?root ???mongo_initdb_root_password:?123456 ?flask: ??build:?./flask ??links: ???-?mongo ??ports: ???-?"5000:5000" ??expose: ???-?"5000" ??volumes: ???-?../src:/home/web ?nginx: ???build:?./nginx ???links: ????-?flask ???volumes: ????-?"./nginx/log:/var/log/nginx" ????-?"../:/usr/share/nginx/html" ???ports: ????-?"80:80" ????-?"8080:8080" ????-?"443:443" ???restart:?always

mongodb的配置

/mongo/dockerfile的內容如下

from?mongo:3.6 #?設置時區 env?tz=asia/shanghai run?ln?-snf?/usr/share/zoneinfo/$tz?/etc/localtime?&&?echo?$tz?>?/etc/timezone #?設置工作目錄 env?workdir?/usr/local/work env?auto_run_dir?/docker-entrypoint-initdb.d env?install_mongo_shell?setup.sh run?mkdir?-p?$workdir #?復制數據庫的初始化命令 copy?./$install_mongo_shell?$auto_run_dir/ run?chmod?+x?$auto_run_dir/$install_mongo_shell

/mongo/setup.sh的內容如下

該文件的目的是,啟動mongodb后創建一個密碼為test的用戶test,并賦予它數據庫test的讀寫操作

#!/bin/bash mongo?<p><strong>flask應用的配置</strong><br></p><p>/flask/dockerfile的內容如下</p><pre class="brush:bash;">from?python:3.6 #?設置時區 env?tz=asia/shanghai run?ln?-snf?/usr/share/zoneinfo/$tz?/etc/localtime?&amp;&amp;?echo?$tz?&gt;?/etc/timezone  #?設置工作區 run?mkdir?-p?/home/web workdir?/home/web #?添加依賴 add?requirements.txt?/home/web/requirements.txt run?pip3?install?-i?https://pypi.douban.com/simple/?-r?requirements.txt  #?使用gunicorn啟動應用 cmd?gunicorn?-w?4?-b?0.0.0.0:5000?run:app

/src/app/run.py的代碼

此處注釋了調試用的 app.run(),發布時用gunicorn啟動

from?app?import?create_app app?=?create_app('default') app.debug=false #?if?__name__?==?'__main__': #??app.run()

nginx的配置

/nginx/dockerfile的內容如下

from?nginx:1.14 #?設置時區 env?tz=asia/shanghai run?ln?-snf?/usr/share/zoneinfo/$tz?/etc/localtime?&amp;&amp;?echo?$tz?&gt;?/etc/timezone #?復制配置 copy?conf/nginx.conf?/etc/nginx/nginx.conf

/nignx/conf/nginx.conf的內容如下

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;  ??sendfile????on; ??#tcp_nopush???on;  ??keepalive_timeout?65;  ??#?開啟gzip ??gzip?on; ??gzip_min_length?1k; ??gzip_buffers?4?16k; ??#gzip_http_version?1.0; ??gzip_comp_level?1; ??gzip_types?text/plain?application/x-javascript?text/css?application/xml?text/javascript?application/x-httpd-php?image/jpeg?image/gif?image/png; ??gzip_vary?off; ??gzip_disable?"msie?[1-6].";  ??server?{ ????listen?80; ????server_name?localhost; ????keepalive_timeout?5; ????root?/usr/share/nginx/html;  ????location?/static/?{ ??????alias?/usr/share/nginx/html/src/app/static/; ????}  ????location?/?{ ??????#?checks?for?static?file,?if?not?found?proxy?to?app ??????try_files?$uri?@flask_app; ????}  ????location?@flask_app?{ ??????proxy_pass?http://192.168.0.2:5000;?#?發布在阿里云上,應填寫內網ip ??????proxy_redirect?off; ??????proxy_set_header?x-forwarded-for?$proxy_add_x_forwarded_for; ??????proxy_set_header?host?$http_host; ??????proxy_set_header?x-real-ip?$remote_addr;  ??????#proxy_buffers?8?32k; ??????#proxy_buffer_size?64k;  ????} ??}   }

啟動部署

  1. 進入docker-flie目錄 cd docker-flie

  2. 啟動docker docker-compose up

  3. 查看容器狀態 docker ps

  4. 本地部署瀏覽器輸入 127.0.0.1即可

最后出現類似docker_file_nginx_1,docker_file_mongo_1, docker_file_flask_1的3個容器,說明成功!!!

踩坑吐槽

1 mongol容器中的初始化文件需要放在 docker-entrypoint-initdb.d 目錄下

本人做過如下嘗試,會顯示 mongdb未啟動。

add?setup.sh?/data/setup.sh run?chmod?+x?/data/setup.sh cmd?["/data/setup.sh"]

2 flask應用無法連接mongo,本文使用link方式。

在數據庫的配置應相應寫成:

mongodb_settings?=?{ ????'db':?'test', ????'host':?'mongo',?#?127.0.0.1?host地址一定要寫你配置的--link的名字 ????'username':?'test', ????'password':?'test', ????'port':?27017 ??}

本地測試時改回127.0.0.1

3 nginx中配置使用的代理模式,其中執行flask應用的ip,應為內網ip

? 版權聲明
THE END
喜歡就支持一下吧
點贊15 分享