美文网首页
docker+nginx+gunicorn部署flask+vue

docker+nginx+gunicorn部署flask+vue

作者: 周周周__ | 来源:发表于2020-03-16 22:52 被阅读0次

一、准备镜像和WEB文件夹:

# 基础镜像环境
     python:3.6   # 运行环境镜像
     nginx   # 部署镜像

# 项目文件夹:
       --web/
          --app/  # 项目文件
          --wsgi.py # 启动入口
          --requirement.txt # flask运行环境包
          --Dockerfile  # 后端运行镜像配置
          --gunicorn_conf.py  # 启动配置
          -- ... # 其他配置略...
       --vue_index/
          --dist/ # 打包的vue项目
          --Dockerfile  # 部署前端运行配置(由于是前后端分离部署,所以后端由前端转发)
          --default.conf  # nginx配置

1、打包项目

1)、web/Dcokerfile配置
FROM python:3.6  # 基于py3.6镜像
RUN mkdir /web   # 创建文件夹
WORKDIR /web   # 执行路径(等同cd /web)
COPY requirements.txt /usr  # 复制当前文件到容器内
COPY . /web          # 复制本文件项目到容器
RUN pip install --no-cache-dir -r /usr/requirements.txt  # 安装运行需要的包
CMD ["gunicorn", "wsgi:app", "-c", "/web/gunicorn.conf.py"]   # gunicorn执行
2)、web/gunicorn_conf.py

注意点:在docker中执行项目的话和直接在linux执行有区别,在docker中运行不能用
-d 后台运行。

import logging
import logging.handlers
from logging.handlers import WatchedFileHandler
import os
import multiprocessing
bind = '0.0.0.0:8000'
backlog = 512
timeout = 30
worker_class = 'gevent'
workers = multiprocessing.cpu_count() * 2 + 1
threads = 2
loglevel = 'info'
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"'
accesslog = "/web/logs/gunicorn_access.log"      # 访问日志文件
errorlog = "/web/logs/gunicorn_error.log"
3)、生成项目镜像:

docker build -t web:1 .

2、打包nginx+前端

1、vue_index/Dockerfile
# 设置基础镜像
FROM nginx
# 将dist文件中的内容复制到 /usr/share/nginx/html/ 这个目录下面
COPY dist/  /usr/share/nginx/html/
#用本地的 default.conf 配置来替换nginx镜像里的默认配置
COPY nginx/default.conf /etc/nginx/conf.d/default.conf
VOLUME /data/vue_index /var/log/nginx
2 、vue_index/default.conf
server {
    listen       80;
    server_name  localhost;
    access_log  /var/log/nginx/host.access.log  main;
    error_log  /var/log/nginx/error.log  error;
    location / {  # 直接匹配端口返回前端
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    location /api/ {  # 匹配api的,转发给后端,
        rewrite  /api/(.*)  /$1  break;
        proxy_pass http://192.168.2.2:8000;  # 这里是宿主机的ip
    }
}
3、生成项目镜像:

docker build -t vue_index:1 .

ps:只是简单的部署,主要是nginx部署转发后端。

二、启动

1、查看docker images
2、启动后端容器:docker run -it -d -p 8000:8000 -v /data/web:/web web:1
-d:容器后台启动
-p:宿主机端口映射容器端口
-v:挂载文件夹,在宿主机查看日志方便
3、启动nginx容器:docker run -it -d -p 8001:80 vue_index:1
ps:这里要注意的是宿主机的端口不能重复映射,现在启动容器后,我们可以通过访问ip+port进行直接访问。
如果有相关的后端请求的话会直接匹配ip+port+/api 进行转发到后端的接口,实际访问的接口不变

问题:

1、docker部署gunicorn,为什么启动不了?
gunicorn在docker启动时不能在后台运行
2、nginx部署vue怎么搞?
将前端部署在nginx,通过匹配api进行转发到后端
3、docker容器之间怎么进行通信?(我总不能把数据库的ip写死吧)
可以通过network 进行桥接(docker-compose编排会提)
通过link进行链接
4、docker怎么实现一键部署?
docker-compose进行一键部署
5、docker部署需要用supervisor进行守护吗?
docker-compose 执行的时候能设置自动重启
6、web的环境比较复杂,安装十分缓慢,每次更新代码就需要重新,有解决方法吗?
1、把环境的镜像制作好,我们可以基于python36制作一个自己需要的flask环境镜像,每次启动dockerfile只用复制就行
2、使用挂载,宿主机和容器内映射,修改宿主机内容
7、镜像启动了拉不起来怎么办?怎么排除故障
1、首先使用docker logs -f contain_id 查看日志
2 、使用镜像进入查看,docker run -it --rm web:1 sh ,然后在里面进行执行启动命令进行查看。--rm是为了进入镜像不修改完全退出的
3、可以在容器内直接执行python wsgi.py进行测试,排除是不是gunicorn故障,如果正常运行则测试gunicorn启动命令gunicorn解决方案
8、我在配置镜像时候安装py包很慢怎么办?
修改容器内镜像源
在制作镜像的目录下创建文件pip.conf 内容如下

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple 

Dockerfile内容如下,在安装包之前配置好

配置镜像源.png
下一篇:docker-compose 编排多容器通信,一键启动

相关文章

网友评论

      本文标题:docker+nginx+gunicorn部署flask+vue

      本文链接:https://www.haomeiwen.com/subject/zkdnehtx.html