Docker入门Part6-发布你的app

前提条件

  • 安装Docker 1.13或更高的版本
  • 按照Part3部分,获取Docker Compos
  • 按照Part4部分,获取Docker Machine
  • 阅读Part1。
  • 学习Part2中的如何创建容器。
  • 确保您的镜像作为一个发布容器在运行。运行这条插入了usernamerepotag信息的命令:docker run -p 80:80 username/repo:tag,然后访问http://localhost/
  • 获取到Part5中的最终版本的compose.yml文件。

介绍

您一直在为整个教程编辑相同的Compose文件。那么,我们有一个好消息,这个Compose文件在生产环境中的效果与你的计算机上的效果是相同的。在这里,我们通过一些选项来运行Docker化的程序。

发布

Docker社区版(云服务提供者)

如果您可以在生产环境中使用Docker社区版,那么你可以使用Docker Cloud来帮助您管理应用程序,例如Amazon Web Services,DigitalOcean,和Microsoft Azure等常用的服务提供商。

设置和部署:

  • 将Docker Cloud与您的首选提供商连接,授予Docker Cloud权限,以便为您自动配置以及为您”Docker化”VM。
  • 使用Docker Cloud创建您的计算资源并创建您的swarm。
  • 部署您的应用。

注意:我们没有链接到Docker Cloud文档。请务必在完成每个步骤后回到此页面。

连接Docker Cloud

你可以在标准模式swarm模式下运行Docker Cloud。

如果你正在标准模式下运行Docker Cloud,请按照以下说明将您的服务提供商链接到Docker Cloud。

如果您在Swarm模式下运行(推荐用于Amazon Web Services或Microsoft Azure),那么请跳至下一节关于如何创建swarm的部分。

创建你的swarm

准备好创建一个swarm了吗?

注意:如果您使用Docker云代理来自带主机,则此提供程序不支持swarm模式。您可以使用Docker Cloud注册您自己的现有的swarm

在云服务平台上部署你的应用程序

  • 1.通过Docker Cloud连接到你自己的swarm。有几种不同的连接方式:

    • 从Swarm模式的Docker Cloud Web界面中,选择页面顶部的Swarms,单击要连接的swarm,然后将给定的命令复制粘贴到命令行终端中。

      或者。。。

    • 在Docker for Mac或Docker for Windows上,您可以通过桌面应用菜单直接连接到swarm

      无论哪种方式,都将打开一个终端,其上下文是本地计算机,但其Docker命令会路由到云服务提供商上运行的swarm。您可以直接访问本地文件系统和远程swarm,从而启用纯粹的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

    您的应用现在运行在了云服务平台上了。

运行一些swarm命令来验证部署:

你可以使用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的任务列表。
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

在云供应商机器上开放服务端口

此时,您的应用作为一个swarm部署在您的云提供商服务器上,正如刚刚运行的docker命令所证明的那样。但是,您仍然需要在云服务器上打开端口,以便:

  • 允许在工作节点上的redis服务和web服务之间进行通信
  • 允许入站流量通过worker节点上的web服务,以便可以在浏览器访问Hello World和Visualizer。
  • 允许运行manager的服务器上的入站SSH流量(这可能已在您的云提供商上设置)

这些是您需要为每项服务公开的端口:

Service 类型 协议 端口
web HTTP TCP 80
visualizer HTTP TCP 8080
redis TCP TCP 6379

具体的做法取决于云服务平台。

我们以Amazon Web Services(AWS)为例。

redis如何持久化数据?

为了使redis服务正常工作,在运行docker stack deploy之前,需要ssh进入manager运行的云服务器,并在/home/docker/中创建data/目录。另一种选择是将docker-stack.yml中的数据路径更改为manager服务器上已存在的一个路径。此示例不包含此步骤,因此示例输出中的redis服务未启动。

示例:AWS

  • 1.登录AWS控制台,转到EC2仪表板,然后单击进入Running Instances查看节点。
  • 2.在左侧的按钮,进入Network & Security > Security Groups

    请参阅getstartedlab-Manager-<xxx>, getstartedlab-Nodes-<xxx>, 和 getstartedlab-SwarmWide-<xxx>的与swarm相关的安全组。

  • 3.为swarm选择“节点”安全组。组名是这样的:getstartedlab-NodeVpcSG-9HV9SMHDZT8C

  • 4.为webvisualizerredis服务添加入站规则,为每个服务设置类型,协议和端口(如上表所示),然后单击保存以应用规则。

提示:当你保存新的规则时,会为IPv4和IPv6地址自动创建HTTP和TCP端口。

  • 5.进入Running Instances列表,获取其中一个worker的公共DNS名称,并将其粘贴到浏览器地址栏中。

就像本教程的前几部分一样,Hello World应用程序显示在端口80上,而Visualizer显示在端口8080上。

迭代和清理

从这里你可以完成你在教程前面部分学到的所有知识。

  • 通过修改docker-compose.yml文件并使用命令docker stack deploy重新发布来扩展你的应用程序。
  • 通过编辑代码更改应用程序行为,然后重新构建并推送新镜像。(要做到这一点,请按照之前用于构建应用程序发布镜像的相同步骤)。
  • 您可以使用docker stack rm命令来拆卸堆栈。例如:
1
docker stack rm getstartedlab

与在本地Docker机器虚拟机上运行swarm的场景不同,不管您是否关闭本地主机,您的swarm和部署在其上的任何应用程序都将继续在云服务器上运行。

坚持原创技术分享,您的支持将鼓励我继续创作!