项目目录如下:
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=mysqldefault-storage-engine=INNODBcharacter-set-server=utf8mb4port = 3306 # 端口与docker-compose里映射端口保持一致basedir = /usrdatadir = /var/lib/mysqltmpdir = /tmppid-file = /var/run/mysqld/mysqld.pidsocket = /var/run/mysqld/mysqld.sock[client]port = 3306default-character-set=utf8mb4[mysql]no-auto-rehashdefault-character-set=utf8mb4
Nginx配置
# nginx DockerfileFROM 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.confupstream 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=rootgid=www-database=/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-datachmod-socket=664# 当服务器退出的时候自动删除unix socket文件和pid文件vacuum=Truemax-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模式启动uwsgiuwsgi --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: bridgedb_network:driver: bridgeservices:db:image: mysql:5.7container_name: djangosite_msq # 指定容器名称networks:- db_networkenvironment:- 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_cirestart: alwaysweb:build: ./djangosite # 使用当前目录下的Dockerfilecontainer_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_networkdepends_on: # 依赖关系- dbenvironment:- DEBUG=False- TZ=Asia/Shanghai # 设置容器时区与宿主机保持一致restart: always # 指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always 或者 unless-stopped。tty: true # 模拟一个伪终端。stdin_open: true # 打开标准输入,可以接受外部输入。# 指定服务容器启动后执行的入口文件。entrypoint: /var/www/djangosite/start.shnginx:build: ./compose/nginxcontainer_name: diangosite_nginxports:- "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_networkdepends_on:- webrestart: always
最后构建并启动服务:
docker-compose builddocker-compose up -d
