MYF

Get Started, Part 6: Deploy your app

参考文档:Get Started, Part 6: Deploy your app

Prerequisites

  • 安装docker
  • 获取Part 3的预备工作中的docker compose
  • 获取Part 4的预备工作中的docker machine
  • 阅读Part 1中的orientation
  • 在Part 2中学习如何创建容器
  • 确保你已经发布了friendlyhello镜像并且push到了registry上。我们在这里使用这个共享镜像
  • 确保你的镜像作为一个已部署的容器运行。运行这个命令,然后将username, repo, tag换成你自己的:docker run -p 80:80 username/repo:tag,然后访问http://localhost/
  • 确保手边有Part 5最后一个版本的docker-compose.yml文件

Introduction

对于这整个教程,你一直在编辑相同的Compose file。好了,我们有一个好消息。这个Compose file在生产环境中会和在你本机上运行的一样好。现在,我们来看看一些用于你Dockerized化应用的选项。

Choose an option

备注:这里只翻译Docker CE部分,Enterprise(Cloud provider)和Enterprise(On-premise)部分请查阅原文档

如果你觉得在你的生产中使用Docker社区版本ok的化,你可以在流行的服务提供商(如AWS, DigitalOcean, MS Azure)上使用Docker cloud来帮助自己管理应用。

设置和部署:

  • 通过你喜欢的运营商连接Docker Cloud,授予Docker Cloud的权限和Dockerize的虚拟机
  • 使用Docker Cloud来创建你的计算资源和你的swarm
  • 部署你的app

注意:我们这里不链接到Docker Cloud文档,确保你完成每一步后都会回到这一页。

Connect Docker Cloud

你可以使用Standard模式Swarm模式运行Docker Cloud

如果你正在使用Standard模式运行Docker Cloud,依次查看以下链接的指导,以便你的服务提供商接入Docker Cloud

如果你使用Swarm模式(推荐在AWS和MS Azure使用),那么直接看下一个章节create your swarm。

Create your swarm

准备好创建一个swarm了吗?

注意:如果你在使用Docker Cloud Agent来bring你的主机,那么这个提供者则不支持swarm模式,你可以通过Docker Cloud注册你已有的swarm

Deploy your app on a cloud provider.

1、通过Docker Cloud连接到你的swarm上。有以下几种不同的方法来进行连接:

  • 在Swarm模式下的Docker Cloud web interface,选择网页顶端的Swarms,点击你想要连接的swarm,在命令行粘贴给出的指令。

或者…

不管使用哪种方式,这都会打开一个终端,内容是你本机,但是指令会在你的云服务提供商的swarm上运行。你可以直接访问你本地的文件系统和远程的swarm,使用pure的docker命令。

2、运行

docker stack deploy -c docker-compose.yml getstartedlab来在云主机swarm上部署应用

1
2
3
4
5
6
docker stack deploy -c docker-compose.yml getstartedlab

Creating network getstartedlab_webnet
Creating service getstartedlab_web
Creating service getstartedlab_visualizer
Creating service getstartedlab_redis

你的app现在已经运行在云服务器上了。

RUN SOME SWARM COMMANDS TO VERIFY THE DEPLOYMENT

你可以使用一些swarm的命令行,就像你之前做的那样,来浏览和管理swarm。这里给出一些示例,你现在应该已经很眼熟了:

  • 使用docker node ls来列出结点
1
2
3
4
5
6
[getstartedlab] ~ $ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
9442yi1zie2l34lj01frj3lsn ip-172-31-5-208.us-west-1.compute.internal Ready Active
jr02vg153pfx6jr0j66624e8a ip-172-31-6-237.us-west-1.compute.internal Ready Active
thpgwmoz3qefdvfzp7d9wzfvi ip-172-31-18-121.us-west-1.compute.internal Ready Active
n2bsny0r2b8fey6013kwnom3m * ip-172-31-20-217.us-west-1.compute.internal Ready Active Leader
  • 使用docker service ls来列出服务
1
2
3
4
5
6
[getstartedlab] ~/sandbox/getstart $ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
x3jyx6uukog9 dockercloud-server-proxy global 1/1 dockercloud/server-proxy *:2376->2376/tcp
ioipby1vcxzm getstartedlab_redis replicated 0/1 redis:latest *:6379->6379/tcp
u5cxv7ppv5o0 getstartedlab_visualizer replicated 0/1 dockersamples/visualizer:stable *:8080->8080/tcp
vy7n2piyqrtr getstartedlab_web replicated 5/5 sam/getstarted:part6 *:80->80/tcp

使用docker service ps <service>来显示当前service的tasks

1
2
3
4
5
6
7
[getstartedlab] ~/sandbox/getstart $ docker service ps vy7n2piyqrtr
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
qrcd4a9lvjel getstartedlab_web.1 sam/getstarted:part6 ip-172-31-5-208.us-west-1.compute.internal Running Running 20 seconds ago
sknya8t4m51u getstartedlab_web.2 sam/getstarted:part6 ip-172-31-6-237.us-west-1.compute.internal Running Running 17 seconds ago
ia730lfnrslg getstartedlab_web.3 sam/getstarted:part6 ip-172-31-20-217.us-west-1.compute.internal Running Running 21 seconds ago
1edaa97h9u4k getstartedlab_web.4 sam/getstarted:part6 ip-172-31-18-121.us-west-1.compute.internal Running Running 21 seconds ago
uh64ez6ahuew getstartedlab_web.5 sam/getstarted:part6 ip-172-31-18-121.us-west-1.compute.internal Running Running 22 seconds ago

OPEN PORTS TOSERVICES ON CLOUD PROVIDER MACHINES

现在,你的应用已经在你的云服务器上部署好了,你刚才运行的docker指令就能很好的说明这点。但是你仍然需要在你的云服务器上打开一些端口以便于:

  • 允许redis服务和web服务在worker机间通信
  • 允许入站的流量访问运行在worker结点上的web服务,这样Hello World和Visualizer才能通过web浏览器访问。
  • 允许入站的ssh流量访问服务器,这样才能运行在manager上(这点可能你的云服务商已经弄好了)

这些端口你需要给各个服务开放:

Service Type Protocol Port
web HTTP TCP 80
visualize HTTP TCP 8080
redis TCP TCP 6379

具体要怎样做取决于你的云服务提供商。

我们使用Amazon Web Services(AWS)作一个例子。

Redis服务是怎样来持久化数据的呢?
想要让redis服务运行,你需要ssh到manager运行的云服务器上,在你运行docker stack deploy之前,在/home/docker目录下创建一个data/目录。另一个选择是在docker-stack.yml文件中改变数据的path为一个已经在manager服务器上存在的路径。这个例子不包括这一步,所以redis服务在这个例子的输出中不会出现。

EXAMPLE: AWS

1、 登录AWS Console,进入EC2 Dashboard,然后点进你正在运行的实例来查看结点。
2、 在左侧的菜单中,进入Network & Security -> Security Groups。查看和你的swarm相关的security groups,如关联getstartedlab-Manager-<xxx>, getstartedlab-Nodes-<xxx>以及getstartedlab-SwarmWide-<xxx>
3、 选择”Node”security group对那个swarm。这个group的名字类似于getstartedlab-NodeVpcSG-9HV9SMHDZT8C
4、 为web, visualizer, redis服务添加入站规则,设置Type, Protocol, Port如上面的表格所示,然后点击Save来应用这些规则

Tips: 当你保存新的rules的时候,HTTP和TCP的端口会自动创建IPv4和IPv6形式的地址。

5、 进入Running Instances,获取每一个worker的公共DNS名称,并且将他们粘贴进入你网页浏览器的address bar。

如同之前教程的内容,Hello Word应用将会在80端口显示,Visualizer会在8080端口显示。

Iteration and cleanup

从这里,你可以做你之前章节学过的所有内容了。

  • 通过改变docker-compose.yml文件来规模化你的app,然后远程发出docker stack deploy指令来重新部署。
  • 通过编辑代码来改变应用行为,然后重建,push新的镜像。(要做这个,请参照你之前学习的build the apppublish the image中的相关指令
  • 通过docker stack rm指令,你可以解散一个stack。比如:docker stack rm getstartedlab

不同于你之前在本地的Docker machine虚拟机上运行的场景,你的swarm和在此之上部署的app持续运行在云服务器上,不论你是否关掉你本地的主机。

Congratulations!

你已经完成了全栈的、从开发到部署的docker平台旅程。

有很多这个旅程没有覆盖到的但是docker平台可以为你提供的东西,但是你已经有一个对containers, images, services, swarms, stacks, scaling, load-balancing, volumes, placement constrains的基本概念了。

想要了解的更加深入,这里有一些我们推荐的资源。

  • Samples: 我们的示例包括多个流行软件在containers中运行的实例,以及一些labs教会你最佳实践。
  • User Guide: 这个用户指南有多个例子,解释网络和存储,相比于这些教程有着更加的深度。
  • Admin Guide: 覆盖如何管理一个docker化的生产环境。
  • Training: 官方Docker教程,提供了一些实践性的知道和虚拟课程环境。
  • Blog: 包括Docker最近变动的教程。