栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【Docker】Docker双容器部署Nginx+uWSGI+django -20220804

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Docker】Docker双容器部署Nginx+uWSGI+django -20220804

参考大江狗文章

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项目目录

第一步:编写docker-compose.yml文件
 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地址或域名来访问网站。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1033198.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号