使用 Docker 部署 Django 项目

之前写过一篇使用 centos7+nginx 部署 django 项目的博文,此项目因为是前后端不分离的模式,一些静态文件需要使用 nginx 代理才能访问,没有使用到 docker。
原文连接:https://blog.csdn.net/qq_39253370/article/details/106454587

目录结构

如果是前后端分离的话,后端只需要提供接口就行,另外加一些权限控制,部署起来也相对简单。
在这里插入图片描述
有两个文件需要注意一下:

  1. pip.conf:替换 pip 源,下载第三包会很快
  2. start.sh:在使用 uwsgi 部署时,这里面时启动命令
pip.conf:
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
start.sh
uwsgi --ini /var/www/html/mysite1/uwsgi.ini

上传项目到服务器

可任意放在一个目录下面:

这里放在: /home/{
    
    xx}/data/project下面

如图:
在这里插入图片描述

编写 Dockerfile

# 建立 python3.7 环境
FROM python:3.7
 
# 镜像作者
MAINTAINER xx
 
# 设置 python 环境变量
ENV PYTHONUNBUFFERED 1
 
# 设置pip源为国内源
# 我这里运行时报错,暂时就没管,可根据自己服务器路径来配置
# COPY /home/yufuxiao/data/project/gongyequ/pip.conf /root/.pip/pip.conf
 
# 在容器内/var/www/html/下创建 mysite1文件夹
# 注意:这里就是在容器里面具体操作,run起来之后会新建下面的目录
RUN mkdir -p /var/www/html/mysite1
 
# 设置容器内工作目录
WORKDIR /var/www/html/mysite1
 
# 将当前目录文件加入到容器工作目录中(. 表示当前宿主机目录)
# 就是将/home/{xx}/data/project下面所有的文件都会加入到容器里面,这里我们只放了我们的项目文件
ADD . /var/www/html/mysite1
 
# 利用 pip 安装依赖
# 安装依赖
# RUN python3.7 -m pip install -r /home/yufuxiao/data/project/gongyequ/requirements.txt

# Windows环境下编写的start.sh每行命令结尾有多余的\r字符,需移除。
# 启动项目
RUN sed -i 's/\r//' /var/www/html/mysite1/gongyequ/start.sh

 # 设置start.sh文件可执行权限
RUN chmod +x /var/www/html/mysite1/gongyequ/start.sh

构建镜像并运行

sudo docker build -t docker_django_img:v1 .
-t:打标签
.:上下文目录,当前项目和dockerfile在一个目录下可以使用点,如果不在一个目录下,就要指定目录

sudo docker images 查看构建好的镜像,如下图:
删除镜像:sudo docker rmi 镜像id -f参数:强制删除
在这里插入图片描述
运行:

sudo docker run --name 自己起个名称  -p 宿主机端口:容器端口  镜像名称。
示例:sudo docker run --name gongyequ -p 10418:8000 django_docker_img:v1

查看是否启动成功:sudo docker ps
查看所有容器运行状态:sudo docker ps -a
重启容器:sudo docker restart 容器名称或id
删除容器:sudo docker rm 容器名称或id -f 参数:强制删除
在这里插入图片描述

进入容器并运行项目

sudo docker exec -it 容器id或名称 /bin/bash

另外一种进入容器的方法:docker attach [OPTIONS] CONTAINER
安装所有的依赖包:pip install -r requirements.txt
安装 uwsgi :pip install uwsgi
启动项目:python manager.py runserver 0.0.0.0:8000
如果启动成功,说明到这里算是完成一大半了。

编写 uwsgi.ini

在上述我们使用了Django了自带的runserver命令启动了测试服务器,但是只能用户本地调式开发用,但实际生成环境中你应该需要使用支持高并发的uwsgi服务器来启动Django服务。

[uwsgi]
# 项目名称
project=mysite
# 项目路径
base=/var/www/html

# 指定项目的目录,在app加载前切换到当前目录,这个一定要注意,是app目录
# gongyequ:app名称
chdir=/var/www/html/mysite1/gongyequ
# 指定项目的application,加载指定的python WSGI模块(模块路径必须在PYTHONPATH里)
# 这里就是 django 项目里面的 wsgi.py 文件
# nsproject:django项目名
module=nsproject.wsgi:application
# 启动一个master进程来管理其他进程
master=True
# 进程数,如果把主进程 master 那么子进程也会kill掉
processes=2

# 用nginx的时候就配socket , 直接运行的时候配 http
# 指定IP端口 // 直接外部访问
http=0.0.0.0:8000
# 设置用于uwsgi包解析的内部缓存区大小。默认是4k 最大64
buffer-size=65536

# 超时时间
harakiri=60

# 设置后台运行
daemonize=uwsgi.log

执行此文件:uwsgi uwsgi.ini
外部可访问说明部署成功。

报错:no python application found, check your startup logs for errors

此问题一般是 uwsgi.ini 中配置没有写对,请重新检查,最容易出错的地方是路径配置:

# 指定项目的目录,在app加载前切换到当前目录,这个一定要注意,是app目录
# gongyequ:app名称
chdir=/var/www/html/mysite1/gongyequ
# 指定项目的application,加载指定的python WSGI模块(模块路径必须在PYTHONPATH里)
# 这里就是 django 项目里面的 wsgi.py 文件
# nsproject:django项目名
module=nsproject.wsgi:application

其他辅助类包:

在容器中难免编辑文件,需要安装vim,Ubuntu 下安装vim:

apt-get update && apt-get install apt-file -y && apt-file update && apt-get install vim

查看端口是否开启:

apt-get update && apt-get install net-tools

容器内部如有访问 redis 请把 bind 改为 0.0.0.0 或直接注释 bind

uwsgi 其他命令

https://www.jianshu.com/p/07458e99198a

docker 命令

https://www.runoob.com/docker/docker-command-manual.html

uwsgi 相关解释

Django 是一个 Web 框架,框架的作用在于处理 request 和 reponse,其他的不是框架所关心的内容。所以怎么部署 Django 不是 Django 所需要关心的。

Django 所提供的是一个开发服务器,这个开发服务器,没有经过安全测试,而且使用的是 Python 自带的 simple HTTPServer 创建的,在安全性和效率上都是不行的

而uWSGI 是一个全功能的 HTTP 服务器,他要做的就是把 HTTP 协议转化成语言支持的网络协议。比如把 HTTP 协议转化成 WSGI 协议,让 Python 可以直接使用。
uwsgi 是一种 uWSGI 的内部协议,使用二进制方式和其他应用程序进行通信。
参考:https://blog.csdn.net/mnszmlcd/article/details/78819237
uwsgi 总体概括:
首先客户端请求过来------发送给uwsgi做处理(封装、处理数据)------中间件----路由----试图函数-----数据库操作或者模板渲染
在这里插入图片描述
相关文章推荐:https://blog.csdn.net/qq_39253370/article/details/104620553

猜你喜欢

转载自blog.csdn.net/qq_39253370/article/details/115386246