[译]如何使用 Docker 组件开发 Django 项目?
原文地址:Django Development With Docker Compose and Machine
以下为译文
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。自2013年发布以来,无论是从 Github 上的代码活跃度,还是 Redhat 在 RHEL6.5 中集成对 Docker 的支持, 就连 Google 的 Compute Engine 也支持 Docker 在其之上运行。火热程度可见一斑!
本篇文章详细介绍了如何通过 Docker Machine 「系统配置」和 Docker Compose 「多容器应用组装」 提供堆栈完成 Postgres, Redis 和 Django 项目相结合的开发。
而在最后,该堆栈将包括如下每个服务的单独的容器:
- 一个 Web/ Django 的容器
 - 一个 Nginx 的容器
 - 一个 Postgres 的容器
 - 一个 Redis 的容器
 - 一个 Data 容器
 

本地设置
使用 Docker「v1.6.1」版本我们将使用到 Docker Compose 「v1.2.0」编排一个多容器组成的应用程序,使用 Docker Machine「v0.2.0」创建本地和云的 Docker 主机。
按照指示,分别安装 Docker Compose 和 Machine,然后测试安装结果:
$ docker-machine --version
docker-machine version 0.2.0 (8b9eaf2)
$ docker-compose --version
docker-compose 1.2.0
接下来,根据以下项目结构从realpython/dockerizing-django克隆一份项目或自己创建项目:
├── docker-compose.yml
├── nginx
│   ├── Dockerfile
│   └── sites-enabled
│   └── django_project
├── production.yml
└── web
│   ├── Dockerfile
│   ├── docker_django
│   │   ├── __init__.py
│   │   ├── apps
│   │   │   ├── __init__.py
│   │   │   └── todo
│   │   │   ├── __init__.py
│   │   │   ├── admin.py
│   │   │   ├── models.py
│   │   │   ├── templates
│   │   │   │   ├── _base.html
│   │   │   │   └── home.html
│   │   │   ├── tests.py
│   │   │   ├── urls.py
│   │   │   └── views.py
│   │   ├── settings.py
│   │   ├── urls.py
│   └── wsgi.py
│   ├── manage.py
│   ├── requirements.txt
│   └── static
│   │   └── main.css</code>
现在我们准备容器运行……
Docker Machine
开启 Docker Machine,只需运行:
$ docker-machine create -d virtualbox dev;
INFO[0000] Creating CA: /Users/michael/.docker/machine/certs/ca.pem
INFO[0000] Creating client certificate: /Users/michael/.docker/machine/certs/cert.pem
INFO[0001] Downloading boot2docker.iso to /Users/michael/.docker/machine/cache/boot2docker.iso...
INFO[0035] Creating SSH key...
INFO[0035] Creating VirtualBox VM...
INFO[0043] Starting VirtualBox VM...
INFO[0044] Waiting for VM to start...
INFO[0094] "dev" has been created and is now the active machine.
INFO[0094] To point your Docker client at it, run this in your shell: eval "$(docker-machine env dev)"
这个 create 命令设置一个新的 Machine「开发环境」。实际上,它是下载 Boot2Docker 并开始运行 VM。现在只要在开发环境下指定 Docker:
$ eval "$(docker-machine env dev)"
运行以下命令来查看当前正在运行的机器:
$ docker-machine ls
NAME  ACTIVE  DRIVER  STATE  URL
dev * virtualbox Running tcp://192.168.99.100:2376
接下来,我们会让 Django,Postgres 和 Redis 的容器运行起来。
Docker Compose
让我们看一看 docker-compose.yml 文件:
web:
  restart: always
  build: ./web
  expose:
    - "8000"
  links:
    - postgres:postgres
    - redis:redis
  volumes:
    - /usr/src/app/static
  env_file: .env
  command: /usr/local/bin/gunicorn docker_django.wsgi:application -w 2 -b :8000 
nginx:
  restart: always
  build: ./nginx/
  ports:
    - "80:80"
  volumes:
    - /www/static
  volumes_from:
    - web
  links:
    - web:web 
postgres:
  restart: always
  image: postgres:latest
  volumes_from:
    - data
  ports:
    - "5432:5432" 
redis:
  restart: always
  image: redis:latest
  ports:
    - "6379:6379" 
data:
  restart: always
  image: postgres:latest
  volumes:
    - /var/lib/postgresql
  command: true
在这里,我们定义了五个服务: Web、Nginx、Postgres、Redis 和 Data。
- Web 服务通过 「Web」 目录下的 Dockerfile 来进行构建,这里也设置了 Python 环境设置,Django 应用默认8000端口。这个端口之后转发到主机环境的80端口上–例如,Docker Machine。Web 服务还在容器 Restore.env 文件中增加了环境变量。
 - Nginx 服务用于反向代理,作用于 Django 或静态文件目录。
 - Postgres 服务是从 Docker Hub 的官方 PostgreSQL镜像 安装,安装 Postgres 后运行在默认的服务器的5432端口。
 - Redis 使用官方 Redis镜像 安装,默认 Redis 服务是运行在6379端口。
 - 最后,注意有一个单独的容器来存储数据库数据,即为 Data。这有助于确保即使 Postgres 容器完全摧毁数据仍然存在。
 
现在,运行容器,构建镜像,然后开始服务:
$ docker-compose build
$ docker-compose up -d
这时可以有时间喝一杯咖啡或走走路,因为你第一次运行它将需要一段时间,随后就可以从 Docker 缓存中建立运行更快的了。
一旦服务运行,我们就需要创建数据库迁移:
$ docker-compose run web /usr/local/bin/python manage.py migrate
获得 Docker Machine 的相关 IP, – docker-machine ip –,然后在您的浏览器中输入IP:

出现上图后刷新,您应该能看到页面更新。从本质上讲,我们使用 Redis INCR 来递增每个处理请求,查看 web/docker_django/apps/todo/views.py 代码以获得更多信息。
同样,这创造了五项服务,都在不同的容器中运行:
$ docker-compose ps
            Name                          Command               State           Ports
----------------------------------------------------------------------------------------------
dockerizingdjango_data_1       /docker-entrypoint.sh true       Up      5432/tcp
dockerizingdjango_nginx_1      /usr/sbin/nginx                  Up      0.0.0.0:80->80/tcp
dockerizingdjango_postgres_1   /docker-entrypoint.sh postgres   Up      0.0.0.0:5432->5432/tcp
dockerizingdjango_redis_1      /entrypoint.sh redis-server      Up      0.0.0.0:6379->6379/tcp
dockerizingdjango_web_1        /usr/local/bin/gunicorn do ...   Up      8000/tcp
要查看哪些环境变量可用于 Web 服务,运行:
$ docker-compose run web env
要查看日志,运行:
$ docker-compose logs
您也可以进入 Postgres Shell - - 因为我们已经通过 docker-compose.yml 文件设置在数据库中通过添加用户/角色,端口转发到主机环境中:
$ psql -h 192.168.99.100 -p 5432 -U postgres --password
准备部署?先停止运行 docker-compose stop,然后让我们的应用程序在云中运行!
部署
与我们在本地运行应用程序一样,我们现在可以 push 到与 Docker Machine 环境完全相同的云托管服务提供商。现在让我们部署到 Digital Ocean 中。
您注册 Digital Ocean 之后,产生个人访问令牌 「Personal Access Token」,然后运行以下命令:
$ docker-machine create \
-d digitalocean \
--digitalocean-access-token=ADD_YOUR_TOKEN_HERE \
Production
这将需要几分钟时间来提供 droplet , 并设置一个新的 Docker Machine 产品环境:
INFO[0000] Creating SSH key...
INFO[0001] Creating Digital Ocean droplet...
INFO[0133] "production" has been created and is now the active machine.
INFO[0133] To point your Docker client at it, run this in your shell: eval "$(docker-machine env production)"
现在我们有两台机器运行,一是在本地,一个在 Digital Ocean:
$ docker-machine ls
NAME         ACTIVE   DRIVER         STATE     URL
dev          *        virtualbox     Running   tcp://192.168.99.100:2376
production            digitalocean   Running   tcp://104.131.107.8:2376
设置 production 为激活机器并加载 Docker 环境到 shell:
$ docker-machine active production
$ eval "$(docker-machine env production)"
最后,让我们在云上再次构建 Django 的应用程序。这时候我们就需要使用一个稍微不同的 Docker Compose 文件,不需要安装在容器里。为什么呢?因为容器本身非常适合本地开发,这样我们可以更新「Web」目录的本地代码,并且更改代码立刻对容器产生影响。在生产中,很明显没有这个必要。
$ docker-compose build
$ docker-compose up -d -f production.yml
$ docker-compose run web /usr/local/bin/python manage.py migrate
获取与 Digital Ocean 帐户相关联的 IP 地址,并在浏览器中查看它。如果一切顺利,你应该可以看到你的应用程序在运行。
原文地址:Django Development With Docker Compose and Machine
本文系 OneAPM 工程师编译整理。想阅读更多技术文章,请访问 OneAPM 官方博客。
[译]如何使用 Docker 组件开发 Django 项目?的更多相关文章
- [译]一个灵活的 Trello 敏捷工作流
		
[译]一个灵活的 Trello 敏捷工作流 翻译自 An Agile Trello Workflow That Keeps Tasks Flexible Getting things done 可不只 ...
 - 使用 Docker 让部署 Django 项目更加轻松
		
作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 之前一系列繁琐的部署步骤让我们感到痛苦.这些痛苦包括: 要去服务器上执行 n 条命令 ...
 - 用pycharm开发django项目示例
		
pycharm开发django工程(一) 在pycharm(企业版)中新建Django工程,注意使用虚拟环境 创建成功后,在pycharm显示的工程目录结构如下: 打开pycharm的Termina ...
 - 如何使用Visual Studio Code开发Django项目
		
如何获得 Visual Studio Code 访问 http://code.visualstudio.com 下载并安装. 前提条件 安装Python 2.7 及 Python 3.5,Window ...
 - Pycharm 开发 Django 项目
		
1. 安装Pycharm, 自行百度安装教程 2. 安装python3 自行百度安装教程 3. 安装Django框架 使用命令: Window的终端控制台输入:安装Django框架. pip inst ...
 - docker中部署django项目~~Dockfile方式和compose方式
		
1. 背景: 本机win10上,后端django框架代码与前端vue框架代码联调通过. 2. 目的: 在centos7系统服务器上使用docker容器部署该项目. 3. 方案一:仅使用基 ...
 - Python_教程_使用Visual Studio Code开发Django项目
		
如何获得 Visual Studio Code 访问 http://code.visualstudio.com 下载并安装. 前提条件 安装Python 2.7 及 Python 3.5,Window ...
 - [译]如何定义python源文件的文件编码
		
简介 这篇文章是为了介绍定义python源文件文件编码的方法.python解释器可以根据所指定的编码信息对当前文件进行解析.通常来说,这种方法可以提高解析器对Unicode编码的源文件的识别,并且支持 ...
 - Docker 快速部署 Django项目到云服务器
		
项目结构: 1,dockerfile FROM python:3.7 RUN mkdir -p /usr/src/app WORKDIR /usr/src/app COPY pip.conf /roo ...
 
随机推荐
- python 小技巧(import模块、查询类继承关系、安装包)
			
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在这里列举一些我使用Python时积累的小技巧.这些技巧是我在使用Python过程 ...
 - MIFARE系列5《存储结构》
			
Mifare S50把1K字节的容量分为16个扇区(Sector0-Sector15),每个扇区包括4个数据块(Block0-Block3),我们也将16个扇区的64个块按绝对地址编号为0~63,每个 ...
 - EXCLE图形插入实例
			
根据所给名称找到相应图片,并进行导入. 代码如下: Sub Import_picture() For Each shap In Sheet1.Shapes '在sheet1中的图片对象进行循环 If ...
 - Oracle表结构转换SqlSERVER表结构 脚本
			
在审计工作中,有时需要将Oracle的表结构修改后再SqlSERVER中创建表结构,然后将数据导入到SqlSERVER中,在修改表结构的过程中方法狠多.手工修改,最蠢的方法,或者用工具UE批量修改,还 ...
 - Android工具与其它
			
文本文件: Tool: NotePad++ 代码工具: Tool:Eclipse+STAN+(乱七八糟c,c++,java,android),Source Insight 3 Log工具: Tool: ...
 - 如何配置DNS服务器(局域网——域名指向某个IP地址)
			
单击“开始”,指向“管理工具”,然后单击“DNS”,打开 DNS 管理器. 如有必要,向管理单元添加适用的服务器,然后连接该服务器.在控制台树中,单击适用的 DNS 服务器. 在“操作”菜单上 ...
 - SQL-Server数据库学习笔记-表
			
1. 表及其属性 表(Table):也称实体,是存储同类型数据的集合. 列(Field):也称字段.域或属性,它构成表的架构,具体表示为一条信息中的一个属性. 行(Row):也称元组(Tuple),存 ...
 - java数据结构和算法------快速排序
			
package iYou.neugle.sort; public class Quick_sort { public static void QuickSort(double[] array, int ...
 - Labview实现频率调制(FM)
			
Labview实现频率调制(FM) 频率调制的原理: 自己的实现为三角函数分解 根据这个公式在Labview中连线则可以得到最终的波形输出 实现效果 从频域图中可以看出,载波信号的频率被调制,原本为双 ...
 - OpenGL学习笔记之配置OpenGL
			
OpenGL是计算机图形学领域的一门入门语言,OpenGL开发库的一些文件在官网上可以下载到.里面包含三个文件,如下: 1.把在OpenGL开发库中LIB(库文件)glut.lib和glut32.li ...