原文地址: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,然后测试安装结果:

  1. $ docker-machine --version
  2. docker-machine version 0.2.0 (8b9eaf2)
  3. $ docker-compose --version
  4. docker-compose 1.2.0

接下来,根据以下项目结构从realpython/dockerizing-django克隆一份项目或自己创建项目:

  1. ├── docker-compose.yml
  2. ├── nginx
  3.    ├── Dockerfile
  4.    └── sites-enabled
  5.    └── django_project
  6. ├── production.yml
  7. └── web
  8. ├── Dockerfile
  9. ├── docker_django
  10.    ├── __init__.py
  11.    ├── apps
  12.       ├── __init__.py
  13.       └── todo
  14.       ├── __init__.py
  15.       ├── admin.py
  16.       ├── models.py
  17.       ├── templates
  18.          ├── _base.html
  19.          └── home.html
  20.       ├── tests.py
  21.       ├── urls.py
  22.       └── views.py
  23.    ├── settings.py
  24.    ├── urls.py
  25.    └── wsgi.py
  26. ├── manage.py
  27. ├── requirements.txt
  28. └── static
  29. └── main.css</code>

现在我们准备容器运行……

Docker Machine

开启 Docker Machine,只需运行:

  1. $ docker-machine create -d virtualbox dev;
  2. INFO[0000] Creating CA: /Users/michael/.docker/machine/certs/ca.pem
  3. INFO[0000] Creating client certificate: /Users/michael/.docker/machine/certs/cert.pem
  4. INFO[0001] Downloading boot2docker.iso to /Users/michael/.docker/machine/cache/boot2docker.iso...
  5. INFO[0035] Creating SSH key...
  6. INFO[0035] Creating VirtualBox VM...
  7. INFO[0043] Starting VirtualBox VM...
  8. INFO[0044] Waiting for VM to start...
  9. INFO[0094] "dev" has been created and is now the active machine.
  10. INFO[0094] To point your Docker client at it, run this in your shell: eval "$(docker-machine env dev)"

这个 create 命令设置一个新的 Machine「开发环境」。实际上,它是下载 Boot2Docker 并开始运行 VM。现在只要在开发环境下指定 Docker:

  1. $ eval "$(docker-machine env dev)"

运行以下命令来查看当前正在运行的机器:

  1. $ docker-machine ls
  2. NAME ACTIVE DRIVER STATE URL
  3. dev * virtualbox Running tcp://192.168.99.100:2376

接下来,我们会让 Django,Postgres 和 Redis 的容器运行起来。

Docker Compose

让我们看一看 docker-compose.yml 文件:

  1. web:
  2. restart: always
  3. build: ./web
  4. expose:
  5. - "8000"
  6. links:
  7. - postgres:postgres
  8. - redis:redis
  9. volumes:
  10. - /usr/src/app/static
  11. env_file: .env
  12. command: /usr/local/bin/gunicorn docker_django.wsgi:application -w 2 -b :8000
  13. nginx:
  14. restart: always
  15. build: ./nginx/
  16. ports:
  17. - "80:80"
  18. volumes:
  19. - /www/static
  20. volumes_from:
  21. - web
  22. links:
  23. - web:web
  24. postgres:
  25. restart: always
  26. image: postgres:latest
  27. volumes_from:
  28. - data
  29. ports:
  30. - "5432:5432"
  31. redis:
  32. restart: always
  33. image: redis:latest
  34. ports:
  35. - "6379:6379"
  36. data:
  37. restart: always
  38. image: postgres:latest
  39. volumes:
  40. - /var/lib/postgresql
  41. 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 容器完全摧毁数据仍然存在。

现在,运行容器,构建镜像,然后开始服务:

  1. $ docker-compose build
  2. $ docker-compose up -d

这时可以有时间喝一杯咖啡或走走路,因为你第一次运行它将需要一段时间,随后就可以从 Docker 缓存中建立运行更快的了。

一旦服务运行,我们就需要创建数据库迁移:

  1. $ 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 代码以获得更多信息。

同样,这创造了五项服务,都在不同的容器中运行:

  1. $ docker-compose ps
  2. Name Command State Ports
  3. ----------------------------------------------------------------------------------------------
  4. dockerizingdjango_data_1 /docker-entrypoint.sh true Up 5432/tcp
  5. dockerizingdjango_nginx_1 /usr/sbin/nginx Up 0.0.0.0:80->80/tcp
  6. dockerizingdjango_postgres_1 /docker-entrypoint.sh postgres Up 0.0.0.0:5432->5432/tcp
  7. dockerizingdjango_redis_1 /entrypoint.sh redis-server Up 0.0.0.0:6379->6379/tcp
  8. dockerizingdjango_web_1 /usr/local/bin/gunicorn do ... Up 8000/tcp

要查看哪些环境变量可用于 Web 服务,运行:

  1. $ docker-compose run web env

要查看日志,运行:

  1. $ docker-compose logs

您也可以进入 Postgres Shell - - 因为我们已经通过 docker-compose.yml 文件设置在数据库中通过添加用户/角色,端口转发到主机环境中:

  1. $ psql -h 192.168.99.100 -p 5432 -U postgres --password

准备部署?先停止运行 docker-compose stop,然后让我们的应用程序在云中运行!

部署

与我们在本地运行应用程序一样,我们现在可以 push 到与 Docker Machine 环境完全相同的云托管服务提供商。现在让我们部署到 Digital Ocean 中。

您注册 Digital Ocean 之后,产生个人访问令牌 「Personal Access Token」,然后运行以下命令:

  1. $ docker-machine create \
  2. -d digitalocean \
  3. --digitalocean-access-token=ADD_YOUR_TOKEN_HERE \
  4. Production

这将需要几分钟时间来提供 droplet , 并设置一个新的 Docker Machine 产品环境:

  1. INFO[0000] Creating SSH key...
  2. INFO[0001] Creating Digital Ocean droplet...
  3. INFO[0133] "production" has been created and is now the active machine.
  4. INFO[0133] To point your Docker client at it, run this in your shell: eval "$(docker-machine env production)"

现在我们有两台机器运行,一是在本地,一个在 Digital Ocean:

  1. $ docker-machine ls
  2. NAME ACTIVE DRIVER STATE URL
  3. dev * virtualbox Running tcp://192.168.99.100:2376
  4. production digitalocean Running tcp://104.131.107.8:2376

设置 production 为激活机器并加载 Docker 环境到 shell:

  1. $ docker-machine active production
  2. $ eval "$(docker-machine env production)"

最后,让我们在云上再次构建 Django 的应用程序。这时候我们就需要使用一个稍微不同的 Docker Compose 文件,不需要安装在容器里。为什么呢?因为容器本身非常适合本地开发,这样我们可以更新「Web」目录的本地代码,并且更改代码立刻对容器产生影响。在生产中,很明显没有这个必要。

  1. $ docker-compose build
  2. $ docker-compose up -d -f production.yml
  3. $ 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 项目?的更多相关文章

  1. [译]一个灵活的 Trello 敏捷工作流

    [译]一个灵活的 Trello 敏捷工作流 翻译自 An Agile Trello Workflow That Keeps Tasks Flexible Getting things done 可不只 ...

  2. 使用 Docker 让部署 Django 项目更加轻松

    作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 之前一系列繁琐的部署步骤让我们感到痛苦.这些痛苦包括: 要去服务器上执行 n 条命令 ...

  3. 用pycharm开发django项目示例

    pycharm开发django工程(一)  在pycharm(企业版)中新建Django工程,注意使用虚拟环境 创建成功后,在pycharm显示的工程目录结构如下: 打开pycharm的Termina ...

  4. 如何使用Visual Studio Code开发Django项目

    如何获得 Visual Studio Code 访问 http://code.visualstudio.com 下载并安装. 前提条件 安装Python 2.7 及 Python 3.5,Window ...

  5. Pycharm 开发 Django 项目

    1. 安装Pycharm, 自行百度安装教程 2. 安装python3 自行百度安装教程 3. 安装Django框架 使用命令: Window的终端控制台输入:安装Django框架. pip inst ...

  6. docker中部署django项目~~Dockfile方式和compose方式

    1.  背景:   本机win10上,后端django框架代码与前端vue框架代码联调通过. 2.  目的:   在centos7系统服务器上使用docker容器部署该项目. 3.  方案一:仅使用基 ...

  7. Python_教程_使用Visual Studio Code开发Django项目

    如何获得 Visual Studio Code 访问 http://code.visualstudio.com 下载并安装. 前提条件 安装Python 2.7 及 Python 3.5,Window ...

  8. [译]如何定义python源文件的文件编码

    简介 这篇文章是为了介绍定义python源文件文件编码的方法.python解释器可以根据所指定的编码信息对当前文件进行解析.通常来说,这种方法可以提高解析器对Unicode编码的源文件的识别,并且支持 ...

  9. Docker 快速部署 Django项目到云服务器

    项目结构: 1,dockerfile FROM python:3.7 RUN mkdir -p /usr/src/app WORKDIR /usr/src/app COPY pip.conf /roo ...

随机推荐

  1. 《Prism 5.0源码走读》UnityBootstrapper

    UnityBootstrapper (abstract class)继承自Bootstrapper(abstract)类, 在Prism.UnityExtensions.Desktop project ...

  2. DataSet中的relation

    DataSet中的relation DataSet是ADO.Net中相当重要的数据访问模型.有一个很大的优点是可以记录多个表之间的关系.有点类似与数据库的外键. 在DataSet中也可以定义类似的关系 ...

  3. ED/EP系列4《圈存指令》

    1. 圈存交易 通过圈存交易,持卡人可将其在银行相应账户上的资金划入电子存折或电子钱包中. 特点: 1)--必须在金融终端上联机进行; 2)--必须提交个人识别码(PIN) 步骤: 1) --终端: ...

  4. spring替代方法

    总结spring替代方法的使用 MyValueCalculator类中的computerValue方法将会被替代 public class MyValueCalculator { public Str ...

  5. [INS-41112] Specified network interface doesnt maintain connectivi

    OS: Oracle Linux Server release 6.3 DB: Oracle 11.2.0.3 安装11.2.0.3.0的RAC,在安装GRID时报错: [INS-41112] Spe ...

  6. 【转】Oracle中如何用一条SQL快速生成10万条测试数据

    转自http://blog.csdn.net/welken/article/details/4971887   做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入, ...

  7. Thread与Runable

    当我们继承Thread的时候可以看出. 调用run()与start()来启动多线程是有区别. 如下我们开启多线程时 MyThread  mt1 = new MyThread(“线程A”); MyThr ...

  8. hdu 1429 胜利大逃亡(续)

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王 ...

  9. wpa_supplicant软件架构分析

    wpa_supplicant软件架构分析 1. 启动命令 wpa supplicant 在启动时,启动命令可以带有很多参数,目前我们的启动命令如下: wpa_supplicant /system/bi ...

  10. 使用 Swift 制作一个新闻通知中心插件(2)

    我们在第一部分的文章中详细讲解了创建一个通知中心插件的整体过程.我们成功的在通知中心里面显示了新闻列表.但是截止到目前,我们还不能从通知中心的列表中查看新闻的详细内容.在这次的教程中,我们就以上次的教 ...