使用 Docker 组件开发 Django 项目

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介:

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:

用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.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 地址,并在浏览器中查看它。如果一切顺利,你应该可以看到你的应用程序在运行。
文章转载自 开源中国社区 [http://www.oschina.net]

相关文章
|
9月前
|
数据采集 存储 Docker
深入理解Docker:为你的爬虫项目提供隔离环境
本教程介绍如何使用Docker构建隔离环境,运行Python爬虫项目,采集小红书视频页面的简介和评论。主要内容包括: 1. **Docker隔离环境**:通过Docker容器化爬虫,确保环境独立、易于部署。 2. **代理IP技术**:利用亿牛云爬虫代理突破反爬限制。 3. **Cookie与User-Agent设置**:伪装请求头,模拟真实用户访问。 4. **多线程采集**:提高数据采集效率。 前置知识要求:Python基础、Docker基本操作及HTML解析(可选)。教程还涵盖常见错误解决方法和延伸练习,帮助你优化爬虫代码并避免陷阱。
265 7
深入理解Docker:为你的爬虫项目提供隔离环境
|
运维 网络安全 持续交付
IDEA+Docker 远程一键部署项目:技术干货分享
【10月更文挑战第4天】在现代软件开发中,快速、可靠、自动化的部署流程是提升开发效率和运维质量的关键。IDEA(IntelliJ IDEA)作为Java开发者首选的IDE,结合Docker这一轻量级容器化技术,能够实现远程一键部署项目,极大地简化了开发到生产的流程。今天,我将和大家分享这一组合在工作学习中的实际应用和技术干货。
1030 3
|
8月前
|
Docker Python 容器
Docker——阿里云服务器使用Docker部署python项目全程小记
本文记录了我在阿里云服务器上使用Docker部署python项目(flask为例)的全过程,在这里记录和分享一下,希望可以给大家提供一些参考。
989 1
|
11月前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
293 3
实战~如何组织一个多容器项目docker-compose
|
10月前
|
数据管理 数据库 数据安全/隐私保护
Django—同一项目不同app使用不同数据库
在Django项目中实现不同app使用不同数据库的配置,可以通过配置多数据库、创建数据库路由和配置路由来实现。通过这种方法,可以有效地将数据隔离到不同的数据库,提高数据管理的灵活性和系统的可扩展性。希望本文能为开发者在Django项目中使用多数据库提供清晰的指导。
251 4
|
关系型数据库 MySQL Java
【Docker最新版教程】一文带你快速入门Docker常见用法,实现容器编排和自动化部署上线项目
Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+docker网络+DockerCompose项目实战一文搞定!
1982 10
|
11月前
|
存储 缓存 运维
Docker镜像采用分层存储,每层代表镜像的一部分,如基础组件或应用依赖,多层叠加构成完整镜像
Docker镜像采用分层存储,每层代表镜像的一部分,如基础组件或应用依赖,多层叠加构成完整镜像。此机制减少存储占用,提高构建和传输效率。Docker还通过缓存机制提升构建和运行效率,减少重复工作。文章深入解析了Docker镜像分层存储与缓存机制,包括具体实现、管理优化及实际应用案例,帮助读者全面理解其优势与挑战。
464 4
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
517 7
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
417 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
关系型数据库 MySQL Linux
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
2476 3