本文是使用Docker部署Django由浅入深系列的中篇,我们将构建两个容器,一个容器放Django + Uwsgi,另一个容器放Nginx。我们将了解不同容器间是如何通信的,并学会正确配置uwsgi.ini和nginx.conf使整个项目跑起来。在阅读本篇前,请先阅读本系列上篇使用Docker单容器部署Django + Uwsgi。下篇我们会更进一步介绍如何使用docker-compose部署Django + Uwsgi + Nginx + MySQL + Redis(多容器组合), 欢迎关注我们的微信公众号【Python Web与Django开发】。
双容器部署Django+Uwsgi+Nginx项目示意图
整个项目流程示意图如下所示。用户通过客户端访问服务器的80端口(http协议默认端口)时,请求由于宿主机和容器1间存在80:80端口映射关系会被转发到Nginx所在的容器1。Nginx接收到请求后会判断请求是静态的还是动态的,静态文件请求自己处理,动态请求则转发到Django+Uwsgi所在的容器2处理,容器2的开放端口为8000。本例中所使用到的容器1的名字为mysite3-nginx, 容器2的名称为mysite3。由于两个容器在一台宿主机上,你可以看到docker分配的容器IP地址非常接近,有点像局域网IP。使用如下命名即可查看容器的IP地址。
sudo docker inspect container_name | grep "IPAddress"
例子:
注意:
容器创建和启动的先后顺序很重要,本例中容器1对容器2有依赖。这是因为如果容器2不运行,容器1收到动态请求后不知道给谁处理。
创建容器并运行前,必须先使用
docker pull
命令或Dockerfile构建容器对应的镜像。
双容器部署Django+Uwsgi+Nginx代码布局图
整个项目的代码布局如下所示。我们新建了一个compose文件夹,专门存放用于创建其它镜像的Dockerfile及配置文件。在本例中,我们只创建了一个nginx文件夹。在下篇文章中,我们会将MySQL和Redis也加进去。
mysite3
├── compose
│ └── nginx
│ ├── Dockerfile # 创建nginx镜像需要用到的Dockerfile
│ ├── log # 存放nginx的日志
│ ├── nginx.conf # nginx配置文件
│ ├── ssl # 如果需要配置https需要用到
├── db.sqlite3
├── Dockerfile # 创建django+uwsgi镜像需要用到的Dockerfile
├── manage.py
├── mysite3
│ ├── asgi.py
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── pip.conf # 设置pypi为国内源,加速静态文件安装
├── static # 静态文件夹,存放css,