docker容器化部署方案设计实施


目录:

方案设计图:

image.png

需求背景

  • 前端是小程序端 小程序端,线上小程序端需要接口是https 的并且要通过域名来访问,功能开发阶段采用的ip+ 端口的方式来测试
  • 后端 Django 服务, 采用uwsgi 应用程序服务器来启动Django的服务
  • 将Django服务使用docker-compose 一键部署启动

实施步骤

I、修改主机nginx 文件

配置https的时候一定要注意配置证书;我使用的是阿里云,阿里云一年有20个免费的证书可以供使用,将证书下载下来放在/etc/nginx/cert 目录中;需要注意的是,静态文件的路径设置以及免费证书只能绑定单域名,也就是说你想用子域名做转发必须,给子域名单独申请证书

# 新建一个server, 多个子域名服务转发,配置多个server就完事了
server{
        listen 80;
        listen 443 ssl;
        server_name your_server_name; # 可以写自己的域名
        ssl_certificate     /etc/nginx/cert/your_server_name.pem;
        ssl_certificate_key  /etc/nginx/cert/your_server_name.key;
        ssl_session_timeout  5m;    #缓存有效期
        location / {
            include uwsgi_params;
            uwsgi_pass  127.0.0.1:7070; # uwsgi 内部服务端口
            index  index.html index.htm;
            client_max_body_size 35m;
        }
    # 这个地方注意,静态文件指定docker 数据卷的位置,默认docker 的书卷的位置是在/var/lib/docker/volumes
        location /static/ {
            alias /var/lib/docker/volumes/django_docker_static_vol/_data/;
        }
        location /media {
            alias  /var/lib/docker/volumes/django_docker_static_media/_data/;
        }
    }

||、docker-compose.yml 编排文件 数据卷,可以编排多个容器,例如redis容器,mysql 容器等等

不同的目录下可以有多个不同的Dockerfile 以及配置文件,docker-compose 会从编排关系中去执行对应的Do ckerfile

version: "3"
volumes: # 自定义数据卷
  #db_vol: #定义数据卷同步存放容器内mysql数据
  #redis_vol: #定义数据卷同步存放redis数据
  media_vol: #定义数据卷同步存放web项目用户上传到media文件夹的数据
  static_vol: #定义数据卷同步存放web项目static文件夹的数据

networks: # 自定义网络(默认桥接), 不使用links通信
  nginx_network:
    driver: bridge

services:
  web:
    restart: always
    build: ./ArtBackend # 当前目录
    ports: # 端口映射
      - "7070:7070"
    expose: # 暴露端口
      - "7070"
    volumes:
      - ./ArtBackend:/var/www/html/ArtBackend # 挂载项目代码
      - static_vol:/var/www/html/ArtBackend/static # 以数据卷挂载容器内static文件
      - media_vol:/var/www/html/ArtBackend/media # 以数据卷挂载容器内用户上传媒体文件
      - ./compose/uwsgi:/tmp # 挂载uwsgi日志

    networks:
      - nginx_network

    tty: true
    stdin_open: true
    # 主nginx 已存在 临时注释
  # nginx:
  #   build: ./Compose/nginx
  #   ports:
  #     - "80:80"
  #     - "443:443"
  #   expose: # 只暴露容器端口不进行主机映射
  #     - "8080"
  #   volumes:
  #     - ./Compose/nginx/nginx.conf:/etc/nginx/conf.d/nginx.conf # 挂载nginx配置文件
  #     - ./Compose/nginx/ssl:/usr/share/nginx/ssl # 挂载ssl证书目录
  #     - ./Compose/nginx/log:/var/log/nginx # 挂载日志
  #     - static_vol:/usr/share/nginx/html/static # 挂载静态文件
  #     - media_vol:/usr/share/nginx/html/media # 挂载用户上传媒体文件
  #   networks:
  #     - nginx_network
  #   depends_on:
  #     - web
  #   restart: always

|||、编写Dockerfile文件,进行镜像构建

# 从仓库拉取 带有 python 3.8 的 Linux 环境
FROM python:3.8
# 设置 python 环境变量
ENV PYTHONUNBUFFERED 1

MAINTAINER sunboy

# 添加Debian 清华源
RUN echo \
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free\
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free\
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free\
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free\
> /etc/apt/sources.list

# 设置liux时区,不然会出现时区问题
ENV TIME_ZONE=Asia/Shanghai 
RUN ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime && echo $TIME_ZONE > /etc/timezone

# 复制pip 镜像文件
COPY pip.conf /root/.pip/pip.conf

ENV APP_HOME=/var/www/html/ArtBackend
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME

# 将当前目录加入到工作目录中(. 表示当前目录)
ADD . $APP_HOME

# 更新 pip
RUN pip install pip -U

# 将 requirements.txt 复制到容器的 code 目录
ADD requirements.txt $APP_HOME

# 安装库
RUN pip install -r requirements.txt

# 给start.sh可执行权限
RUN chmod +x ./start.sh

# 使用uwsgi 启动服务
ENTRYPOINT /bin/bash ./start.sh

IV、 启动脚本 收集静态文件

#!/bin/bash
# 收集静态文件
python manage.py collectstatic --noinput&&
# 迁移数据库 暂不操作
# uwsgi 启动django 服务
uwsgi --ini uwsgi.ini&&
# 6. tail空命令防止web容器执行脚本后退出
tail -f /dev/null

exec "$@"

VI、配置uwsgi 文件

[uwsgi]

project=ArtBackend
uid=www-data
gid=www-data
base=/var/www/html

chdir=%(base)/%(project)
module = %(project).wsgi:application
master = True  #设置是否允许主进程存在
process = 2 #设置进程数量

# uWSGI服务器启动占用的地址和端口, 注意这里是socket 不是 http
socket = 0.0.0.0:7070 
chown-socket=%(uid):www-data
chmod-socket=664

#设置服务器退出时自动清理环境
vacuum = true  
max-requests=5000

pidfile=/tmp/%(project)-master.pid
daemonize=/tmp/%(project)-uwsgi.log


#static-map=/static=/art/static
#设置django静态文件夹的路径

#设置一个请求的超时时间(秒),如果一个请求超过了这个时间,则请求被丢弃
harakiri = 60
post buffering = 8192
buffer-size= 65535
#当一个请求被harakiri杀掉会,会输出一条日志
harakiri-verbose = true
#开启内存使用情况报告
memory-report = true
#设置平滑的重启(直到处理完接收到的请求)的长等待时间(秒)
reload-mercy = 10
#设置工作进程使用虚拟内存超过N MB就回收重启
reload-on-as= 1024

VII、 拉取最新的代码,然后在docker-compose.yml 文件所在路径使用如下命令
#构建镜像
docker-compose build 
# 后台启动容器
docker-compose up -d

碰到的问题

  • 碰到一个django的安全问题,4.0 之后 使用第三方js的库的时候 会碰到跨源开启策略SECURE_CROSS_ORIGIN_OPENER_POLICY 问题,默认是“same-origin”,可以设置为None来规避这个问题
  • 静态文件的路径一定要注意,斜杠匹配,因为/static/ 数据卷路径最后为加/而导致问题,一定要注意看nginx的日志文件。