管理swarm(7) – swarm实践 – 查看服务详细信息

本文介绍如何查看运行在swarm中的服务的详情。
1.登录manager1机器。
2.运行docker service inspect –pretty 以便于阅读的格式显示服务的详细信息。
查看helloworld服务的详细信息:

  1. $ docker service inspect –pretty helloworld
  2.  
  3. ID:     9uk4639qpg7npwf3fn2aasksr
  4. Name:       helloworld
  5. Mode:       REPLICATED
  6.  Replicas:      1
  7. Placement:
  8. UpdateConfig:
  9.  Parallelism:   1
  10. ContainerSpec:
  11.  Image:     alpine
  12.  Args:  ping docker.com

要以json格式返回服务详细信息的,不带–pretty参数执行相同的命令。

  1. $ docker service inspect helloworld
  2. [
  3. {
  4.     "ID": "9uk4639qpg7npwf3fn2aasksr",
  5.     "Version": {
  6.         "Index": 418
  7.     },
  8.     "CreatedAt": "2016-06-16T21:57:11.622222327Z",
  9.     "UpdatedAt": "2016-06-16T21:57:11.622222327Z",
  10.     "Spec": {
  11.         "Name": "helloworld",
  12.         "TaskTemplate": {
  13.             "ContainerSpec": {
  14.                 "Image": "alpine",
  15.                 "Args": [
  16.                     "ping",
  17.                     "docker.com"
  18.                 ]
  19.             },
  20.             "Resources": {
  21.                 "Limits": {},
  22.                 "Reservations": {}
  23.             },
  24.             "RestartPolicy": {
  25.                 "Condition": "any",
  26.                 "MaxAttempts": 0
  27.             },
  28.             "Placement": {}
  29.         },
  30.         "Mode": {
  31.             "Replicated": {
  32.                 "Replicas": 1
  33.             }
  34.         },
  35.         "UpdateConfig": {
  36.             "Parallelism": 1
  37.         },
  38.         "EndpointSpec": {
  39.             "Mode": "vip"
  40.         }
  41.     },
  42.     "Endpoint": {
  43.         "Spec": {}
  44.     }
  45. }
  46. ]

3.执行docker service ps 来查看哪个节点运行这个服务:
$ docker service ps helloworld

  1. ID                         NAME          SERVICE     IMAGE   LAST STATE         DESIRED STATE  NODE
  2. 8p1vev3fq5zm0mi8g0as41w35  helloworld.1  helloworld  alpine  Running 3 minutes  Running        worker2

在这个例子中,worker2节点运行着helloworld服务。不过你可能会看到服务运行在管理节点上。默认下,swarm中的管理节点能像worker节点一样执行任务。
4.在运行这个服务的节点上执行docker ps来查看运行任务的容器。

  1. $docker ps
  2.  
  3. CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
  4. e609dde94e47        alpine:latest       "ping docker.com"   3 minutes ago       Up 3 minutes                            helloworld.1.8p1vev3fq5zm0mi8g0as41w35

提高在国内安装Docker和拉取镜像的速度

最近在测试docker的各种功能,发现由于国内连接Docker相关服务的网速非常的慢,甚至是无法联通,体验非常的差。要想在国内使用docker,需要设置两步来提高使用体验。
下面以Ubuntu 14.04为例进行设置。

更换docker apt源

安装docker也异常的慢,我们把docker的apt源更换为daocloud的。

  1. echo ‘deb [arch=amd64] https://get.daocloud.io/docker/apt-repo ubuntu-trusty main’ > /etc/apt/sources.list.d/docker.list
  2. apt-get update
  3. apt-get install docker-engine

更换docker register mirror

首先到https://www.daocloud.io/注册一个帐号(注册帐号居然要手机。。。),然后申请docker加速器。
比如申请到的地址为http://xxx.m.daocloud.io
打开/etc/default/docker,添加如下行:

  1. DOCKER_OPTS="$DOCKER_OPTS –registry-mirror=http://xxx.m.daocloud.io"

然后重启docker。
这里感谢daocloud为我们提高加速服务。

管理swarm(6) – swarm实践 – 部署服务

本文尝试在swarm中部署一个服务。
1.登录到manager1机器。
2.执行如下命令来部署服务:

  1. $ docker service create –replicas 1 –name helloworld alpine ping docker.com
  2.  
  3. 9uk4639qpg7npwf3fn2aasksr
  • docker service create命令创建服务
  • –name参数设置服务名称
  • –replicas 1指定运行一个实例
  • alpine ping docker.com参数定义alpine容器运行ping docker.com命令的服务
  • 3.执行docker service ls查看运行中的服务列表:

    1. $ docker service ls
    2.  
    3. ID            NAME        SCALE  IMAGE   COMMAND
    4. 9uk4639qpg7n  helloworld  1/1    alpine  ping docker.com

    管理swarm(5) – swarm实践 – 添加节点到swarm

    一旦你创建好带一个管理节点的swarm后,你就可以往swarm添加worker节点了。
    1.登录worker1机器。
    2.运行由前文创建swarm输出的把worker节点加入到swarm的命令:

    1. $ docker swarm join
    2.   –token  SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c
    3.   192.168.99.100:2377
    4.  
    5. This node joined a swarm as a worker.

    如果你找不到之前添加节点的命令了,可以执行如下命令来查询:

    1. $ docker swarm join-token worker
    2.  
    3. To add a worker to this swarm, run the following command:
    4.  
    5.     docker swarm join
    6.     –token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c
    7.     192.168.99.100:2377

    3.登录worker2机器。
    4.执行与第2步相同的命令把worker2添加到swarm中:

    1. $ docker swarm join
    2.   –token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c
    3.   192.168.99.100:2377
    4.  
    5. This node joined a swarm as a worker.

    5.登录manage1机器,执行docker node ls命令来查询worker节点:

    1. ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
    2. 03g1y59jwfg7cf99w4lt0f662    worker2   Ready   Active
    3. 9j68exjopxe7wfl6yuxml7a7j    worker1   Ready   Active
    4. dxn1zf6l61qsb1josjja83ngz *  manager1  Ready   Active        Leader

    管理swarm(4) – swarm实践 – 创建一个swarm

    完成上一篇文章的环境准备后,我们准备演示如何创建一个swarm。确保你主机的Docker Engine daemon运行状态。
    1.登录manager1机器
    2.运行如下命令来创建一个新的swarm:

    1. docker swarm init –advertise-addr <MANAGER-IP>

    在本实践我们在manager1来创建一个swarm:

    1. $ docker swarm init –advertise-addr 192.168.99.100
    2. Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
    3.  
    4. To add a worker to this swarm, run the following command:
    5.  
    6.     docker swarm join
    7.     –token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c
    8.     192.168.99.100:2377
    9.  
    10. To add a manager to this swarm, run ‘docker swarm join-token manager’ and follow the instructions.

    –advertise-addr参数配置管理节点发布它的IP地址192.168.99.100。其它的节点必须能通过此IP来连接管理节点。
    上面命令的输出包含了加入新节点到swarm的命令。节点将作为manager或worker加入,具体取决于–token标志的值。
    3.运行docker info来查看目前swarm的状态:

    1. $ docker info
    2.  
    3. Containers: 2
    4. Running: 0
    5. Paused: 0
    6. Stopped: 2
    7.   …snip…
    8. Swarm: active
    9.   NodeID: dxn1zf6l61qsb1josjja83ngz
    10.   Is Manager: true
    11.   Managers: 1
    12.   Nodes: 1
    13.   …snip…

    4.执行docker node ls命令来查看节点的相关信息:

    1. $ docker node ls
    2.  
    3. ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
    4. dxn1zf6l61qsb1josjja83ngz *  manager1  Ready   Active        Leader

    管理swarm(3) – swarm实践 – 环境准备

    在我们开始试验swarm的功能时,先来搭建所需的环境。

    三个联网的主机

    swarm实践我们使用三台联网的主机来作为swarm的节点。这三台主机可以是你PC,数据中心或云服务提供商的三台虚拟机。本实践使用如下机器名:

  • manager1
  • worker1
  • worker2
  • Docker Engine 1.12或更高版本

    本实践需要每台主机的Docker Engine的版本为1.12或更高版本。
    在每台运行的主机上安装Docker Engine并验证其版本。你可以按照如下方法来获取最新版本的Docker Engine。

    在Linux主机安装Docker Engine

    如果你正在使用的是基于Linux系统的物理主机或者云提供商的主机,可以按照官方提供的Linux安装说明来安装最新版本的Docker Engine。

    在Mac或Windows主机安装Docker Engine

    或者,在一台Mac安装Docker或在一台Windows安装Docker。你可以在这台机器上测试单节点和多节点的swarm,不过你需要使用Docker Machine来测试多节点的swarm。

  • 你可以使用Docker for Mac或Docker for Windows测试swarm模式单节点的功能,包括初始化单节点的swarm,创建服务和缩放服务。
  • 目前你不能单独使用Docker for Mac或Docker for Windows测试多节点的swarm。不过你可以使用Docker Machine来创建swarm节点。
  • 管理器机器的IP地址

    必须为管理器主机的可用网卡分配一个IP地址。所有的swarm节点必须能够通过这个IP地址与管理器主机连接。
    由于其它节点通过这个IP地址与管理器节点通信,所以你应该使用固定的IP地址。
    你可以在Linux或macOS在使用ifconfig命令来查看可用的网卡列表。
    如果你用的是Docker Machine,你可以通过docker-machine ls或docker-machine ip 命令来获取管理器主机的IP。例如docker-machine ip manager1.
    本实践使用manager1 IP为192.168.99.100。

    主机间开放的端口

    主机间必须开放如下端口:

  • TCP端口2377 – 用于集群管理通信
  • TCP和UDP端口7946 – 用于各节点之间的通信
  • TCP和UDP端口4789 – 覆盖网络流量
  • 管理swarm(2) – swarm模式关键概念

    本文介绍Docker Engine 1.12的集群管理和编排功能唯一的一些概念。

    Swarm

    使用Swarmkit嵌入Docker Engine中的集群管理和编排功能。Docker Engine参与到集群时是运行在swarm模式下。你可以通过初始化一个swarm或加入一个已存在的swarm来激活Docker Engine进入swarm模式。
    一个swarm是用来部署服务的Docker Engine集群。Docker Engine CLI包括了管理swarm的命令,例如增加和删除节点。CLI也包括你部署服务到swarm和管理服务编排的命令。
    当你在swarm模式外运行Docker Engine,你执行的是容器命令。当你以swarm模式运行Engine,你执行的是编排服务的命令。

    节点

    一个节点是Docker Engine参与到swarm中的一个实例。
    为了部署你的应用到swarm,你需要提交一个服务定义到管理器节点。管理器节点将称为任务的工作单元分派给worker节点。
    管理器节点也完成编排和集群管理功能以维护swarm的期望状态。管理器节点选择单个领导节点来执行编排任务。
    Worker节点接收和执行来自管理器节点分派的任务。默认下管理器节点也是worker节点,不过你可以配置管理器节点为只管理节点。
    agent将其分配的任务的当前状态通知给管理器节点,使得管理器能够维护期望的状态。

    服务和任务

    一个服务是在worker节点执行任务的定义。它是swarm系统的中心结构和用户与swarm交互的主要根源。
    创建服务时,你可以指定要使用的容器映像以及在运行容器中执行的命令。在复制服务模型中,swarm管理器根据你在期望状态中设置的比例在节点之间分发特定数量的副本任务。对于全局服务,swarm在集群中每个可用节点上为该服务运行一个任务。一个任务携带一个Docker容器和在容器内运行的命令。它是swarm的原子调度单位。管理器节点根据服务规模中设置的副本数量将任务分配给worker节点。一旦一个任务分配给一个节点,它就不能移动到其它节点了。它只能在分配的节点上运行。

    负载均衡

    swarm管理器在入口使用负载均衡来连接你的服务。swarm管理器可以自动为服务分配一个PublishedPort或者你为服务配置一个PublishedPort。你可以指定任意可用的端口。如果你不指定,swarm管理器会在30000-32767范围为你的服务分配一个端口。外部组件(如云负载均衡器)可以访问集群中任何节点的PublishedPort上的服务,无论该节点当前是否正在运行任务。Swarm模式有一个内部DNS组件,它自动为每个服务分配一个DNS名称。swarm管理器使用内部负载均衡器,根据服务的DNS名称在集群内的服务之间分配请求。

    管理swarm(1) – swarm模式概述

    要Docker Engine在swarm模式下使用,需要从https://github.com/docker/docker/releases安装Docker Engine v1.12.0或更高的版本。或者安装最新版本的Docker for Mac或Docker for Windows Beta。
    Docker Engine 1.12引入了本地管理Docker Engines集群的swarm模式,称为swarm。使用Docker CLI创建一个swarm,部署应用服务到swarm和管理swarm行为。

    主要功能

  • 集群管理与Docker Engine集成:使用Docker Engine CLI来创建一个你能部署应用服务到Docker Engine的swarm。你不需要其他编排软件来创建或管理swarm。
  • 分散式设计:Docker Engine不是在部署时处理节点角色之间的差异,而是在运行时扮演自己角色。你可以使用Docker Engine部署两种类型的节点,管理器和worker。这意味着你可以从单个磁盘映像构建整个swarm。
  • 声明性服务模型: Docker Engine使用声明性方法来定义应用程序堆栈中各种服务的所需状态。例如,你可以描述由消息队列服务和数据库后端的Web前端服务组成的应用程序。
  • 伸缩性:对于每个服务,你可以声明要运行的任务数。当你向上或向下缩放时,swarm管理器通过添加或删除任务来自动适应,以保持所需状态。
  • 期望的状态协调:swarm管理器节点持续监控群集状态,并调整你描述的期望状态与实际状态之间的任何差异。 例如,如果设置运行一个10个副本容器的服务,这时worker机器托管其中的两个副本崩溃,管理器则将创建两个新副本以替换已崩溃的副本。 swarm管理器将新副本分配给正在运行和可用的worker。
  • 多主机网络:你可以为服务指定覆盖网络(overlay network)。 当swarm管理器初始化或更新应用程序时,它会自动为容器在覆盖网络(overlay network)上分配地址。
  • 服务发现:Swarm管理器节点为swarm中的每个服务分配唯一的DNS名称,并负载平衡运行中的容器。 你可以通过嵌入在swarm中的DNS服务器查询在swarm中运行中的每个容器。
  • 负载平衡:你可以将服务的端口暴露给外部的负载均衡器。 在内部,swarm允许你指定如何在节点之间分发服务容器。
  • 安全通信:swarm中的每个节点强制执行TLS相互验证和加密,以保护其自身与所有其他节点之间的通信。 你可以选择使用自签名根证书或来自自定义根CA的证书。
  • 滚动更新:在上线新功能期间,你可以增量地应用服务更新到节点。 swarm管理器允许你控制将服务部署到不同节点集之间的延迟。 如果出现任何问题,你可以将任务回滚到服务的先前版本。
  • Docker实践(28) – 直接运行容器内的命令

    在docker早期,许多用户添加SSH server到它们的镜像里,以便他们能通过外部的shell来访问容器。这样做的话相当于把容器当作虚拟机用了,添加了一个进程无疑增加了系统的开销。于是Docker引入了exec命令,提供了不需要安装ssh server直接在容器内执行命令的方法。下面我们介绍这个命令。

    问题

    你想在一个运行的容器内执行命令。

    解决方法

    使用docker exec命令。

    讨论

    为了演示exec命令,我们先在后台启动一个容器,名称为sleeper,仅执行一个sleep命令。

    1. docker run -d –name sleeper debian sleep infinity

    现在我们启动了一个容器,你可以在上面使用docker exec命令完成各种试验。exec命令有三种模式,如下:

  • 基本模式 – 在命令行中同步运行容器中的命令
  • 后台模式 – 后台执行容器中的命令
  • 交互模式 – 执行一个命令,允许用户与之交互
  • 首先我们学习基本模式。下面的命令在容器sleeper内执行一个echo命令:

    1. $ docker exec sleeper echo "hello host from container"
    2. hello host from container

    有没有注意到这个命令的结构与docker run命令类似,只是我们给的ID是正式运行容器的ID而不是镜像ID。运行的echo命令是容器内的命令,不是主机上的。
    后台模式是在后台运行命令,在你的终端不会看到输出。这个模式通常用于执行花费比较长的任务,并且不关心它的输出,如清除日志文件:

    1. $ docker exec -d sleeper find / -ctime 7 -name ‘*log’ -exec rm {} ;

    最后是交互模式。通常用来执行一个shell,然后与之交互:

    1. $ docker exec -i -t sleeper /bin/bash
    2. root@d46dc042480f:/#

    Docker实践(27) – 使用UI For Docker Web界面管理Docker

    一般情况下我们使用docker自带的cli来管理docker,如镜像及容器等。除了通过cli来管理docker,docker来提供了完整的API来管理各种组件,这就方便开发者来开发各种方便的工具来管理docker,比如通过浏览器的web界面。目前docker web界面开发得较好的是https://github.com/kevana/ui-for-docker。

    问题

    你想通过其它更简便的方式来管理docker,而不是用cli。

    解决方法

    使用ui-for-docker。

    讨论

    ui-for-docker项目托管在github上,地址为https://github.com/kevana/ui-for-docker。安装非常简单,就一个命令:

    1. docker run -d -p 9000:9000 –privileged -v /var/run/docker.sock:/var/run/docker.sock uifd/ui-for-docker

    完成后你就可以打开浏览器输入http://[你的主机IP]:9000来打开docker web管理界面了,如图:
    虚拟化技术

    虚拟化技术

    虚拟化技术
    虚拟化技术
    通过ui-for-docker,你可以对容器,容器网络,镜像,主机网络,Volumes进行管理。