正在进入ing...

DockerCompose部署Django+mysql+redis

发布时间:2021-10-10 浏览量: 53 文章分类: 运维相关

自从学会了Docker的使用以后,我的站点基本都是采用Docker的方式来部署的,但是Docker容器毕竟只能部署单容器,对于Django来说还要依赖的东西比较多,比如MysqlRedis等等,所以对于这种问题,单纯使用Dockerlink管理几个还行,如果容器越来越多就比较麻烦了。最好的方式还是使用DockerCompose来进行单机的统一管理(如果是多机就要使用k8s)。

写在前面的话

  • 我自己的部署一般是宿主机安装Nginx,单机部署,Nginx可以解析不同的请求到不同的服务,所以就把Nginx直接装本机了。
  • 如果不熟悉Docker命令、和传统部署方式建议先了解。

直接上手

废话不多说,直接docker-compose.yml结构如下

version: "3"

services:
    redis:
        image: redis
        volumes:
            - ./redis:/data:rw
        expose:
            - 6379
        command: redis-server --requirepass 123456 # 给Redis加个密码
        restart: always
    db:
        image: mysql:5.7
        environment:
            MYSQL_DATABASE: django_db # 数据库名称
            MYSQL_ROOT_PASSWORD: 123456 # 用户密码
        volumes:
            - ./mysql:/var/lib/mysql:rw # 挂载数据库数据, 可读可写
        ports:
            - "3306:3006"
        restart: always
    web:
        build: ./web
        ports:
            - "8000:8000"
        volumes:
            - ./web:/home/web
        links:
            - redis
            - db
        tty: true  # 不加Django可能会无法启动
        restart: always

docker-compose.yml的同级目录创建Django项目web,创建文件夹mysqlredis用于储存文件,避免数据丢失。

修改Django设置

Djangosettings.py里面修改一下mysql的连接方式。

# # MYSQL
DATABASES = {
    'default':{
        'ENGINE':'django.db.backends.mysql',
        'NAME':'django_db',
        'USER':'root',
        'PASSWORD':'123456',
        'HOST':'db',
        'POST':3306
    }
}



# Redis 配置
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis", # 安装redis的主机的 IP 和 端口
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {
                "max_connections": 1000,
                "encoding": 'utf-8'
            },
            "PASSWORD": "123456" # redis密码
        }
    }
}

记得不要忘记修改pymysql,如果忘记,可以查看 django3使用pymysql报错问题(无需修改源码)

增加gunicorn.pystart.sh两个文件

# gunicorn.py

import logging
import logging.handlers
from logging.handlers import WatchedFileHandler
import os
import multiprocessing

bind = "0.0.0.0:8000" 
workers = 4 # 具体由机器决定
threads = 16 # 具体由机器决定
proc_name = 'web'   #进程名
reload = True
restart = True
worker_class = 'gevent
# start.sh

# !/bin/bash
python manage.py collectstatic --noinput && python manage.py migrate &&
gunicorn web.wsgi:application -c gunicorn.py # 注意gunicorn后面的web,如果你的项目不是web,就要改成项目名

构建镜像

执行docker-compose build,如果没问题,系统会开始构建,这个时候会拉取python3.9mysql5.7redis的镜像,这里因为要从docker的服务器上拉取,速度取决于你的网速。不要忘记把需要用到的python依赖生成requirements.txt

大功告成

然后在 构建完成后执行docker-compose up 即可以命令行方式查看执行情况,如果需要后台执行,只要docker-compose up -d即可~

题外话

后续还需要在宿主机的Nginx配置比如https、静态文件、请求转发等问题,这些就和常规的都是一致的了。如果单独起一个容器,然后直接在本地都统一管理也是可以的,这个就看个人了。

以上是我目前觉得比较方便的一种部署方法,比较实用,当然如果你有更好的方法或者有什么需要探讨的也可以联系我 互相交流学习。