使用Compose和Machine实现本地与云端的同步部署与管理

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

前言

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主机。

检验一下安装是否成功:

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

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

  1. ├── copy.sh 
  2.  
  3. ├── docker-compose.yml 
  4.  
  5. ├── nginx 
  6.  
  7. │ ├── Dockerfile 
  8.  
  9. │ └── sites-enabled 
  10.  
  11. │ └── flask_project 
  12.  
  13. └── web 
  14.  
  15. ├── Dockerfile 
  16.  
  17. ├── app.py 
  18.  
  19. ├── config.py 
  20.  
  21. ├── create_db.py 
  22.  
  23. ├── models.py 
  24.  
  25. ├── requirements.txt 
  26.  
  27. ├── static 
  28.  
  29. │ ├── css 
  30.  
  31. │ │ ├── bootstrap.min.css 
  32.  
  33. │ │ └── main.css 
  34.  
  35. │ ├── img 
  36.  
  37. │ └── js 
  38.  
  39. │ ├── bootstrap.min.js 
  40.  
  41. │ └── main.js 
  42.  
  43. └── templates 
  44.  
  45. ├── _base.html 
  46.  
  47. └── index.html 

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

#p#

Docker Machine

要启动Docker Machine,只需简单地运行:

  1. $ docker-machine create -d virtualbox dev; 
  2.  
  3. INFO[0000] Creating CA: /Users/michael/.docker/machine/certs/ca.pem 
  4.  
  5. INFO[0000] Creating client certificate: /Users/michael/.docker/machine/certs/cert.pem 
  6.  
  7. INFO[0001] Downloading boot2docker.iso to /Users/michael/.docker/machine/cache/boot2docker.iso... 
  8.  
  9. INFO[0035] Creating SSH key... 
  10.  
  11. INFO[0035] Creating VirtualBox VM... 
  12.  
  13. INFO[0043] Starting VirtualBox VM... 
  14.  
  15. INFO[0044] Waiting for VM to start... 
  16.  
  17. INFO[0094"dev" has been created and is now the active machine. 
  18.  
  19. INFO[0094] To point your Docker client at it, run this in your shell: $(docker-machine env dev) 
  20.  
  21. $ $(docker-machine env dev) 
  22.  
  23. create命令为Docker开发设置了一台“machine”(名为dev)。实际上,它下载了boot2docker,并启动了一个运行Docker的虚拟机。 
  24.  
  25. 运行如下命令来查看当前运行的Machine: 
  26.  
  27. $ docker-machine ls 
  28.  
  29. NAME ACTIVE DRIVER STATE URL SWARM 
  30.  
  31. dev * virtualbox Running tcp://192.168.99.100:2376 

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

#p#

Docker Compose

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

  1. web: 
  2.  
  3. restart: always 
  4.  
  5. build: ./web 
  6.  
  7. expose: 
  8.  
  9. "8000" 
  10.  
  11. links: 
  12.  
  13. - postgres:postgres 
  14.  
  15. volumes: 
  16.  
  17. - /usr/src/app 
  18.  
  19. env_file: .env 
  20.  
  21. command: /usr/local/bin/gunicorn -w 2 -b :8000 app:app 
  22.  
  23. nginx: 
  24.  
  25. restart: always 
  26.  
  27. build: ./nginx/ 
  28.  
  29. ports: 
  30.  
  31. "80:80" 
  32.  
  33. volumes: 
  34.  
  35. - /www/static 
  36.  
  37. links: 
  38.  
  39. - web:web 
  40.  
  41. data: 
  42.  
  43. restart: always 
  44.  
  45. image: postgres:latest 
  46.  
  47. volumes: 
  48.  
  49. - /var/lib/postgresql 
  50.  
  51. command: true 
  52.  
  53. postgres: 
  54.  
  55. restart: always 
  56.  
  57. image: postgres:latest 
  58.  
  59. volumes_from: 
  60.  
  61. - data 
  62.  
  63. ports: 
  64.  
  65. "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脚本:

  1. $ sh copy.sh 

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

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

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

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

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

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

 

棒极了!

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

  1. $ docker-compose run web env 

要查看日志:

  1. $ docker-compose logs 

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

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

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

#p#

部署

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

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

  1. $ docker-machine create \ 
  2.  
  3. -d digitalocean \ 
  4.  
  5. --digitalocean-access-token=你的令牌 \ 
  6.  
  7. production 

这将花费几分钟来准备droplet并设置一个名为production的新的Docker Machine:

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

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

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

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

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

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

  1. $ docker-compose build 
  2.  
  3. $ docker-compose up -d 
  4.  
  5. $ docker-compose run web /usr/local/bin/python create_db.py 

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

 

 

责任编辑:Ophira 来源: dockerone
相关推荐

2019-03-28 05:21:07

WLANWi-Fi网络

2023-10-10 00:09:14

2022-09-12 07:17:20

redis命令redissynce

2013-10-16 09:38:23

云端应用部署工具应用部署工具云测试

2024-03-08 11:30:38

SaaSIT管理平台管理

2023-05-29 16:11:37

物联网云计算

2020-07-03 07:38:58

云物联网物联网IOT

2024-01-17 08:01:28

Docker语法命令

2014-12-05 09:53:59

docker容器管理开源

2011-09-21 14:25:16

2014-04-30 15:52:59

红帽

2012-03-16 15:39:51

VMware应用程序虚拟化

2015-08-03 16:15:53

Docker部署集群

2013-08-01 11:46:55

云安全安全警报安全报告

2021-12-14 00:00:51

监控 部署故障

2017-01-11 16:57:51

大数据大数据集群监控

2011-08-23 10:37:15

Oracle分区表本地索引

2017-05-23 15:53:52

docker服务容器

2022-07-08 22:23:40

DaprRedis分布式

2024-09-06 12:28:48

点赞
收藏

51CTO技术栈公众号