Docker 入门教程六 - 部署应用

原文地址

1. 先决条件 Prerequisites

  • 安装的 Docker 版本在 1.13 以上。
  • 获取了第 3 章节讲的 Docker Compose
  • 获取了第 4 章节讲的 Docker Machine
  • 读了第 1 章节和第 2 章节,知道如何创建容器。
  • 确保已经发布了 friendlyhello 这个镜像并上传到了 registry。
  • 确保你的镜像可以部署为容器并运行。运行这个命令,用你的信息替换 username、repo 和 tag:docker run -p 80:80 username/repo:tag,然后访问:http://localhost/
  • 第 5 章节的 docker-compose.yml 文件。

2. 概述

你一直在为这个系列教程编辑同一个 Compose 文件。好消息是这个 Compose 文件在生产中的效果与在您的计算机上的效果相同。 在这里,我们通过一些选项来运行 Dockerized 应用程序。

3. Choose an option

如果你的生产环境使用的是 Docker Community Edition,可以使用 Docker Cloud 来辅助管理特定服务提供商上的应用,比如 Amazon Web Services、DigitalOcean 和 Microsoft Azure。

设置和部署:

  • 将 Docker Cloud 和你的首选服务提供商连接,为 Docker Cloud 授权,以便自动配置和将虚拟机容器化(Dockerize)。
  • 使用 Docker Cloud 创建计算资源并创建 swarm。
  • 部署应用程序。

注意:这里并没有列出 Docker Cloud 的文档,务必在完成每个步骤后回到这个页面。

3.1 连接 Docker Cloud

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

如果在标准模式下运行 Docker Cloud,按照下面的指示将你的服务提供商连接到 Docker Cloud。

如果是在 swarm 模式下运行(建议用于 Amazon Web Services 或 Microsoft Azure),直接跳到下一部分 创建 swarm。

3.2 创建 swarm

注意:如果 使用 Docker Cloud Agent 自带主机,则此程序不支持 swarm 模式(If you are Using the Docker Cloud Agent to Bring your Own Host, this provider does not support swarm mode)。可以使用 Docker Cloud 注册自己的已存在的 swarm

3.3 部署应用到云端

3.3.1 通过 Docker Cloud 连接到 swarm

有两种不同的连接方式:

  • 在 Swarm 模式下的 Docker Cloud 网页接口中,选择页面顶部的 swarm,点击要连接的 swarm,复制粘贴给定的命令到命令行终端。
    cloud-swarm-connect

  • 在 Mac 或 Windows 版本的 Docker 中,可以通过 桌面应用菜单快速连接到 swarm
    cloud-swarm-connect-desktop

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

3.3.2 部署应用到云端

运行 docker stack deploy -c docker-compose.yml getstartedlab 命令来部署应用到云端的 swarm。

 docker stack deploy -c docker-compose.yml getstartedlab

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

现在应用运行在云端了。

3.3.3 运行 swarm 命令验证部署效果

可以使用 swarm 命令行来浏览和管理 swarm。下面是几个看上去类似的例子:

  • 通过 docker node ls 查看节点:
  [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 查看服务:
[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 node ps <service> 查看服务的任务 task:
[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     

3.3.4 开启云服务器的端口

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

  • 允许每个 worker 节点上的 redis 和 web 服务互相通信

  • 允许到 worker 节点上的 web 服务的入站流量,以使 Hello World 和 Visualizer 可以从浏览器访问。

  • 允许到运行 swarm 管理器的服务器上 SSH 服务的入站流量(可能已经有云服务提供商设置好了)。

这些是每个服务需要暴露的端口:

服务类型协议端口
webHTTPTCP80
visualizerHTTPTCP8080
redisTCPTCP6379

开启端口的方法,参考每个云服务提供商,不再举例。

用于数据持久化的 redis 服务怎么设置?
要让 redis 服务工作,需要在运行 docker stack deploy 命令前通过 ssh 登入运行 swarm 管理器的那台云服务器,并在目录 /home/docker/ 中创建 data/ 目录。另一种选择是将 docker-stack.yml 文件中的数据路径改为一个运行 swarm 管理器的那台云服务器上已经存在的目录。这个例子中的 redis 因为没有设置路径,所以无法使用。

3.4 迭代和清理

现在可以使用之前学过的所有知识了。

  • 通过改变 docker-compose.yml 文件来伸缩应用,执行 docker stack deploy 命令就地重新部署应用。

  • 通过编辑代码、重新构建并推送新镜像来改变应用程序的表现。

  • 通过 docker stack rm 命令删除 stack:

docker stack rm getstartedlab

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

4. 祝贺!

你已经对使用 Docker 平台进行从开发到部署的完整流程进行了学习。

Docker 平台上,有更多的知识是这里没有提到的,但是你已经对 container、image、service、swarm、stack、scaling、load-balancing、volume、placement constraint 有了基本认识。

想要深入学习吗?下面是我们建议的资源:

  • Samples:包含了多个运行在容器中的流行软件的示例,以及一些教授最佳实践的实验室。
  • User Guide:用户向导中有几个相对深入的解释网络和存储的例子。
  • Admin Guide:管理员向导中讲述了如何管理容器化的生产环境。
  • Training:官方的 Docker 课程,提供面对面的教学和虚拟教室环境。
  • Blog:涵盖了 Docker 最近发生的一切。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值