• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Docker-compose部署Django+gunicorn+mariadb+redis+nginx

武飞扬头像
Alfred_SAMA
帮助6

部署前的准备

我的编排是在Ubuntu的环境下进行的,希望不会的小伙伴尽量参照我的系统环境来

  • Ubuntu18.04修通的电脑一台,需要联网
  • 安装好Docker
  • Docker compose 版本v2.10.2以上
  • Django项目一个

项目准备

各个容器说明

  • Django gunicorn容器: 项目核心应用,处理动态请求
  • Mariadb容器: 数据库
  • Redis容器: 缓存服务
  • Nginx容器: 反向代理并处理静态资源请求

项目结构

学新通

  • baseic: 项目APP
  • dockerfile: docker环境文件
  • docker-compose.yml: 容器编排文件
  • start.sh: 容器初始化后执行的shell命令脚本
  • requirements.txt: django 项目环境依赖文件
  • gunicorn.conf: gunicorn 配置文件

学新通

  • deployment: 包含了mariadb、nginx、redis配置信息和数据目录。
  • mysql: 放置数据库配置信息,conf 放置数据库初始化配置文件 my.cnf,data 用于挂载数据库数据,init 放置 sql 脚本(导入表结构和数据,并挂载到容器中)。
  • redis: 挂载 redis 数据
  • nginx: 放置 nginx 配置信息

容器构建

Web容器

  • 编写Dockerfile
# 建立 python3.9 环境
FROM python:3.9

# 镜像作者
MAINTAINER Hella

# 更新依赖
RUN apt-get update

# 设置python环境变量
ENV PYTHONUNBUFFERED 1

# 在容器内创建mes文件夹
RUN mkdir -p /cyxMES

# 设置容器内工作目录
WORKDIR /cyxMES

# 将当前目录文件加入到容器工作目录中
ADD . /cyxMES

# 更新pip版本
RUN /usr/local/bin/python -m pip install --upgrade pip

# pip安装依赖
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/

# 设置环境变量
ENV SPIDER=/cyxMES
学新通
  • 编写gunicorn配置文件
workers=3 # 并行工作进程数   
threads = 2 # 指定每个工作者的线程数   
bind=['0.0.0.0:8000'] # 监听内网端口8000   
proc_name='cyxMES' # 进程名称
pidfile='/tmp/blog.pid' # 设置进程文件目录   
worker_class='gevent' # 工作模式协程   
timeout=30 # 超时   
max_requests=6000 # 最大请求数   
  • 编写start.sh命令脚本
#!/bin/bash
# 从第一行到最后一行分别表示:
# 1. 守护进程执行 celery,没有这个需求的小伙伴可以将第一行命令其删除
# 2. 收集静态文件到根目录,
# 3. 生成数据库可执行文件,
# 4. 根据数据库可执行文件来修改数据库
# 5. 用 gunicorn 启动 django 服务

# celery multi start w1 -A celery_tasks.tasks worker -l info&&
# python manage.py collectstatic --noinput&&
# python manage.py makemigrations&&
# python manage.py migrate&&
gunicorn cyxMES.wsgi:application -c gunicorn.conf

Nginx容器

  • 编写Dockerfile
# nginx镜像
FROM nginx

# 删除原有配置文件,创建静态资源文件夹和ssl证书保存文件夹
RUN rm /etc/nginx/conf.d/default.conf \
&& mkdir -p /usr/share/nginx/html/static \
&& mkdir -p /usr/share/nginx/html/media \
&& mkdir -p /usr/share/nginx/ssl

# 添加配置文件
ADD ./nginx.conf /etc/nginx/conf.d/
  • 编写Nginx配置文件
# 仅用于本地docker环境测试(80端口代理http请求)
server {
    listen 80; # 监听80端口
    server_name  127.0.0.1;  # 生产环境请换成域名
    location / {
        proxy_pass http://web:8000; # 反向代理 django容器8000端口,web为django容器名称,切记不要写域名或者ip
        proxy_set_header Host $host;
        proxy_redirect off;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    location /static/ {
        alias /usr/share/nginx/html/static/; #静态资源路径
    }
    location /media/ {
        alias /usr/share/nginx/html/media/; #上传文件路径
    }
}
学新通

配置Mysql

  • 编写my.cnf文件
[mysqld]
user=mysql
default-storage-engine=INNODB
character-set-server=utf8
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
  • 导入初始化的sql文件

将需要导入的 sql 文件放入 init 目录下,并修改其名称为 init.sql


容器编排

编写docker-conpose.yml

version: "3"
services:
  redis:
    image: redis
    command: redis-server
    volumes:
      - ./deployment/redis:/data
    ports:
      - "6399:6379"
    restart: always # always表容器运行发生错误时一直重启

  db:
    image: mariadb
    environment:
      - MYSQL_DATABASE=my_blog # 数据库名称
      - MYSQL_ROOT_PASSWORD=19960331 # 数据库密码
    volumes:
      - ./deployment/mysql/data:/var/lib/mysql # 挂载数据库数据
      - ./deployment/mysql/conf/my.cnf:/etc/mysql/my.cnf # 挂载配置文件
      - ./deployment/mysql/init:/docker-entrypoint-initdb.d/ # 挂载数据初始化sql脚本
    ports:
      - "3385:3306"
    restart: always

  web:
    build: .
    expose:
      - "8000"
    volumes:
      - .:/my_blog
      - /tmp/logs:/tmp
    command: bash start.sh
    links:
      - db
      - redis
    depends_on:
      - db
      - redis
    restart: always

  nginx:
    build: deployment/nginx
    ports:
      - "80:80"
      - "443:443"
    expose:
      - "8000"
    volumes:
      - ./static:/usr/share/nginx/html/static # 挂载静态文件
      - ./static/media:/usr/share/nginx/html/media # 挂载上传文件
    links:
      - web
    depends_on:
      - web
    restart: always
学新通
  • redis,db,web,nginx 为容器名称
  • image 表示拉取镜像名称,build 会在给定目录下寻找 Dockerfile 并构建容器环境
  • expose 表示将端口暴露给其他容器,但不暴露给主机(不同容器默认相互隔离)
  • ports 表示将该容器端口映射到主机端口(从右往左读,例如 ports: - “3307:3306”,是指把容器的 3306 端口映射到主机的 3307 端口),同时该容器端口也会对其他容器开放
  • volumes 表示挂载,就是将本机的文件和容器中的文件映射起来,容器和本地环境本来是隔离的,挂载相当于是凿了一个小洞,让两者数据可以互通
  • links 表示将容器互联起来
  • depends_on:表示依赖关系,因为容器的启动有先后顺序,django 容器依赖于 mysql 容器和 redis 容器(django 需要从数据库和缓存中读写数据),而 nginx 依赖于 django 容器(nginx 容器需要反向代理 django 容器的 8000 端口)

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfhagge
系列文章
更多 icon
同类精品
更多 icon
继续加载