docker实现django+daphne+nginx(uwsgi+channels)项目部署

django、部署、docker、daphne、nginx、uwsgi、channels
摘要由CSDN通过智能技术生成

介绍

常规部署形式为django+uwsgi+nginx组合,但本项目之区别就是将uwsgi替换成daphne。
为什么要使用daphne?与uwsgi有何区别?
项目中使用了channels实现了websocket功能,启动方式由原先的uwsgi协议变成了asgi启动,即项目既要支持http请求,又要支持websocket请求

http支持 websocket支持
uwsgi ×
daphne

现在有两种部署方式:

  • uwsgi+daphne部署:http请求发送给uwsgi处理,websocket请求发送给daphne处理。
    部署完成后uwsgi与daphne分别需要一个本地端口映射,所以这种方式需要2个端口
  • daphne部署
    我选择的部署方式,原因有二:1、我的项目中http与ws请求的是一个端口2、方便省事快捷

一、项目分析

我的django项目中需要使用mysql、redis。部署需要nginx。所以需要编辑四个镜像

镜像 容器名 版本 设置网络实现局域网内容器通信
mysql django_mysql latest django_net
redis django_redis latest django_net
nginx django_nginx latest django_net
myDrg django_web latest django_net

二、镜像创建及项目配置变更

2.1、创建容器内局域网,帮助!

# 创建网络,默认bridge桥接网络
docker network create django_net(自定义名称)
# 查看已有网络
docker network list
# docker容器连接/断开网络。单个docker容器可以支持多个网络
docker network connect/disconnect label(网络名字或者id) container(容器名字或者id)
# 删除网络
docker network rm label(网络名字或者id)
# 查看详细信息
docker network inspect label(网络名字或者id)

2.2、mysql镜像

2.2.1、创建镜像
# 搜索docker官方提供的mysql库
docker search mysql
# 拉取mysql。默认拉取最新版本latest,如需指定版本,则需语法':x.x.x'
docker pull mysql
# 创建并启动mysql
# 因我本地3306端口已被占用,所以docker-mysql容器映射到本地(localhost)端口3307,可使用navicat进行连接
docker run -p 3307:3306 --name django_mysql --network django_net -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest

在这里插入图片描述

2.2.2、数据导出导入
# 导出服务器下sql数据导出至本地
mysqldump --no-defaults -u root -p develop(数据库名称) > d:\test.sql(本地sql文件)

# mysql数据库内导入数据

# 方式一:进入数据库导入数据
mysql -u -p123456
use new
source d:\test.sql
# 方式二:一键操作
mysql -uroot -p123456 -D new -e "source d:\test.sql"
# 方式三:navicat导入

在这里插入图片描述

2.2.3、django-settings关于sql的相关配置
# 当mysql数据源采用docker中的mysql容器数据时,从上可知,mysql容器名字为django_mysql
DATABASES = {
   
    'default': {
   
        'ENGINE': 'django.db.backends.mysql',
        'HOST': 'django_mysql',  # docker-mysql主机host
        # 'HOST': 'localhost',  # 本地主机host
        'PORT': 3306,         # 端口
        'NAME': 'develop',        # 数据库
        'USER': 'root',       # 账号
        'PASSWORD': 'xxxxxx',  # 密码
    }
}

2.3、redis镜像

2.3.1、创建镜像

# 创建并启动redis
# 因我本地6379端口已被占用,所以docker-redis容器映射到本地(localhost)端口6380,可使用redis-desktop-manager进行连接
docker run -p 6380:6379 --name django_redis --network django_net -d redis:latest
2.3.2、django-settings关于redis的相关配置
# 项目channels之redis配置
ASGI_APPLICATION = 'app(项目名字).routing.application'  # asgi配置路径
CHANNEL_LAYERS = {
   
    'default': {
   
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
   
            # "hosts": [('127.0.0.1', 6379)],  # 本地redis host
            "hosts": [('django_redis', 6379)],  # docker-redis host, docker-redis容器名字为django_redis
        },
    },
}

2.4、项目镜像

2.4.1、编写Dockerfile文件
# python 指定版本
FROM python:3.9

# 更新apt-get
RUN apt-get update

# 设置环境变量
ENV path /usr/src/app

# 切换至/usr/src/app路径(路径存在即切换;路径不存在则创建并切换,docke创建命令为'RUN mkdir -p /usr/src/app')
WORKDIR ${
   path}

# 设置镜像源
COPY pip.conf /root/.pip/pip.conf

# 将文件/文件包存放到存储空间,此处有问题,实际上应该以挂载的方式将文件放在docker中,以便代码变更时,代码变更更方便
COPY . $WORKDIR

# python 运行环境
RUN pip install -r requirements.txt

# 容器执行命令介绍,按需选择

# 常规项目启动
# CMD [ "/usr/local/bin/python", "app(项目名字)/manage.py", "runserver", "0.0.0.0:8000"]
# uwsgi部署启动方式
# CMD uwsgi --ini uwsgi.ini
# daphne部署启动方式,WORKDIR不可缺少,为了跟manage.py同级terminal调用daphne命令
#WORKDIR ${path}/app(项目名字)
# CMD ["daphne", "-p", "8000", "-b", "0.0.0.0", "app(项目名字).routing:application"]
# supervisor启动方式
# 创建supervisor所需文件及文件夹
RUN mkdir /var/log/supervisor
RUN touch /var/log/supervisor/supervisord.log
CMD ["supervisord", "-n", "-c", "/usr/src/app/daphne.conf"]
# 举例多项命令执行方法
# CMD service cron start && supervisord -n -c /usr/src/app/daphne.conf
# 暴露端口,此暴露是为了给容器间通信,与项目启动时的暴露不同.项目启动暴露的既可用于容器通信,也可映射到本地通信
EXPOSE 80 8080 8000 8888
# 辅助选项,参考用法,有可能有用是吧!!
# RUN apt-get install -y cron  # 安装crontab
# RUN mv /usr/src/app/backup.sh / && mv /usr/src/app/my.conf /  # backup.sh是数据库备份bash文件,没有;conf是辅助文件
# RUN mv cron.sh /var/spool/cron/crontabs/root  # cron.sh 内容为crontab内容,放置到/var/spool/cron/crontabs/主机 自动调用
#RUN wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.31-linux-glibc2.17-x86_64-minimal.tar.xz && \
#    tar -xvf *.tar.xz && \
#    mv mysql-8.0.31-linux-glibc2.17-x86_64-minimal mysql-8.0.31 && \
#    mv mysql-8.0.31 /usr/local/  # 或者ln -s mysql-8.0.31/ /usr/local/mysql-8.0.31
#RUN chmod u=rw,go=r /usr/src/app/app(项目名字)/mycelery/my.conf
补充、supervisor如何管理我的项目
[unix_http_server]
file=/var/run/supervisor.sock  ; (the path to the socket file)
[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file; default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学无止境gwx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值