Django项目Docker构建(搭配uwsgi)

安装Docker

参照容器Docker的创建和使用

创建virtualenv

mkdir django-docker
cd django-docker
virtualenv venv
source venv/bin/activate

创建Django项目

pip install django uwsgi
django-admin startproject mysite
cd mysite

常用配置

  1. 修改任意地址访问,修改settings.py文件的ALLOWED_HOSTS为需要放通的IP,*为放通所有IP,如下配置
# settings.py
ALLOWED_HOSTS = ['*']
  1. 修改语言和时区,settings文件找到对应的配置项,修改
# 语言
LANGUAGE_CODE = 'zh-hans'
# 时区
TIME_ZONE = 'Asia/Shanghai'
# 设置为True时数据库记录UTC时间,False时记录原始时间
USE_TZ = False
  1. 静态路径,主要用来代理admin页面的静态页面。
import os
STATIC_URL = 'django-static/'
# 设置 "python manage.py collectstatic" 目标文件夹
STATIC_ROOT = os.path.join(BASE_DIR,'django-static')

创建uwsgi配置

项目根目录新建uwsgi.ini

[uwsgi]
# 项目名
project=mysite 
# Ubuntu系统下默认用户名
uid=www-data 
# Ubuntu系统下默认用户组
gid=www-data 
# 项目根目录
base=/var/www/html 

# 设置工作目录
chdir=%(base)/%(project)  
# wsgi文件位置
module=%(project).wsgi:application 
 
# 主进程
master=True
# 同时进行的进程数,一般
processes=2 
 
 
# 选项1, 使用unix socket与nginx通信,仅限于uwsgi和nginx在同一主机上情形
# Nginx配置中uwsgi_pass应指向同一socket文件
# socket=/run/uwsgi/%(project).sock

# 选项2,使用TCP socket与nginx通信
# Nginx配置中uwsgi_pass应指向uWSGI服务器IP和端口
# socket=0.0.0.0:8000 或则 socket=:8000

# 选项3,使用http协议与nginx通信
# Nginx配置中proxy_pass应指向uWSGI服务器一IP和端口
http=0.0.0.0:8000 

# socket权限设置
# chown-socket=%(uid):www-data
# chmod-socket=664

# 进程文件
pidfile=/tmp/%(project)-master.pid

# 以后台守护进程运行,并将log日志存于temp文件夹。
daemonize=/tmp/%(project)-master.log 

# 服务停止时,自动移除unix socket和pid文件
vacuum=True

# 为每个工作进程设置请求数的上限。当处理的请求总数超过这个量,进程回收重启。
max-requests=5000

# 当一个请求花费的时间超过这个时间,那么这个请求都会被丢弃。
harakiri=60

#当一个请求被harakiri杀掉会,会输出一条日志
harakiri-verbose=true

# uWsgi默认的buffersize为4096,如果请求数据超过这个量会报错。这里设置为64k
buffer-size=65536

# 如果http请求体的大小超过指定的限制,打开http body缓冲,这里为64k
post-buffering=65536

# 开启内存使用情况报告
memory-report=true

# 设置平滑的重启(直到处理完接收到的请求)的长等待时间(秒)
reload-mercy=10

# 设置工作进程使用虚拟内存超过多少MB就回收重启
reload-on-as=1024

# 设置静态文件路径,这里是让uwsgi代理admin页面的static文件,和上面setting中static路径一致
static-map=/django-static=%(base)/%(project)/django-static

配置pip源

此处在项目目录添加pip文件,后面docker通过命令引入容器内,新建在项目根目录新建pip.conf,填入以下内容,使用清华源。

[global] 
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = https://pypi.tuna.tsinghua.edu.cn 

输出requirements.txt

在项目根目录执行

pip freeze > requirements.txt

新建容器默认启动脚本

在项目根目录创建start.sh,后面会用到,在启动容器时候执行这个脚本。

#!/bin/bash
cd /var/www/html/mysite
python manage.py makemigrations&&
python manage.py migrate&&
uwsgi --ini /var/www/html/mysite/uwsgi.ini
# 上面命令后台运行,会导致容器启动后就退出,添加下面命令可以让容器保持运行。
/bin/bash

并赋予执行权限

chmod +x start.sh

创建Dockerfile

在项目根目录新建Dockerfile

 # 建立 python3.9 环境
 FROM python:3.9
 
 # 镜像作者Percy
 LABEL maintainer="镜像作者Percy"
 
 # 设置 python 环境变量
 ENV PYTHONUNBUFFERED 1
 
 # 设置pip源为国内源
 COPY pip.conf /root/.pip/pip.conf
 
 # 在容器内/var/www/html/下创建 mysite 文件夹
 RUN mkdir -p /var/www/html/mysite

 # 设置容器内工作目录
 WORKDIR /var/www/html/mysite
 
 # 将当前目录文件加入到容器工作目录中(. 表示当前宿主机目录)
 ADD . /var/www/html/mysite
 
 # 利用 pip 安装依赖
 RUN pip install -r requirements.txt

 # 拷贝admin页面的静态文件
 RUN python manage.py collectstatic
 
 # 创建数据库,如果是外部数据库,需要注释掉
 RUN python manage.py makemigrations
 RUN python manage.py migrate

 # 在容器内/var/www/html/myproject文件夹属主
 RUN chown -R www-data:www-data /var/www/html/mysite
 
 # 容器开机自动执行
 CMD [ "/var/www/html/mysite/start.sh" ]

最终项目目录结构

(venv) ➜  mysite tree
.
├── Dockerfile
├── manage.py
├── mysite
│   ├── asgi.py
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── pip.conf
├── requirements.txt
├── start.sh
└── uwsgi.ini

1 directory, 11 files

构建docker镜像

其中v1代表第一个版本

docker build -t mysite_img:v1 .

运行镜像

docker run -it -d --name mysite -p 8000:8000 mysite_img:v1

-- Write by PercyC

2023年06月20日


其他技巧

文章作者: PercyC
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 percy家园
Python 虚拟化 python pythonweb
喜欢就支持一下吧