Django项目Docker构建(搭配uwsgi)
Django项目Docker构建(搭配uwsgi)
安装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
常用配置
- 修改任意地址访问,修改settings.py文件的ALLOWED_HOSTS为需要放通的IP,*为放通所有IP,如下配置
# settings.py
ALLOWED_HOSTS = ['*']
- 修改语言和时区,settings文件找到对应的配置项,修改
# 语言
LANGUAGE_CODE = 'zh-hans'
# 时区
TIME_ZONE = 'Asia/Shanghai'
# 设置为True时数据库记录UTC时间,False时记录原始时间
USE_TZ = False
- 静态路径,主要用来代理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日
其他技巧
本文链接:
/archives/1687247555341
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
percy家园!
喜欢就支持一下吧