DockerCompose部署Django+mysql+redis
自从学会了Docker的使用以后,我的站点基本都是采用Docker的方式来部署的,但是Docker容器毕竟只能部署单容器,对于Django来说还要依赖的东西比较多,比如Mysql、Redis等等,所以对于这种问题,单纯使用Docker的link管理几个还行,如果容器越来越多就比较麻烦了。最好的方式还是使用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,创建文件夹mysql、redis用于储存文件,避免数据丢失。
修改Django设置
在Django的settings.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.py、start.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.9、mysql5.7、redis的镜像,这里因为要从docker的服务器上拉取,速度取决于你的网速。不要忘记把需要用到的python依赖生成requirements.txt
大功告成
然后在 构建完成后执行docker-compose up 即可以命令行方式查看执行情况,如果需要后台执行,只要docker-compose up -d即可~
题外话
后续还需要在宿主机的Nginx配置比如https、静态文件、请求转发等问题,这些就和常规的都是一致的了。如果单独起一个容器,然后直接在本地都统一管理也是可以的,这个就看个人了。
以上是我目前觉得比较方便的一种部署方法,比较实用,当然如果你有更好的方法或者有什么需要探讨的也可以联系我 互相交流学习。