使用Compose和Machine来Docker化Flask:从本地到云端

本文讲的是使用Compose和Machine来Docker化Flask:从本地到云端,【编者的话】Docker 1.6发布了,Compose和Machine都在更新之列。本文具体说明了如何使用这两个组件来实现本地与云端的同步部署与管理。

Docker是个强大工具,用于启动隔离的、可重复生产的应用环境容器。本文侧重讲述如何为本地开发容器化Flask应用,同时使用Docker Compose和Docker Machine将应用交付到云主机提供商中。

本地设置

与Docker(v1.6.0)一起,我们将使用:

  • Docker Compose(v1.2.0),即此前的fig,用于将一个多容器应用编排成一个单一应用。
  • 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

然后,从此仓库克隆项目,或按该仓库的项目结构创建你自己的项目:

├── copy.sh
├── docker-compose.yml
├── nginx
│   ├── Dockerfile
│   └── sites-enabled
│       └── flask_project
└── web
├── Dockerfile
├── app.py
├── config.py
├── create_db.py
├── models.py
├── requirements.txt
├── static
│   ├── css
│   │   ├── bootstrap.min.css
│   │   └── main.css
│   ├── img
│   └── js
│       ├── bootstrap.min.js
│       └── main.js
└── templates
    ├── _base.html
    └── index.html

这样就为容器启动和运行做好了准备。现在进入Docker Machine。

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: $(docker-machine env dev)
$ $(docker-machine env dev)

create命令为Docker开发设置了一台“machine”(名为dev)。实际上,它下载了boot2docker,并启动了一个运行Docker的虚拟机。

运行如下命令来查看当前运行的Machine:

$ docker-machine ls
NAME   ACTIVE   DRIVER       STATE     URL                         SWARM
dev    *        virtualbox   Running   tcp://192.168.99.100:2376

接下来,让我们使用Docker Compose来启动容器,让Flask应用及Postgres数据库启动并运行起来。

Docker Compose

来看一眼docker-compose.yml文件:

web:
restart: always
build: ./web
expose:
- "8000"
links:
- postgres:postgres
volumes:
- /usr/src/app
env_file: .env
command: /usr/local/bin/gunicorn -w 2 -b :8000 app:app

nginx:
restart: always
build: ./nginx/
ports:
- "80:80"
volumes:
- /www/static
links:
- web:web

data:
restart: always
image: postgres:latest
volumes:
- /var/lib/postgresql
command: true

postgres:
restart: always
image: postgres:latest
volumes_from:
- data
ports:
- "5432:5432"

这里,我们定义了四个服务:web、 nginx、 postgres和 data

  • 首先,web服务是通过Dockerfile的指令在“web”目录中构建的,在此设置了Python环境,安装了必要软件,并将Flask应用运行于8000端口。这个端口会被转发到宿主环境(比如Docker Machine)的80端口上。该服务还将.env文件中定义的环境变量添加到了容器里。
  • nginx服务作为反向代理用于转发请求到Flask应用或静态文件上。
  • 下一个,postgres服务构建于Docker Hub的官方PostgreSQL镜像,安装了Postgres并将服务器运行于默认的5432端口上。
  • 最后,请注意有一个单独的容器data用于存储数据库数据。这确保了即便Postgres容器被完全地销毁,数据仍然存在。

在构建镜像前,我们需要将静态文件从“web/static”目录复制到“nginx/static”中,因为nginx Dockerfile是从“nginx”目录中添加静态文件目录的。要这么做,只需要简单地运行copy.sh脚本:

$ sh copy.sh

现在,要运行容器,只要构建镜像然后启动服务即可:

$ docker-compose build
$ docker-compose up -d

去喝一杯咖啡。或是两杯。第一次运行时间会久一点。

我们还需要创建数据库表:

$ docker-compose run web /usr/local/bin/python create_db.py

打开浏览器并访问与Docker Machine关联的IP地址(docker-machine ip):

棒极了!

要查看web服务可用的环境变量,运行:

$ docker-compose run web env

要查看日志:

$ docker-compose logs

你也可以进入Postgres命令行,这是因为我们在docker-compose.yml文件中转发了它的端口到宿主环境中,可以这样添加用户/角色及数据库:

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

一旦完成,通过docker-compose stop停止所有进程。

部署

在应用运行于本地的同时,我们可以使用Docker Machine将与之完全相同的环境推送到云主机提供商上。我们来部署到Digital Ocean的droplet里。

在Digital Ocean注册完成后,生成一个“个人访问令牌”,然后运行以下命令:

$ docker-machine create \
-d digitalocean \
--digitalocean-access-token=你的令牌 \
production

这将花费几分钟来准备droplet并设置一个名为production的新的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)"

现在,我们运行了两个Machine,一个本地的,一个在Digital Ocean上:

$ docker-machine ls
NAME         ACTIVE   DRIVER         STATE     URL                         SWARM
dev          *        virtualbox     Running   tcp://192.168.99.100:2376
production            digitalocean   Running   tcp://104.131.107.8:2376

然后,设置production作为活动machine,并将Docker环境加载到命令行中:

$ docker-machine active production
$ eval "$(docker-machine env production)"

最后,在云端再次构建Flask应用:

$ docker-compose build
$ docker-compose up -d
$ docker-compose run web /usr/local/bin/python create_db.py

找到Digital Ocean账号关联的IP地址,并在浏览器中查看。如果所有东西都正确,应该能看到应用已经运行起来了。

结语

祝贺你!

  • 从这个仓库获取代码(也请点赞!)
  • 在下面提交你的评论
  • 下一次,我们将扩展这个工作流以包括两个运行Flask应用的Docker容器,并加入负载均衡。敬请关注!

原文链接:Dockerizing Flask With Compose and Machine - From Localhost to the Cloud(翻译:梁晓勇

原文发布时间为:2015-04-21 

本文作者:sean 

本文来自合作伙伴DockerOne,了解相关信息可以关注DockerOne。

原文标题:使用Compose和Machine来Docker化Flask:从本地到云端

时间: 2024-10-24 20:23:06

使用Compose和Machine来Docker化Flask:从本地到云端的相关文章

云上应用docker化持续交付实践 — 【包含Qcon讲稿】

因为我非常啰嗦,所以写的分享也太长,全部内容被内部同学review后的反馈是: 像看小说一样-- 所以为了防止大家看了开头就去逛别的小网站了,开篇我先点个题, 这篇文件最终的目的是讲清楚下面这张图:  就是一个完整的,应用Docker化持续交付需要做的事情. 并且,这篇文章不是硬广, 图中涉及到的服务也是基础服务,提供便捷的配置方式,最佳实践的推荐. 我们并不去定义标准和规范,会兼容业内所有的规范和标准的玩法. 下面开始正文: 本文涉及到的平台有: 阿里云持续交付平台 https://crp.

从交通灯模型到Docker化IC编程

本文讲的是从交通灯模型到Docker化IC编程,[编者的话]本文通过一个树莓派制作交通灯系统的例子,介绍了树莓派如何应用Docker来简化开发与发布流程.本文作者是一位有20年经验的软件工程师,同时也是自动化设备的狂热爱好者. 我家七岁的小朋友问我交通灯是怎么工作的.在解释一大堆抽象概念前,我决定用LED灯和电线做一个手工的实物教具.最终我们要实现一个被应用程序控制的带按钮的行人过街系统--当然,这个应用是被Docker化(Dockerized)后跑在树莓派3代(Raspberry Pi 3)上

DockOne微信分享( 八十九):恒生金融交易系统的Docker化实践

本文讲的是DockOne微信分享( 八十九):恒生金融交易系统的Docker化实践[编者的话]Docker可以显著改善企业软件研发流程.提升企业DevOps效率.借助Docker,企业可以对现有IT系统进行一次梳理,解决IT软件系统部署.升级难的顽疾,重新释放企业生产力,降低企业成本.本次分享介绍了恒生电子运用Docker技术,加上自研配套工具,实现金融交易系统配置.部署.运维自动化的心得,包括: Docker的优势以及我们为什么要使用Docker: 恒生Docker运用现状: 恒生金融交易系统

DockOne微信分享(一二一):喜马拉雅FM测试环境的Docker化实践案例

本文讲的是DockOne微信分享(一二一):喜马拉雅FM测试环境的Docker化实践案例[编者的话]随着容器技术的流行,作为线上应用Docker的铺垫,喜马拉雅FM从16年开始推进测试环境Docker化.本次分享将重点为大家介绍我们在Docker化的过程中如何进行技术选型.环境搭建,特别是实践中碰到的一些问题及其解决方案. [3 天烧脑式 Docker 训练营 | 上海站]随着Docker技术被越来越多的人所认可,其应用的范围也越来越广泛.本次培训我们理论结合实践,从Docker应该场景.持续部

Docker化运维方式讲解

应用迁移需求 应用运维需要考虑的一个重要问题就是迁移, 在不同机器.机房.环境间迁移.迁移的原因有很多, 比如硬件过保(硬件故障), 机房迁移, 应用扩缩容等. 应用迁移的核心需求是: 简单.迁移操作必须足够简单, 没有学习成本, 点击一下即可. 快速.迁移过程能在极短的时间内完成. 无损.迁移之后应用与原应用一模一样, 不丢失任何配置和数据.迁移之后应用功能和业务逻辑与原部署应用一模一样,无任何业务风险. 许多公司还在使用古老的 rhel 5/6 和 linux 2.6.x 内核, 难以充分发

Docker 化运维方式

应用迁移需求 应用运维需要考虑的一个重要问题就是迁移, 在不同机器.机房.环境间迁移.迁移的原因有很多, 比如硬件过保(硬件故障), 机房迁移, 应用扩缩容等. 应用迁移的核心需求是: 简单.迁移操作必须足够简单, 没有学习成本, 点击一下即可. 快速.迁移过程能在极短的时间内完成. 无损.迁移之后应用与原应用一模一样, 不丢失任何配置和数据.迁移之后应用功能和业务逻辑与原部署应用一模一样,无任何业务风险. 许多公司还在使用古老的 rhel 5/6 和 linux 2.6.x 内核, 难以充分发

通过 Docker 化一个博客网站来开启我们的 Docker 之旅

这篇文章包含 Docker 的基本概念,以及如何通过创建一个定制的 Dockerfile 来 Docker 化Dockerize一个应用. Docker 是一个过去两年来从某个 idea 中孕育而生的有趣技术,公司组织们用它在世界上每个角落来部署应用.在今天的文章中,我将讲述如何通过"Docker 化Dockerize"一个现有的应用,来开始我们的 Docker 之旅.这里提到的应用指的就是这个博客! 什么是 Docker? 当我们开始学习 Docker 基本概念时,让我们先去搞清楚什

使用maven assembly完美Docker化Java与C++混合工程

我们都知道基于maven的Java工程,使用mvn package命令即可实现构建,Docker化只需将构建结果COPY到镜像中就完成了,如果是Spring Boot工程,只需要拷贝一个jar进去. 但是,如果我们的工程是一个Java和C++混合的工程,Docker化就没有那么简单了. C++构建的so文件不像Java构建的jar,可以直接复制到镜像中(只要镜像中的Java版本和构建环境中的版本一致),so与操作系统环境上的很多因素有关,我们不敢贸然将实现构建好的so复制到镜像中.这就要求我们要

京东MySQL数据库Docker化最佳实践(附PPT)

讲师介绍  刘风才 京东资深数据库专家     2012年加入京东,担任MySQL DBA一职,负责数据库架构设计.数据库性能优化等日常运维工作,参与过分布式数据库项目.多中心交易项目等. 2013~2016连续4年作为MySQL数据库618.11.11项目DBA负责人,负责相应备战工作,为大促平稳护航.   演讲大纲: 京东Docker技术发展历程 MySQL数据库为何要Docker化 MySQL数据库Docker化前准备工作 遇到的问题与解决方案 总结与展望   京东MySQL数据库Dock