如何使用 Docker 组件开发 Django 项目? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
OneAPM
V2EX    程序员

如何使用 Docker 组件开发 Django 项目?

  OneAPM
oneapm 2015-07-15 10:48:59 +08:00 4344 次点击
这是一个创建于 3753 天前的主题,其中的信息可能已经有所发展或是发生改变。

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组件开发Django项目

本地设置

使用 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:

用Docker组件开发Django项目

出现上图后刷新,您应该能看到页面更新。从本质上讲,我们使用 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.131107.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 是中国基础软件领域的新兴领军企业,能帮助企业用户和开发者轻松实现:缓慢的程序代码和 SQL 语句的实时抓取。想阅读更多技术文章,请访问 OneAPM 新闻

12 条回复    2015-07-16 12:00:59 +08:00
Pastsong
    1
Pastsong  
   2015-07-15 11:09:03 +08:00
本来以为是置顶广告但是并没有发现你们的产品...
OneAPM
    2
OneAPM  
OP
   2015-07-15 11:09:55 +08:00
@Pastsong 失望了?
tini28
    3
tini28  
   2015-07-15 11:13:17 +08:00
好贴不要放在置顶,我平时都直接无视置顶帖的
oska874
    4
oska874  
   2015-07-15 11:20:03 +08:00
@Pastsong oneapm 不是广告?
melaozhu
    5
melaozhu  
   2015-07-15 11:35:00 +08:00
头像难道不是广告?
leopardwei
    6
leopardwei  
   2015-07-15 11:38:18 +08:00
好文,要ding
OneAPM
    7
OneAPM  
OP
   2015-07-15 11:38:46 +08:00
@melaozhu (*^__^*)
qq2549112
    8
qq2549112  
   2015-07-15 11:47:47 +08:00
支持 支持
fishu
    9
fishu  
   2015-07-15 12:34:49 +08:00 via Android
nasta
    10
nasta  
   2015-07-15 12:47:46 +08:00
软广告
TangMonk
    11
TangMonk  
   2015-07-15 13:35:14 +08:00
支持
duobei
    12
duobei  
   2015-07-16 12:00:59 +08:00   1
@OneAPM thanks
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5205 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 26ms UTC 07:16 PVG 15:16 LAX 00:16 JFK 03:16
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86