项目目录如下:

  1. django_test
  2. |--compose/
  3. |--mysql/
  4. |--mysql.conf
  5. |--nginx/
  6. |--Dockerfile
  7. |--log
  8. |--nginx.conf
  9. |--ssl
  10. |--djangosite/
  11. |--apps/
  12. |--djangosite/
  13. |--Dockerfile
  14. |--manage.py
  15. |--pip.conf
  16. |--requirements.txt
  17. |--start.sh
  18. |--usite_wsig.ini
  19. |--docker-compose.yaml

数据库配置文件

  1. # mysql.conf
  2. [mysqld]
  3. user=mysql
  4. default-storage-engine=INNODB
  5. character-set-server=utf8mb4
  6. port = 3306 # 端口与docker-compose里映射端口保持一致
  7. basedir = /usr
  8. datadir = /var/lib/mysql
  9. tmpdir = /tmp
  10. pid-file = /var/run/mysqld/mysqld.pid
  11. socket = /var/run/mysqld/mysqld.sock
  12. [client]
  13. port = 3306
  14. default-character-set=utf8mb4
  15. [mysql]
  16. no-auto-rehash
  17. default-character-set=utf8mb4

Nginx配置

  1. # nginx Dockerfile
  2. FROM nginx:latest
  3. # 删除原有配置文件,创建静态资源文件夹和ssl证书保存文件夹
  4. RUN rm /etc/nginx/conf.d/default.conf \
  5. && mkdir -p /usr/share/nginx/html/static \
  6. && mkdir -p /usr/share/nginx/html/media \
  7. && mkdir -p /usr/share/nginx/ssl
  8. # 设置Media文件夹用户和用户组为Linux默认www-data, 并给予可读和可执行权限,
  9. # 否则用户上传的图片无法正确显示。
  10. RUN chown -R www-data:www-data /usr/share/nginx/html/media \
  11. && chmod -R 775 /usr/share/nginx/html/media
  12. # 添加配置文件
  13. ADD ./nginx.conf /etc/nginx/conf.d/
  14. # 关闭守护模式
  15. CMD ["nginx", "-g", "daemon off;"]
  1. # nginx.conf
  2. upstream django {
  3. ip_hash;
  4. server web:8000; # Docker-compose web服务端口
  5. }
  6. server {
  7. listen 80; # 监听80端口
  8. server_name localhost; # 可以是nginx容器所在ip地址或127.0.0.1,不能写宿主机外网ip地址
  9. charset utf-8;
  10. client_max_body_size 10M; # 限制用户上传文件大小
  11. location /static {
  12. alias /usr/share/nginx/html/static; # 静态资源路径
  13. }
  14. location /media {
  15. alias /usr/share/nginx/html/media; # 媒体资源,用户上传文件路径
  16. }
  17. location / {
  18. include /etc/nginx/uwsgi_params;
  19. uwsgi_pass django;
  20. uwsgi_read_timeout 600;
  21. uwsgi_connect_timeout 600;
  22. uwsgi_send_timeout 600;
  23. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  24. proxy_set_header Host $http_host;
  25. proxy_redirect off;
  26. proxy_set_header X-Real-IP $remote_addr;
  27. # proxy_pass http://django; # 使用uwsgi通信,而不是http,所以不使用proxy_pass。
  28. }
  29. }
  30. access_log /var/log/nginx/access.log main;
  31. error_log /var/log/nginx/error.log warn;
  32. server_tokens off;

uwsig配置文件

  1. # usite_wsgi.ini
  2. [uwsgi]
  3. project=djangosite
  4. # uwsgi启动用户名和用户组
  5. uid=root
  6. gid=www-data
  7. base=/var/www
  8. # 指定项目的目录,在app加载前切换到当前目录
  9. chdir=%(base)/%(project)
  10. # 指定项目的application,加载指定的python WSGI模块
  11. module=%(project).wsgi:application
  12. # 启动一个master进程来管理其他进程
  13. master=True
  14. # 开启的进程数量
  15. processes=2
  16. # uwsgi监听的socket,可以为socket文件或ip地址+端口号
  17. socket=0.0.0.0:8000
  18. # 设置unix socket的权限
  19. chown-socket=%(uid):www-data
  20. chmod-socket=664
  21. # 当服务器退出的时候自动删除unix socket文件和pid文件
  22. vacuum=True
  23. max-requests=5000
  24. # 指定pid文件
  25. pidfile=/tmp/%(project)-master.pid
  26. # 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器
  27. daemonize=/tmp/%(project)-uwsgi.log
  28. #设置一个请求的超时时间(秒),如果一个请求超过了这个时间,则请求被丢弃
  29. harakiri = 60
  30. # 设置缓冲
  31. post buffering = 8192
  32. # 设置用于uwsgi包解析的内部缓存区大小。默认是4k。
  33. # 如果你打算接受一个拥有很多请求头的大请求,你可以增加这个值到64k。
  34. buffer-size= 65535
  35. #当一个请求被harakiri杀掉会,会输出一条日志
  36. harakiri-verbose = true
  37. #开启内存使用情况报告
  38. memory-report = true
  39. #设置平滑的重启(直到处理完接收到的请求)的长等待时间(秒)
  40. reload-mercy = 10
  41. #设置工作进程使用虚拟内存超过N MB就回收重启
  42. reload-on-as= 1024
  43. # 自动重灾python代码
  44. python-autoreload=1

容器启动后执行的入口文件

  1. #!/bin/bash
  2. # 如果任何语句的执行结果不是true则退出
  3. set -e
  4. # 收集静态文件
  5. python3 manage.py collectstatic --noinput &&
  6. # 生成数据库可执行文件
  7. python3 manage.py makemigrations &&
  8. ## 执行文件修改数据库
  9. #python3 manage.py migrate --fake &&
  10. python3 manage.py migrate &&
  11. # emperor模式启动uwsgi
  12. uwsgi --emperor /etc/uwsgi/vassals --uid root

最后的docker-compose.yml文件

  1. version: "3"
  2. volumes: # 自定义数据卷,位于宿主机/var/lib/docker/volumes内
  3. djangosite_db_vol: # 定义数据卷同步容器内mysql数据
  4. djangosite_media_vol: # 定义数据卷同步media文件夹数据
  5. networks: # 自定义网络(默认桥接), 不使用links通信
  6. nginx_network:
  7. driver: bridge
  8. db_network:
  9. driver: bridge
  10. services:
  11. db:
  12. image: mysql:5.7
  13. container_name: djangosite_msq # 指定容器名称
  14. networks:
  15. - db_network
  16. environment:
  17. - MYSQL_ROOT_PASSWORD=root # 数据库密码
  18. - MYSQL_DATABASE=mysite # 数据库名称
  19. - TZ=Asia/Shanghai # 设置容器时区与宿主机保持一致
  20. volumes:
  21. - djangosite_db_vol:/var/lib/mysql:rw # 挂载数据库数据, 可读可写
  22. - ./compose/mysql/mysql.cnf:/etc/mysql/mysql.cnf # 挂载配置文件
  23. - ./compose/mysql/utp.sql:/tmp/utp.sql # 挂载sql文件
  24. # - ./compose/mysql/init:/docker-entrypoint-initdb.d/ # 挂载数据初始化sql脚本
  25. ports:
  26. - "3306:3306" # 3306与配置文件保持一致
  27. command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
  28. restart: always
  29. web:
  30. build: ./djangosite # 使用当前目录下的Dockerfile
  31. container_name: djangosite_web
  32. # ports:
  33. # - "8000:8000"
  34. expose:
  35. - "8000" # 暴露端口给nginx访问
  36. volumes:
  37. - ./djangosite:/var/www/ui_test_platform # 挂载项目代码
  38. - djangosite_media_vol:/var/www/djangosite/media # 以数据卷挂载容器内用户上传媒体文件
  39. - ./log/uwsgi:/tmp/uwsgi # 挂载uwsgi日志
  40. networks:
  41. - nginx_network
  42. - db_network
  43. depends_on: # 依赖关系
  44. - db
  45. environment:
  46. - DEBUG=False
  47. - TZ=Asia/Shanghai # 设置容器时区与宿主机保持一致
  48. restart: always # 指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always 或者 unless-stopped。
  49. tty: true # 模拟一个伪终端。
  50. stdin_open: true # 打开标准输入,可以接受外部输入。
  51. # 指定服务容器启动后执行的入口文件。
  52. entrypoint: /var/www/djangosite/start.sh
  53. nginx:
  54. build: ./compose/nginx
  55. container_name: diangosite_nginx
  56. ports:
  57. - "80:80"
  58. - "443:443"
  59. expose:
  60. - "80"
  61. environment:
  62. TZ: Asia/Shanghai # 设置时区
  63. volumes:
  64. - ./djangosite/static:/usr/share/nginx/html/static # 挂载静态文件
  65. # - ./compose/nginx/ssl:/usr/share/nginx/ssl # 挂载ssl证书目录
  66. - ./log/nginx/:/tmp/nginx # 挂载日志
  67. - djangosite_media_vol:/usr/share/nginx/html/media # 挂载用户上传媒体文件
  68. networks:
  69. - nginx_network
  70. depends_on:
  71. - web
  72. restart: always

最后构建并启动服务:

  1. docker-compose build
  2. docker-compose up -d