https://blog.csdn.net/weixin_42134789/article/details/106345938
效果:docker双容器部署Nginx+uWSGI+django-
docker的container显示如下:
-
访问http://localhost/显示网页
myproject_docker # 项目根目录
├── compose # 存放各项容器服务的Dockerfile和配置文件
│ ├── nginx
│ │ ├── Dockerfile # 构建Nginx镜像所的Dockerfile
│ │ ├── log # 挂载保存nginx容器内nginx日志
│ │ ├── nginx.conf # Nginx配置文件
│ └── uwsgi # 挂载保存django+uwsgi容器内uwsgi日志
├── docker-compose.yml # 核心编排文件
└── django # 常规Django项目目录
version: "3"
volumes: # 自定义数据卷,位于宿主机/var/lib/docker/volumes内
myproject_media_vol: # 定义数据卷同步media文件夹数据
services:
web:
build: . # 使用myproject目录下的Dockerfile
expose:
- "8000"
volumes:
- ./Django:/var/www/html/Django # 挂载项目代码
- myproject_media_vol:/var/www/html/Django/package/media # 以数据卷挂载容器内用户上传媒体文件
- ./compose/uwsgi:/tmp # 挂载uwsgi日志
# links:
# - db
# - redis
# depends_on: # 依赖关系
# - db
# - redis
environment:
- DEBUG=False
restart: always
tty: true
stdin_open: true
nginx:
build: ./compose/nginx
ports:
- "80:80"
- "443:443"
expose:
- "80"
volumes:
- ./Django/package/static:/usr/share/nginx/html/static # 挂载静态文件
- ./compose/nginx/log:/var/log/nginx # 挂载日志
- myproject_media_vol:/usr/share/nginx/html/media # 挂载用户上传媒体文件
links:
- web
depends_on:
- web
restart: always
第二步:编写Web (Django+uWSGI)镜像和容器所需文件
构建Web镜像(Django+Uwsgi)的所使用的Dockerfile如下所示:
FROM python:3.8-slim RUN apt-get update -y && apt-get install gcc -y COPY ./Django /code WORKDIR /code/package RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple uwsgi EXPOSE 8000 RUN chmod 777 /code/package/runserver-docker.sh RUN chmod 777 /code/package/start.sh RUN chmod 777 /code/package/GAGA/SQL RUN chmod 777 /code/package/GAGA/SQL/db.sqlite3 RUN chmod 777 /code/package/log RUN chmod 777 /code/package/log/admin.log # Windows环境下编写的start.sh每行命令结尾有多余的r字符,需移除。 RUN sed -i 's/r//' ./start.sh # 设置start.sh文件可执行权限 RUN chmod +x ./start.sh # 设置start.sh文件可执行权限 RUN chmod 777 * CMD ["/bin/sh","/code/package/start.sh"]
start.sh脚本文件内容如下所示。最重要的是最后一句,使用uwsgi.ini配置文件启动Django服务。
#!/bin/bash # 从第一行到最后一行分别表示: # 1. 生成数据库迁移文件 # 2. 根据数据库迁移文件来修改数据库 # 3. 用 uwsgi启动 django 服务, 不再使用python manage.py runserver python manage.py collectstatic --noinput&& python manage.py makemigrations&& python manage.py migrate uwsgi --ini uwsgi.ini
uwsgi.ini配置文件如下所示:
[uwsgi] project=GAGA uid=www-data gid=www-data base=/code/package chdir=%(base)/ module=%(project).wsgi:application master=True processes=2 #http=0.0.0.0:8000 socket=0.0.0.0:8000 buffer-size=65536 vacuum=True max-requests=5000 harakiri=60 harakiri-verbose=true第三步:编写Nginx镜像和容器所需文件
构建Nginx镜像所使用的Dockerfile如下所示:
# nginx镜像compose/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的配置文件如下所示
# nginx配置文件
# compose/nginx/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;
第四步:使用docker-compose 构建镜像并启动容器组服务
# 进入docker-compose.yml所在文件夹,输入以下命令构建镜像 docker-compose build # 查看已生成的镜像 docker images # 启动容器组服务 docker-compose up # 查看运行中的容器 docker ps第五步:打开浏览器,输入ip地址或域名来访问网站。



