项目目录如下:
django_test
|--compose/
|--mysql/
|--mysql.conf
|--nginx/
|--Dockerfile
|--log
|--nginx.conf
|--ssl
|--djangosite/
|--apps/
|--djangosite/
|--Dockerfile
|--manage.py
|--pip.conf
|--requirements.txt
|--start.sh
|--usite_wsig.ini
|--docker-compose.yaml
数据库配置文件
# mysql.conf
[mysqld]
user=mysql
default-storage-engine=INNODB
character-set-server=utf8mb4
port = 3306 # 端口与docker-compose里映射端口保持一致
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
[client]
port = 3306
default-character-set=utf8mb4
[mysql]
no-auto-rehash
default-character-set=utf8mb4
Nginx配置
# nginx Dockerfile
FROM nginx:latest
# 删除原有配置文件,创建静态资源文件夹和ssl证书保存文件夹
RUN rm /etc/nginx/conf.d/default.conf \
&& mkdir -p /usr/share/nginx/html/static \
&& mkdir -p /usr/share/nginx/html/media \
&& mkdir -p /usr/share/nginx/ssl
# 设置Media文件夹用户和用户组为Linux默认www-data, 并给予可读和可执行权限,
# 否则用户上传的图片无法正确显示。
RUN chown -R www-data:www-data /usr/share/nginx/html/media \
&& chmod -R 775 /usr/share/nginx/html/media
# 添加配置文件
ADD ./nginx.conf /etc/nginx/conf.d/
# 关闭守护模式
CMD ["nginx", "-g", "daemon off;"]
# nginx.conf
upstream django {
ip_hash;
server web:8000; # Docker-compose web服务端口
}
server {
listen 80; # 监听80端口
server_name localhost; # 可以是nginx容器所在ip地址或127.0.0.1,不能写宿主机外网ip地址
charset utf-8;
client_max_body_size 10M; # 限制用户上传文件大小
location /static {
alias /usr/share/nginx/html/static; # 静态资源路径
}
location /media {
alias /usr/share/nginx/html/media; # 媒体资源,用户上传文件路径
}
location / {
include /etc/nginx/uwsgi_params;
uwsgi_pass django;
uwsgi_read_timeout 600;
uwsgi_connect_timeout 600;
uwsgi_send_timeout 600;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
# proxy_pass http://django; # 使用uwsgi通信,而不是http,所以不使用proxy_pass。
}
}
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
server_tokens off;
uwsig配置文件
# usite_wsgi.ini
[uwsgi]
project=djangosite
# uwsgi启动用户名和用户组
uid=root
gid=www-data
base=/var/www
# 指定项目的目录,在app加载前切换到当前目录
chdir=%(base)/%(project)
# 指定项目的application,加载指定的python WSGI模块
module=%(project).wsgi:application
# 启动一个master进程来管理其他进程
master=True
# 开启的进程数量
processes=2
# uwsgi监听的socket,可以为socket文件或ip地址+端口号
socket=0.0.0.0:8000
# 设置unix socket的权限
chown-socket=%(uid):www-data
chmod-socket=664
# 当服务器退出的时候自动删除unix socket文件和pid文件
vacuum=True
max-requests=5000
# 指定pid文件
pidfile=/tmp/%(project)-master.pid
# 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器
daemonize=/tmp/%(project)-uwsgi.log
#设置一个请求的超时时间(秒),如果一个请求超过了这个时间,则请求被丢弃
harakiri = 60
# 设置缓冲
post buffering = 8192
# 设置用于uwsgi包解析的内部缓存区大小。默认是4k。
# 如果你打算接受一个拥有很多请求头的大请求,你可以增加这个值到64k。
buffer-size= 65535
#当一个请求被harakiri杀掉会,会输出一条日志
harakiri-verbose = true
#开启内存使用情况报告
memory-report = true
#设置平滑的重启(直到处理完接收到的请求)的长等待时间(秒)
reload-mercy = 10
#设置工作进程使用虚拟内存超过N MB就回收重启
reload-on-as= 1024
# 自动重灾python代码
python-autoreload=1
容器启动后执行的入口文件
#!/bin/bash
# 如果任何语句的执行结果不是true则退出
set -e
# 收集静态文件
python3 manage.py collectstatic --noinput &&
# 生成数据库可执行文件
python3 manage.py makemigrations &&
## 执行文件修改数据库
#python3 manage.py migrate --fake &&
python3 manage.py migrate &&
# emperor模式启动uwsgi
uwsgi --emperor /etc/uwsgi/vassals --uid root
最后的docker-compose.yml文件
version: "3"
volumes: # 自定义数据卷,位于宿主机/var/lib/docker/volumes内
djangosite_db_vol: # 定义数据卷同步容器内mysql数据
djangosite_media_vol: # 定义数据卷同步media文件夹数据
networks: # 自定义网络(默认桥接), 不使用links通信
nginx_network:
driver: bridge
db_network:
driver: bridge
services:
db:
image: mysql:5.7
container_name: djangosite_msq # 指定容器名称
networks:
- db_network
environment:
- MYSQL_ROOT_PASSWORD=root # 数据库密码
- MYSQL_DATABASE=mysite # 数据库名称
- TZ=Asia/Shanghai # 设置容器时区与宿主机保持一致
volumes:
- djangosite_db_vol:/var/lib/mysql:rw # 挂载数据库数据, 可读可写
- ./compose/mysql/mysql.cnf:/etc/mysql/mysql.cnf # 挂载配置文件
- ./compose/mysql/utp.sql:/tmp/utp.sql # 挂载sql文件
# - ./compose/mysql/init:/docker-entrypoint-initdb.d/ # 挂载数据初始化sql脚本
ports:
- "3306:3306" # 3306与配置文件保持一致
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
restart: always
web:
build: ./djangosite # 使用当前目录下的Dockerfile
container_name: djangosite_web
# ports:
# - "8000:8000"
expose:
- "8000" # 暴露端口给nginx访问
volumes:
- ./djangosite:/var/www/ui_test_platform # 挂载项目代码
- djangosite_media_vol:/var/www/djangosite/media # 以数据卷挂载容器内用户上传媒体文件
- ./log/uwsgi:/tmp/uwsgi # 挂载uwsgi日志
networks:
- nginx_network
- db_network
depends_on: # 依赖关系
- db
environment:
- DEBUG=False
- TZ=Asia/Shanghai # 设置容器时区与宿主机保持一致
restart: always # 指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always 或者 unless-stopped。
tty: true # 模拟一个伪终端。
stdin_open: true # 打开标准输入,可以接受外部输入。
# 指定服务容器启动后执行的入口文件。
entrypoint: /var/www/djangosite/start.sh
nginx:
build: ./compose/nginx
container_name: diangosite_nginx
ports:
- "80:80"
- "443:443"
expose:
- "80"
environment:
TZ: Asia/Shanghai # 设置时区
volumes:
- ./djangosite/static:/usr/share/nginx/html/static # 挂载静态文件
# - ./compose/nginx/ssl:/usr/share/nginx/ssl # 挂载ssl证书目录
- ./log/nginx/:/tmp/nginx # 挂载日志
- djangosite_media_vol:/usr/share/nginx/html/media # 挂载用户上传媒体文件
networks:
- nginx_network
depends_on:
- web
restart: always
最后构建并启动服务:
docker-compose build
docker-compose up -d