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

flask_app_docker.png


棒极了!

要查看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:从本地到云端
优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/224777

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。