一、准备镜像和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内容如下,在安装包之前配置好
网友评论