这个《Docker入门系列》文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成。主要是作为个人学习记录。有错误的地方,Robin欢迎大家指正。分为如下几个部分:

1 Docker入门:简介

2 Docker入门:安装运行

3 Docker入门:容器(Containers)

4 Docker入门:服务(Services)

5 Docker入门:Swarms

6 Docker入门:Stacks

7 Docker入门:部署app

8 Docker入门:稍高级的话题

7.1 引言

前面我们对Compose文件进行了反复修改。可喜的是,这个文件在产品部署中同样能够正常工作,就像在你的机器上运行一样。下面根据不同的选项组合来运行你的Dockerized app。

7.2 Docer版本选择

首先进行版本选择,我们以Docker CE(Cloud provider)为例。其他版本自己参考Docker官网文档。

选择Docer CE版本后,我们可以使用Docker Cloud来帮忙管理我们的app,这些app运行在主流的服务提供商上面。主流的云服务提供商包括Amazon Web Service(AWS)、DigitalOcean、Microsoft Azure等。

安装部署主要包括以下几个步骤:

  • 连接Docker Cloud和你选择的服务商,保证Docker Cloud拥有权限来自动为你提供”Dockerized” VMs。
  • 使用Docker Cloud来创建你的计算资源和swarm。
  • 部署你的app。

7.3 模式选择

可以使用两种模式来运行Docker Cloud:standard mode和swarm mode。

下面我们选择swarm mode。如果使用standard mode,请参考Docker帮助文档。

使用swarm mode时,推荐选择AWS和Azure。由于本人没有给这两家送钱,现在只能选择第三种方式:在Docer Cloud UI上创建节点。

7.4 创建swarm

如果想在AWS或Azure上创建swarm,请参考其他Docer文档。下面我们在Docker Cloud UI上创建节点。

  创建swarm,总体需要四个步骤。首先在Docker Cloud UI中创建节点;通过SSH连接到Docker Cloud-manager node,然后运行命令docker swarm init和docker swarm join;使能swarm mode;注册swarm。下面对这四个步骤分别介绍。

7.4.1 创建节点

在本节,将会在Docker Cloud上创建一个节点(该节点在node cluster中)。

首先需要链接(link)到你的基础设施(infrastructure)。

为了部署你的Docker cloud节点,你需要保证Docker Cloud能够访问你的infrastructure。也就是说,能够访问一个cloud service provider,比如:

  • AWS
  • Azure
  • 在你的Linux主机上安装Docker Cloud Agent

  拥有访问权限后,就可以直接从Docer Cloud中提供节点。使用的方式有WEB UI/CLI/API。

  具体如何链接(link)到一个cloud service provider,或链接到你自己的主机,参考Docker Cloud文档(https://docs.docker.com/docker-cloud/getting-started/connect-infra/)。

  具体如何在Docker Cloud上创建一个节点,参考文档(https://docs.docker.com/docker-cloud/getting-started/your_first_node/)。

7.4.2 SSH方式连接Docker Cloud-manager node

首先通过SSH连接到Docker Cloud-manager node,然后运行命令docker swarm init和docker swarm join。

采用SSH方式连接,需要将pulic SSH key添加到每个节点的authorized_keys文件中,这样你才有权限访问Docker Cloud提供的节点。还有一种处理方式,这里不谈了。

下面分为三个步骤完成。

(1)创建keypair

如果你没有一个keypair,那就需要使用ssh-keygen –t rsa命令来产生一个。有的话,就跳过这步了。

$ ssh-keygen -t rsa

Generating public/private rsa key pair.

Enter file in which to save the key (/Users/borjaburgos/.ssh/id_rsa): dockercloud

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in dockercloud.

Your public key has been saved in dockercloud.pub.

The key fingerprint is:

ac:76:05:19:51:fa:3e:f0:c8:80:73:0d:9f:6b:b7:8f borjaburgos@MacBookPro

The key's randomart image is:

+--[ RSA 2048]----+

|        oo.      |

|         +       |

|      . +        |

|     . = +       |

|    o o S o      |

|     o + B       |

|      o * =      |

|     . o . +     |

|          E..    |

+-----------------+

然后将public key的值拷贝到粘贴板上:

$ more dockercloud.pub

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC4PHh4WJqUgiWedmkIJS+L1IwxfXHkfYC0N9NZ28quXyL4zQq2CDeCQrS0RDESklnuZVCe9p5fjgEHcy+FsiTUaBbjzCndeO++gqAM6pKy4ziEY1JNpIBpbuyVIK6AJIqTWzcqprhw4G8PZetLoHug3BWiiwsIW7WHhNNsrEVEsTCnCc5vG97IHZ0A6TlP6HGvVSfCFPZiAxP48hsoEsEGjcCvY9tgJa4k60XWtHbPWtjOi90RFt9OKcbUsZa+vq/3lBG50XbMoQm3NS6A+UQQ7SKvzmwJSIYCqo5lu9UzQbVKy9o00NqXa5jkmZ9Yd0BJBjFmb3WwUR8sJWZVTPFL

(2)在Docer Cloud上创建一个stack

接下来,需要运行authorizedkeys service。

可以在Docker Cloud上创建一个新的stack,并在输入如下内容来手动创建service:

authorizedkeys:

  image: dockercloud/authorizedkeys

  deployment_strategy: every_node

  autodestroy: always

  environment:

    - AUTHORIZED_KEYS=ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC4PHh4WJqUgiWedmkIJS+L1IwxfXHkfYC0N9NZ28quXyL4zQq2CDeCQrS0RDESklnuZVCe9p5fjgEHcy+FsiTUaBbjzCndeO++gqAM6pKy4ziEY1JNpIBpbuyVIK6AJIqTWzcqprhw4G8PZetLoHaiTh343wsIW7WHhNNsrEVEsTCnCc5vG97IHZ0A6TlP6HGvVSfCFPZiAxP48hsoEsEGjcCvY9tgJa4k60XWtHbPWtjOi90RFt9OKcbUsZa+vq/3lBG50XbMoQm3NS6A+UQQ7SKvzmwJSIYCqo5lu9UzQbVKy9o00NqXa5jkmZ9Yd0BJBjFmb3WwUR8sJWZVTPFL

  volumes:

    - /root:/user:rw

你也可以点击下面的按钮,从而在Docker Cloud上自动创建一个新的stack及authorizedkeys  service,并且这个service基本上配置好了。

无论采用以上哪种方式,你都需要添加你的public key。

然后,使用使用之前步骤中拷贝的public key来修改AUTHORIZED_KEYS的值。

在stack页面,点击”Create and deploy”。

运行该service;拷贝你的public key到你的所有节点;然后关闭容器,并自动销毁这些容器。

◆ 注意:这个service的默认配置,会拷贝public key到你所有的节点上。

(3)SSH到Docker Cloud节点上

接下来,从Docker Cloud中获取节点的IP地址(在Node details页面里)。

使用这个IP,你就可以以root身份SSH到这个节点上:

$ ssh -i ~/dockercloud root@104.236.69.138

The authenticity of host '104.236.69.138 (104.236.69.138)' can't be established.

RSA key fingerprint is 4b:22:71:39:53:4a:88:51:4b:a7:2e:ed:03:dd:a3:7f.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '104.236.69.138' (RSA) to the list of known hosts.

Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-40-generic x86_64)

* Documentation:  https://help.ubuntu.com/

System information as of Mon Feb  2 23:29:53 EST 2015

System load:  0.2                Users logged in:        0

Usage of /:   16.0% of 19.56GB   IP address for eth0:    104.236.69.138

Memory usage: 52%                IP address for eth1:    10.132.224.214

Swap usage:   0%                 IP address for docker0: 172.17.42.1

Processes:    111

Graph this data and manage this system at:

https://landscape.canonical.com/

Last login: Mon Feb  2 23:29:54 2015 from pool-108-30-19-181.nycmny.fios.verizon.net

root@13e9d739-admin:~#

7.4.3 使能swarm mode

在页面的最上方,点击切换键就可以切换到swarm mode。

具体细节参考(https://docs.docker.com/docker-cloud/cloud-swarm/using-swarm-mode/)。

7.4.4 注册你的swarm

注册你刚刚创建的swarm。

使用Beta swarm mode,就可以在Docker Cloud上注册已经创建的swarms,无论这些swarms在哪里运行,都可以进行方便的管理。

注册之前需要如下几点:

  • 一个Doceker ID;
  • 由Docker Engine节点(V1.13或更新版本)组成的Docker swarm;
  • 一个终端回话,并连接到其中一个swarm的管理节点;
  • 可以访问那个管理节点的2376端口。

  具体注册步骤参考文档(https://docs.docker.com/docker-cloud/cloud-swarm/ register-swarms/#register-a-swarm)。

7.5 在一个cloud provider上部署你的app

具体分为如下两个步骤。

7.5.1 通过Docker Cloud连接你的swarm

平台不同,连接方式还不同。

在Docker Cloud网页页面(处于swarm mode下),在页面的上方有swarms列表,点击你想连接的swarm,拷贝命令并粘贴到命令行终端:

对于Mac/Windows平台上的Docker,直接在菜单上连接即可:

无论采用如上哪种连接方式,都会打开一个终端(terminal),该终端的上下文是你的本地机器,但这些Docker命令将会路由到你的swarm上,该swarm运行在你的cloud service provider上。你可以同时访问你的本地文件系统和你的远程swarm,并直接使用docker命令。

7.5.2 部署app

通过运行命令docker stack deploy -c docker-compose.yml getstartedlab,将你的app部署到宿主在云上的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

OK,你的app现在运行在你的cloud provider上了。

7.6 验证部署

运行一些swarm命令,来检验下刚才的部署情况。

像之前那样使用swarm命令行,来浏览和管理swarm。下面是一些示例。

7.6.1 列出节点

使用命令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

7.6.2 列出services

使用命令docker service ls来列出services:

[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

7.6.3 查看一个service的任务

使用命令docker service ps <service>来查看一个service的所有任务(tasks):

[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

7.7 在cloud provider机器上打开services的端口

到目前为止,你的app已经作为一个swarm部署在你的cloud provider服务器上。但是,在你的云服务器上,还需要打开一些端口:

  • 使redis服务和worker节点上的web服务能够通信;
  • 在worker节点上能够从内部访问web服务,从而可以通过网页浏览器来访问Hello World和Visualizer;
  • 可以内部SSH到运行manager的服务器上(可能cloud provider已经配置好了)。

下面是每个服务需要暴露的端口:

Service

Type

Protocol

Port

web

HTTP

TCP

80

visualizer

HTTP

TCP

8080

redis

TCP

TCP

6379

云服务提供商不同,打开端口的方式也不一样,Docker官网以AWS为例进行了阐述(具体参考:https://docs.docker.com/get-started/part6/#iteration-and-cleanup)。

7.8 总结

到目前为止,你可以根据之前章节学习的内容来做任何事情了:

  • 通过修改docker-copose.yml文件来scale你的app,并使用命令docker stack deploy使部署立即生效;
  • 通过修改代码来改变app的行为,然后重新构建,并推送(push)新的映像;
  • 使用命令docker stack rm来关闭stack,例如:docker stack rm getstartedlab。

之前我们在本地Docker虚拟机上运行swarm,而切换到云服务器上后,情况会有些不同。无论你是否关闭你的本地机器,运行在云服务器上的swarm和app都会继续运行。

恭喜,你已经在Docker平台上经历了全栈的、从开发到部署的学习历程。你已经掌握了containers, images, services, swarms, stacks, scaling, load-balancing, volumes, and placement constraints这些基本概念,但这还不够。想更深入的学习,下面是推荐的资源:

  • Samples: Our samples include multiple examples of popular software running in containers, and some good labs that teach best practices.
  • User Guide: The user guide has several examples that explain networking and storage in greater depth than was covered here.
  • Admin Guide: Covers how to manage a Dockerized production environment.
  • Training: Official Docker courses that offer in-person instruction and virtual classroom environments.
  • Blog: Covers what’s going on with Docker lately.

Docker入门(七):部署app的更多相关文章

  1. docker入门与部署微服务--学习笔记

    最近公司进一步去windows,走向 linux+云化. 原来的一大坨windows虚拟机服务器都要转向linux, 既然走向linux的话,那么docker肯定是要涉足的. 故学习了docker入门 ...

  2. Docker 入门 到部署Web 程序- (阿里面试常用的docker命令和优点)

    最近阿里的面试官问我Docker是做什么用的,我记得之前360和美团,京东的都问过,但是一直没时间看,最近有时间了,系统的学习了一下Docker,在此做一下记录,方便各位看官学习交流 一.Docker ...

  3. Docker 入门指南——部署常用服务示例

    MongoDB FROM centos:centos7 MAINTAINER The CentOS Project <cloud-ops@centos.org> RUN yum -y up ...

  4. docker 入门6 - 部署 【翻译】

    开始,第 6 部分:部署应用 先决条件 安装 Docker. 获取第 3 部分先决条件中所述的 Docker Compose. 获取 Docker Machine,如第 4 部分先决条件中所述. 阅读 ...

  5. docker入门篇 部署springboot项目

    安装docker Ubuntu16.04安装Docker 使用docker 注册docker服务 systemctl enable docker systemctl status docker 然后在 ...

  6. Docker入门(六):Stacks

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

  7. Docker入门(五):Swarms

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

  8. Docker入门(四):服务(Services)

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

  9. Docker入门(三):容器(Containers)

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

随机推荐

  1. Appium python unittest pageobject如何实现加载多个case

    学习了Appium python项目施展的课程小伙伴都会有一个疑问,说现在所有的case都是通过一个suite进行一个方法一个方法进行添加的,但是在实际过程中我们不希望这样,我们做出来的功能是这样: ...

  2. Java多线程面试问题

    这篇文章主要是对多线程的面试问题进行总结的,罗列了40个多线程的问题. 1. 多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡.所谓 ...

  3. JS常用方法手记

    1.判断arr数组是否含有元素str,没有返回-1 arr.indexOf(str) 2.遍历arr数组,k为键,v为值 arr.map((v, k) => { return;}) 3.arr数 ...

  4. IOS数组按中文关键字以字母序排序

    本文转载至 http://blog.csdn.net/xunyn/article/details/7882087 iosobjective cuser框架通讯 IOS项目中会用到对通讯录的联系人或是会 ...

  5. 【BZOJ2151】种树 双向链表+堆(模拟费用流)

    [BZOJ2151]种树 Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n. ...

  6. Mac下下载 mysql8.0

    终端输入一下的命令,将文件下载下来 wget --header="Cookie:MySQL_S=u1ddsnr95sraoqjcu4og46ojrcapim37; MyGUID=59f3a5 ...

  7. VC调用Delphi DLL

    别的没什么,是一定可以调用成功的.但是意外的是,ShowMessage函数在DLL里也可以轻易被调用.此外,Delphi里的var 相当于VC里的引用,需要在函数原型里正确标识,否则传递普通变量甚至常 ...

  8. Django框架ORM常用字段汇总_模型层

    与数据类型相关的字段 CharField 作用:字符串字段, 用于较短的字符串. 参数:CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许 ...

  9. TCP/IP协议之ARP寻址

    ARP协议: 前面讲了网络层的寻址是通过IP地址来做的.其实一个数据包寻址包含两个部分:1 IP寻址.2 ARP寻址. ARP寻址是用在数据链路层上的.我们上网的电脑都有网卡.那么在数据链路层的进行传 ...

  10. 【linux】ubuntu16.04安装vncserver实现远程访问图形界面

    # 步骤 1 - 安装 X11VNC  sudo apt install x11vnc -y # 步骤 2 - 配置访问密码 sudo x11vnc -storepasswd /etc/x11vnc. ...