使用Docker部署Nginx+Flask+Mongo的应用
Nginx做为服务器,Mongo为数据库支持,Flask为Python语言的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的内容如下
FROMmongo:3.6 #设置时区 ENVTZ=Asia/Shanghai RUNln-snf/usr/share/zoneinfo/$TZ/etc/localtime&&echo$TZ>/etc/timezone #设置工作目录 ENVWORKDIR/usr/local/work ENVAUTO_RUN_DIR/docker-entrypoint-initdb.d ENVINSTALL_MONGO_SHELLsetup.sh RUNmkdir-p$WORKDIR #复制数据库的初始化命令 COPY./$INSTALL_MONGO_SHELL$AUTO_RUN_DIR/ RUNchmod+x$AUTO_RUN_DIR/$INSTALL_MONGO_SHELL
/mongo/setup.sh的内容如下
该文件的目的是,启动MongoDB后创建一个密码为test的用户test,并赋予它数据库test的读写操作
#!/bin/bash mongo<Flask应用的配置
/flask/Dockerfile的内容如下
FROMpython:3.6 #设置时区 ENVTZ=Asia/Shanghai RUNln-snf/usr/share/zoneinfo/$TZ/etc/localtime&&echo$TZ>/etc/timezone #设置工作区 RUNmkdir-p/home/web WORKDIR/home/web #添加依赖 ADDrequirements.txt/home/web/requirements.txt RUNpip3install-ihttps://pypi.douban.com/simple/-rrequirements.txt #使用gunicorn启动应用 CMDgunicorn-w4-b0.0.0.0:5000run:app/src/app/run.py的代码
此处注释了调试用的app.run(),发布时用gunicorn启动
fromappimportcreate_app app=create_app('default') app.debug=False #if__name__=='__main__': #app.run()Nginx的配置
/nginx/Dockerfile的内容如下
FROMnginx:1.14 #设置时区 ENVTZ=Asia/Shanghai RUNln-snf/usr/share/zoneinfo/$TZ/etc/localtime&&echo$TZ>/etc/timezone #复制配置 COPYconf/nginx.conf/etc/nginx/nginx.conf/nignx/conf/nginx.conf的内容如下
usernginx; worker_processes1; error_log/var/log/nginx/error.logwarn; pid/var/run/nginx.pid; events{ worker_connections1024; } http{ include/etc/nginx/mime.types; default_typeapplication/octet-stream; log_formatmain'$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.logmain; sendfileon; #tcp_nopushon; keepalive_timeout65; #开启gzip gzipon; gzip_min_length1k; gzip_buffers416k; #gzip_http_version1.0; gzip_comp_level1; gzip_typestext/plainapplication/x-javascripttext/cssapplication/xmltext/javascriptapplication/x-httpd-phpimage/jpegimage/gifimage/png; gzip_varyoff; gzip_disable"MSIE[1-6]\."; server{ listen80; server_namelocalhost; keepalive_timeout5; root/usr/share/nginx/html; location/static/{ alias/usr/share/nginx/html/src/app/static/; } location/{ #checksforstaticfile,ifnotfoundproxytoapp try_files$uri@flask_app; } location@flask_app{ proxy_passhttp://192.168.0.2:5000;#发布在阿里云上,应填写内网IP proxy_redirectoff; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; proxy_set_headerHost$http_host; proxy_set_headerX-Real-IP$remote_addr; #proxy_buffers832k; #proxy_buffer_size64k; } } }启动部署
- 进入docker-flie目录cddocker-flie
- 启动dockerdocker-composeup
- 查看容器状态dockerps
- 本地部署浏览器输入127.0.0.1即可
最后出现类似docker_file_nginx_1,docker_file_mongo_1,docker_file_flask_1的3个容器,说明成功!!!
踩坑吐槽
1mongol容器中的初始化文件需要放在docker-entrypoint-initdb.d目录下
本人做过如下尝试,会显示mongdb未启动。
ADDsetup.sh/data/setup.sh RUNchmod+x/data/setup.sh CMD["/data/setup.sh"]2flask应用无法连接mongo,本文使用link方式。
在数据库的配置应相应写成:
MONGODB_SETTINGS={ 'db':'test', 'host':'mongo',#127.0.0.1host地址一定要写你配置的--link的名字 'username':'test', 'password':'test', 'port':27017 }本地测试时改回127.0.0.1
3nginx中配置使用的代理模式,其中执行flask应用的IP,应为内网IP
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。