Django在生产环境的部署还是比较复杂的, 令很多新手望而生畏, 幸运的是使用Docker容器化技术可以大大简化我们Django在生产环境的部署。Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移动的镜像中,然后发布到任何流行的 Linux机器上。由于未来使用Docker部署Django是大势所趋且小编对网上Docker部署Django的教程不甚满意(坑比较多), 于是决定自己写篇原创教程由浅入深地总结下Docker部署Django的整个过程。由于本文很长,我们将会分三篇发表于公众号【Python Web与Django开发】,主要内容如下:
上篇:使用docker部署Django + Uwsgi(单容器)
中篇:使用docker部署Django + Uwsgi + Nginx (双容器)
下篇:使用docker-compose部署Django + Uwsgi + Nginx + MySQL + Redis (多容器组合)
注意:本文侧重于Docker技术在部署Django时的应用,而不是Docker基础教程。对Docker命令不熟悉的读者们建议先学习下Docker基础命令。
学前核心知识必读
在正式开始我们的Docker之旅前,我们需要了解4个核心知识点:
在Docker与virtualenv或pipenv的区别
virtualenv或pipenv创建的虚拟环境只是隔离了一个python运行的虚拟环境,允许不同的项目使用不同版本的程序包,从而解决依赖性问题。Docker的每个容器更像一个小型的linux系统,可以有自己的IP地址,容器相互之前环境隔离地更彻底。我们不仅可以把python的第三方依赖包放在一个容器里,我们还可以把数据库比如MySQL或Redis也放在容器里,这是python虚拟环境做不到的。因此生产环境使用Docker部署Django时,你不再需要使用virtualenv或pipenv创建python虚拟环境。
在Docker镜像与容器之前的关系
Docker容器是由docker镜像创建的运行实例。简单来说,镜像是文件,容器是进程。它们之前的关系如同Python的类与实例化对象之前的关系,一个镜像可以对应多个容器。
使用Docker技术的基本流程
我们首先要使用
docker pull
命令或Dockerfile文件构建docker镜像,再使用docker run
命令创建容器,最后使用docker exec -it
命令进入容器执行其它命令。宿主机和容器间的通信
安装Docker的服务器就是宿主机,宿主机有固定的IP地址和完整的操作系统比如Centos或Ubuntu。前面已经提到过每个容器像一个极简的Linux系统,还可以有自己的IP地址(Docker分配的)。宿主机和容器之间是可以通过
docker cp
或目录挂载的方式通信的。
Docker的安装
学习本教程前首先我们要安装Docker。菜鸟教程上总结了Docker在各个平台和系统上的安装,大家可以参考。这里总结了下Docker在阿里云Ubuntu系统上的安装过程。步骤看似很多且复杂,但大家只需要一步一步copy和paste命令就行了,整个安装过程很流畅。
# 以Ubuntu为例
# Step 1: 移除之前docker版本并更新更新 apt 包索引
sudo apt-get remove docker docker-engine docker.io
sudo apt-get update
# Step 2: 安装 apt 依赖包,用于通过HTTPS来获取仓库
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
# Step 3: 添加 Docker 的官方 GPG 密钥
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step