GVKun编程网logo

docker—— 三剑客之 Docker swarm(docker三剑客介绍)

6

最近很多小伙伴都在问docker——三剑客之Dockerswarm和docker三剑客介绍这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展35.dockerswarmdockerS

最近很多小伙伴都在问docker—— 三剑客之 Docker swarmdocker三剑客介绍这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展35. docker swarm dockerStack 部署 投票应用、CentOS 下 Docker 与.netcore (三)之 三剑客之一 Docker-Compose、CentOS 下 Docker 与.netcore (五)之 三剑客之一 Docker-swarm 集群、Docker Compose 和 Docker Swarm 和 Docker Service等相关知识,下面开始了哦!

本文目录一览:

docker—— 三剑客之 Docker swarm(docker三剑客介绍)

docker—— 三剑客之 Docker swarm(docker三剑客介绍)

Docker Swarm 是 Docker 官方的三剑客项目之一,提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案
使用它,用户可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平台。

Docker Swarm 是 Docker 公司推出的官方容器集群平台,基于 Go 语言实现。
目前,包括 Rackspace 在内的许多平台都采用了 Swarm,用户很容易在 AWS 等公有云平台使用 Swarm。

Swarm 的前身是 Beam 项目和 libswarm 项目,首个正式版本(Swarm V1)在 2014 年 12 初发布。
为了提高可扩展性,2016 年 2 月对架构进行重新设计,推出 V2 版本,支持超过 1000 个节点。
最新的 Docker Engine 已经集成了 Swarm Kit,加强了对 Swarm 的协调支持。

作为容器集群管理器,Swarm 最大的优势就是 100% 支持标准的 Docker API
各种基于标准 API 工具,如 Compose、docker.py,各种管理软件,甚至 Docker 本身都可以很容易地与 Swarm 集成。
这大大方便了用户将原先基于单节点地系统移植到 Swarm 上。
同时 Swarm 内置了对 Docker 网络插件地支持,用户可以很容易地部署跨主机地容器集群服务。

Swarm 是典型地 master-slave 结构,通过发现服务来选举 manager。manager 是中心管理节点,各个 node 上运行 agent 接受 manager 地统一管理。

在 v2 中,集群会自动通过 Raft 协议分布式选举 manager 节点,无需额外地发现服务地支持,避免了单节点瓶颈。
同时 v2 内置了基于 DNS 地负载均衡和外部负载均衡机制地集群支持。

一、构建集群

对于 Docker1.12 已经更新的版本,swarm 相关命令已经原生嵌入到了 Docker Engine 中,因此我们可以直接使用。
首先查看 docker swarm 的帮助信息:

[root@centos003 ~]# docker swarm --help

Usage:    docker swarm COMMAND

Manage Swarm

Commands:
  ca          Display and rotate the root CA
  init        初始化一个集群
  join        将swarm作为节点或者管理器加入集群
  join-token  管理连接令牌
  leave       退出集群
  unlock      解锁集群
  unlock-key  管理解锁密钥
  update      更新集群

使用''docker swarm COMMAND --help'' 来查看每个命令的详细信息

在构建集群之前首先应该保证的是每台机器(不论是虚拟机还是物理机)上面都已经安装 Docker Engine 并且已经启动,当然你可以使用 docker machine 来快速构建。

1. 初始化集群

为了更加清晰的使用 docker swarm init 进行初始化,我们首先依旧是查看帮助信息。

[root@centos003 ~]# docker swarm init --help

Usage:    docker swarm init [OPTIONS]

Initialize a swarm

Options:
      --advertise-addr string                  广播地址 (format: <ip|interface>[:port])
      --autolock                               启用管理器自动锁定(需要解锁密钥才能启动已停止的管理器)
      --availability string                    节点的可用性(“active”|“pause”|“drain”)(默认为“active”)
      --cert-expiry duration                   节点证书的有效期(ns | us | ms | s | m | h)(默认为2160h0m0s)
      --data-path-addr string                  用于数据路径流量的地址或接口(格式:<ip | interface>--default-addr-pool ipNetSlice           CIDR格式的默认地址池(默认为[])
      --default-addr-pool-mask-length uint32   uint32默认地址池子网掩码长度(默认为24--dispatcher-heartbeat duration          Dispatcher心跳周期(ns | us | ms | s | m | h)(默认为5s)
      --external-ca external-ca                一个或多个证书签名端点的规范
      --force-new-cluster                      从当前状态创建新集群
      --listen-addr node-addr                  监听地址(格式:<ip | interface> [:port])(默认为0.0.0.0:2377--max-snapshots uint                     uint要保留的其他Raft快照数
      --snapshot-interval uint                 uint Raft快照之间的日志条目数(默认10000--task-history-limit int                 int任务历史记录保留限制(默认值为5

需要说明的是节点可用性的三种状态:
  ・Active: 集群中该 Node 可以被指派 TASK;
  ・Pause: 集群中该 Node 不可以被指派新的 Task, 但是其它已经存在的 TASK 保持运行;
  ・Drain: 集群中该 Node 不可以被指派新的 Task,Swarm Scheduler 停掉已经存在的 Task;

下面具体代码:

[root@centos003 ~]# docker swarm init --advertise-addr 129.204.16.68
Swarm initialized: current node (vsxiq5bqs1htj12wv7jdths7m) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-0pnmvu8zc31j1fnl3qtb3xsakgdnraiuxvzw7zax4kiaw8mefy-dbk5n56wwa03gov4dwgsrqskp 129.204.16.68:2377

To add a manager to this swarm, run ''docker swarm join-token manager'' and follow the instructions.

上面–advertise-addr 选项指定 Manager Node 会 publish 它的地址为 192.168.1.107,后续 Worker Node 加入到该 Swarm 集群,必须要能够访问到 Manager 的该 IP 地址。
该结果中给出了后续操作引导信息,告诉我们如何将 Worker Node 加入 Swarm 集群中.

 

2. 加入节点

查看帮助信息:

[root@centos003 ~]# docker swarm join --help

Usage:    docker swarm join [OPTIONS] HOST:PORT

Join a swarm as a node and/or manager

Options:
      --advertise-addr string   广播地址(格式:<ip | interface> [:port])
      --availability string     节点的可用性(“active”|“pause”|“drain”)(默认为“active”)
      --data-path-addr string   用于数据路径流量的地址或接口(格式:<ip | interface>
      --listen-addr node-addr   监听地址(格式:<ip | interface> [:port])(默认为0.0.0.0:2377
      --token string            用于进入群体的令牌

加入 test 节点:

[root@test ~]# docker swarm join --token SWMTKN-1-0pnmvu8zc31j1fnl3qtb3xsakgdnraiuxvzw7zax4kiaw8mefydbk5n56wwa03gov4dwgsrqskp 129.204.16.68:2377
This node joined a swarm as a worker.

加入 test2 节点:

[root@test2 ~]# docker swarm join --token SWMTKN-1-0pnmvu8zc31j1fnl3qtb3xsakgdnraiuxvzw7zax4kiaw8mefydbk5n56wwa03gov4dwgsrqskp 129.204.16.68:2377
This node joined a swarm as a worker.

对于 token 后面的一长串字符是集群初始化的时候生成的令牌,每个想要加入这个集群的机器都需要拿着这个令牌才能加入到该集群.

可以通过 docker node 查看当前集群的所有节点:

[root@centos003 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
vsxiq5bqs1htj12wv7jdths7m *   centos003           Ready               Active              Leader              18.09.0
yjaslsxqfnvpq8zjvjpdabi7x     test                Ready               Active                                  18.09.0
poyqgaqkc1byucsa5q2rppck2     test2               Ready               Active                                  18.09.0

名词解释:
  ・ID:swarm 会为集群中的每台机器分配一个唯一 ID;
  ・HOSTNAME: 主机名
  ・STATUS: 当前状态
  ・AVAILABILITY: 节点的可用性
  ・MANAGER STATUS: 是否是管理节点
  ・ENGINE:Docker 的版本

 

二、节点管理

通过查看帮助信息可以知道节点的相关操作:

[root@centos003 ~]# docker node --help

Usage:    docker node COMMAND

Manage Swarm nodes

Commands:
  demote      将一个或多个管理节点降级
  inspect     显示一个或多个节点的详细信息
  ls          列出Swarm集群中的所有节点
  promote     将Swarm中的一个或多个节点升级为管理节点
  ps          列出一个或多个节点上运行的任务,默认为当前节点
  rm          从集群中删除一个或多个节点
  update      更新节点

运行 ''docker node COMMAND --help'' 命令可以查看更多节点的相关信息

Swarm 支持设置一组 Manager Node,通过支持多 Manager Node 实现 HA。
那么这些 Manager Node 之间的状态的一致性就非常重要了,多 Manager Node 的 Warm 集群架构,如下图所示(出自 Docker 官网):

通过上图可以看出,Swarm 使用了 Raft 协议来保证多个 Manager 之间状态的一致性.
基于 Faft 协议,Mananger Node 具有一定的容错功能,假设 Swarm 集群中有 N 个 Manager Node, 那么整个集群可以容忍最多 (N-1)/2 个节点失效,如果是一个三个 Manager Node 的 Swarm 集群,最多只能容忍一个 Manager Node 挂掉.

下面是对一些常规操作的解释:

1. 节点更新

查看帮助信息:

[root@centos003 ~]# docker node update --help

Usage:    docker node update [OPTIONS] NODE

Update a node

Options:
      --availability string   节点的可用性(“active”|“pause”|“drain”)
      --label-add list        添加或更新节点标签(key = value)
      --label-rm list         删除节点标签(如果存在)
      --role string           节点的角色(“worker”|“manager”)

 

(1) 修改节点的可用性

[root@centos003 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
vsxiq5bqs1htj12wv7jdths7m *   centos003           Ready               Active              Leader              18.09.0
yjaslsxqfnvpq8zjvjpdabi7x     test                Ready               Active                                  18.09.0
poyqgaqkc1byucsa5q2rppck2     test2               Ready               Active                                  18.09.0

将 test 可用性修改为 pasue, 返回主机名:

[root@centos003 ~]# docker node update --availability "pause" test
test

再次查看状态信息:

[root@centos003 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
vsxiq5bqs1htj12wv7jdths7m *   centos003           Ready               Active              Leader              18.09.0
yjaslsxqfnvpq8zjvjpdabi7x     test                Ready               Pause                                   18.09.0
poyqgaqkc1byucsa5q2rppck2     test2               Ready               Active                                  18.09.0

常见的变更操作:
  ・设置 Manager Node 只具有管理功能
  ・对服务进行停机维护,可以修改 AVAILABILITY 为 Drain 状态
  ・暂停一个 Node, 然后该 Node 就不再接收新的 Task
  ・回复一个不可用或暂停的 Node

(2) 标签操作

每个 Node 的主机配置情况可能不同,比如有的适合运行 CPU 密集型应用,有的适合运行 IO 密集型应用,
Swarm 支持给每个 Node 添加标签元数据,这样可以根据 Node 的标签,来选择性地调度某个服务部署到期望的一组 Node 上。

添加或者更新标签:

[root@centos003 ~]# docker node update --label-add author=kebi test
test

可以通过 docker node inspect 命令来查看标签信息

删除节点标签:

[root@centos003 ~]# docker node update --label-rm author test
test

(3) 角色操作

[root@centos003 ~]# docker node update --role "manager" test
test
[root@centos003 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
vsxiq5bqs1htj12wv7jdths7m *   centos003           Ready               Active              Leader              18.09.0
yjaslsxqfnvpq8zjvjpdabi7x     test                Ready               Pause               Reachable           18.09.0
poyqgaqkc1byucsa5q2rppck2     test2               Ready               Active                                  18.09.0

  

2. 提权 / 降权

Usage: docker node demote/promote NODE [NODE...]
目前集群的状态信息:

[root@centos003 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
vsxiq5bqs1htj12wv7jdths7m *   centos003           Ready               Active              Leader              18.09.0
yjaslsxqfnvpq8zjvjpdabi7x     test                Ready               Active                                  18.09.0
poyqgaqkc1byucsa5q2rppck2     test2               Ready               Active                                  18.09.0

将 test 升级为 manager 节点:


3. 查看节点任务

查看帮助信息:

查看帮助信息:
[root@centos003 ~]# docker node ps --help

Usage:    docker node ps [OPTIONS] [NODE...]

List tasks running on one or more nodes, defaults to current node

Options:
  -f, --filter filter   过滤输出
      --format string   使用Go模板打印任务
      --no-resolve      不将ID映射到名称
      --no-trunc        不截断输出
  -q, --quiet           仅显示任务ID

示例:

[root@centos003 ~]# docker node ps test
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
e78xw9zleb9n        myredis.3           redis:latest        test                Running             Running 26 minutes ago

 

4. 查看节点信息

查看帮助信息:

[root@centos003 ~]# docker node ls --help

Usage:    docker node ls [OPTIONS]

List nodes in the swarm

Aliases:
  ls, list

Options:
  -f, --filter filter   过滤输出
      --format string   使用Go模板打印任务
  -q, --quiet           仅显示任务ID

 

 

三、服务管理

在 Swarm 集群上部署服务,必须在 Manager Node 上进行操作。
先说明一下 Service、Task、Container(容器)这个三个概念的关系,如下图(出自 Docker 官网)非常清晰地描述了这个三个概念的含义:

在 Swarm mode 下使用 Docker,可以实现部署运行服务、服务扩容缩容、删除服务、滚动升级等功能。
Docker 服务的功能比较丰富,通过查看帮助信息可以很清楚的到它有那些操作。

[root@centos003 ~]# docker service --help

Usage:    docker service COMMAND

Manage services

Commands:
  create      创建一个新的服务
  inspect     显示一个或多个服务的详细信息
  logs        获取服务或任务的日志
  ls          列出服务
  ps          列出一个或多个服务的任务
  rm          删除一项或多项服务
  rollback    还原对服务配置的更改
  scale       缩放一个或多个复制的服务
  update      更新服务

Run ''docker service COMMAND --help'' for more information on a command.

下面是部分命令的讲解:


1. 创建服务

[root@centos003 ~]# docker service create --replicas 2 --name myredis redis
y36sco45lvt28zotx6m7owzh4
overall progress: 2 out of 2 tasks 
1/2: running   [==================================================>] 
2/2: running   [==================================================>] 
verify: Service converged 

可以通过 docker service ls 来查看已经创建的服务。

[root@centos003 ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
y36sco45lvt2        myredis             replicated          2/2                 redis:latest

 

2. 扩容服务

Docker Swarm 支持服务的扩容缩容,Swarm 通过 --mode
选项设置服务类型,提供了两种模式:
  一种是 replicated,我们可以指定服务 Task 的个数(也就是需要创建几个冗余副本),这也是 Swarm 默认使用的服务类型;
  另一种是 global,这样会在 Swarm 集群的每个 Node 上都创建一个服务。

格式:
  docker service scale 服务 ID = 服务 Task 总数

[root@centos003 ~]# docker service scale myredis=3
myredis scaled to 3
overall progress: 3 out of 3 tasks 
1/3: running   [==================================================>] 
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
verify: Service converged 

通过 docker service ps 可以查看各个副本的状况。

ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE                ERROR               PORTS
wxufrk2enzjo        myredis.1           redis:latest        test2               Running             Running 10 minutes ago                           
suhfn7azj6da        myredis.2           redis:latest        centos003           Running             Running 10 minutes ago                           
e78xw9zleb9n        myredis.3           redis:latest        test                Running             Running about a minute ago

 

35. docker swarm dockerStack 部署 投票应用

35. docker swarm dockerStack 部署 投票应用

1. 编写 docker-compose.yml

# docker-compose.yml

version: "3"

services:

 

  redis:

    image: redis:alpine

    ports:

      - "6379"

    networks:

      - frontend

    deploy:

      replicas: 2

      update_config:

        parallelism: 2

        delay: 10s

      restart_policy:

        condition: on-failure

 

  db:

    image: postgres:9.4

    volumes:

      - db-data:/var/lib/postgresql/data

    networks:

      - backend

    deploy:

      placement:

        constraints: [node.role == manager]

 

  vote:

    image: dockersamples/examplevotingapp_vote:before

    ports:

      - 5000:80

    networks:

      - frontend

    depends_on:

      - redis

    deploy:

      replicas: 2

      update_config:

        parallelism: 2

      restart_policy:

        condition: on-failure

 

  result:

    image: dockersamples/examplevotingapp_result:before

    ports:

      - 5001:80

    networks:

      - backend

    depends_on:

      - db

    deploy:

      replicas: 1

      update_config:

        parallelism: 2

        delay: 10s

      restart_policy:

        condition: on-failure

 

  worker:

    image: dockersamples/examplevotingapp_worker

    networks:

      - frontend

      - backend

    deploy:

      mode: replicated

      replicas: 1

      labels: [APP=VOTING]

      restart_policy:

        condition: on-failure

        delay: 10s

        max_attempts: 3

        window: 120s

      placement:

        constraints: [node.role == manager]

 

  visualizer:

    image: dockersamples/visualizer:stable

    ports:

      - "8080:8080"

    stop_grace_period: 1m30s

    volumes:

      - "/var/run/docker.sock:/var/run/docker.sock"

    deploy:

      placement:

        constraints: [node.role == manager]

 

networks:

  frontend:

  backend:

 

volumes:

  db-data:

 

2. 启动 service  并  查看 service 的状态

  docker stack deploy vote -c=docker-compose.yml

  docker stack ls

  docker stack services vote

  docker stack ps vote

3. 对 vote_vote service 进行拓展

  docker service stack scale vote_vote=3

 

4. 访问

  访问 192.168.205.10:5000  进行投票

  访问 192.168.205.10:5001  查看投票情况

    访问 192.168.205.10:8080  查看容器 部署情况

 

CentOS 下 Docker 与.netcore (三)之 三剑客之一 Docker-Compose

CentOS 下 Docker 与.netcore (三)之 三剑客之一 Docker-Compose

CentOS 下 Docker 与.netcore (一) 之 安装 

CentOS 下 Docker 与.netcore (二) 之 Dockerfile

CentOS 下 Docker 与.netcore (三)之 三剑客之一 Docker-Compose

CentOS 下 Docker 与.netcore (四)之 三剑客之一 Docker-machine+jenkins 简单自动化部署

CentOS 下 Docker 与.netcore (五)之 三剑客之一 Docker-swarm 集群 

1. 什么是 Docker-Compose

上一章我们讲了通过 Dockerfile 创建镜像,这在一个小项目中是没问题的,但如果在一个包含多个项目的情况下,我们每次部署都需要执行多次创建镜像与运行容器的命令,这样就比较麻烦,为了解决这种情况,Docker-Compose 出现了。Docker-Compose 主要就是为了解决在一台服务器创建镜像与运行容器复杂的问题,有了 Docker-Compose 我们就可以通过一条命令,生成多镜像与运行容器。

2.Docker-Compose 安装

sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

查看安装是否成功

3. 创建两个.netcore 项目,不启用 https

ServerProvider 项目

新增 Dockerfile

FROM microsoft/dotnet:2.1-aspnetcore-runtime
MAINTAINER yishi.chen

LABEL description="this is a serverprovider website"
LABEL version="1.0"

ARG serverport

WORKDIR /app
COPY bin/Release/netcoreapp2.1/publish/ .
EXPOSE $serverport
ENTRYPOINT ["dotnet","ServerProvider.dll"]

Program.cs 改动

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseUrls($"http://*:{Environment.GetEnvironmentVariable("serverport")}")
                .UseStartup<Startup>();

ValuesController.cs 改动

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

namespace ServerProvider.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        // GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            return new string[] { "this is serverprovider''s result" };
        }

    }
}

ServerConsumer 项目

新增 Dockerfile

FROM microsoft/dotnet:2.1-aspnetcore-runtime
MAINTAINER yishi.chen

LABEL description="this is a serverconsumer website"
LABEL version="1.0"

ARG consumerport

WORKDIR /app
COPY bin/Release/netcoreapp2.1/publish/ .
EXPOSE $consumerport
ENTRYPOINT ["dotnet","ServerComsumer.dll"]

Program.cs 改动

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseUrls($"http://*:{Environment.GetEnvironmentVariable("consumerport")}")
                .UseStartup<Startup>();

ValueController.cs 改动

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

namespace ServerComsumer.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        // GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/values/5
        [HttpGet("{id}")]
        public async Task<ActionResult<string>> Get(int id)
        {
            var httpClient = new HttpClient();
            httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            return await httpClient.GetAsync(Environment.GetEnvironmentVariable("serverurl")).Result.Content.ReadAsStringAsync();
        }
    }
}

新建 docker-compose.yml 编排文件

内容如下(docker-compose 的配置请见 https://www.cnblogs.com/chenyishi/p/9965479.html):

version: ''3''
services:
  s_provider:
    build:
      context: ./ServerProvider/
      dockerfile: Dockerfile
      args:
        serverport: 1000
    ports:
      - "1000:1000"
    environment:
      serverport: 1000
    container_name: c_provider
  s_consumer:
    build:
      context: ./ServerComsumer/
      dockerfile: Dockerfile
      args:
        consumerport: 2000
    ports:
      - "2000:2000"
    links:
      - s_provider:s_provider
    environment:
      consumerport: 2000
      serverurl: http://s_provider:1000/api/values/
    container_name: c_consumer

 4. 定位到 docker-compose 文件所在目录,运行 docker-compose

[root@cys-test-centos WebDocker]# docker-compose up

运行成功,状态如下:

5. 另起一个命令窗口,测试接口

[root@cys-test-centos ~]# curl http://localhost:1000/api/values
["this is serverprovider''s result"]
root@cys-test-centos ~]# curl http://localhost:2000/api/values
["value1","value2"]
[root@cys-test-centos ~]# curl http://localhost:2000/api/values/1
["this is serverprovider''s result"]

以上是通过 docker-compose 新建镜像,并运行容器,如果镜像已存在,则可以去掉构建的过程,我们稍微对 docker-compose 文件做一下调整

6. 在上面步骤的前提下,先 CtrlC 停止容器,然后 docker-compsoe down 删除容器

[root@cys-test-centos WebDocker]# docker-compose down
Removing c_consumer ... done
Removing c_provider ... done
Removing network webdocker_default

7. 查看生成的镜像

[root@cys-test-centos WebDocker]# docker images
REPOSITORY             TAG                      IMAGE ID            CREATED             SIZE
webdocker_s_consumer   latest                   cc95654856e1        17 minutes ago      253MB
webdocker_s_provider   latest                   5b744758b56b        17 minutes ago      253MB
microsoft/dotnet       2.1-aspnetcore-runtime   db366d73508b        4 days ago          253MB

镜像名为:webdocker_s_provider 与 webdocker_s_consumer

8. 修改 docker-compose.yml 文件

version: ''3''
services:
  s_provider:
    image: webdocker_s_provider
    ports:
      - "1000:1000"
    environment:
      serverport: 1000
    container_name: c_provider
  s_consumer:
    image: webdocker_s_consumer
    ports:
      - "2000:2000"
    links:
      - s_provider:s_provider
    environment:
      consumerport: 2000
      serverurl: http://s_provider:1000/api/values/
    container_name: c_consumer

9. 验证接口

[root@cys-test-centos ~]# curl http://localhost:2000/api/values/1
["this is serverprovider''s result"]

 

到此 Docker-Compose 介绍完毕,下一章讲 Docker 三剑客之 Docker-machine

CentOS 下 Docker 与.netcore (五)之 三剑客之一 Docker-swarm 集群

CentOS 下 Docker 与.netcore (五)之 三剑客之一 Docker-swarm 集群

 CentOS 下 Docker 与.netcore (一) 之 安装

CentOS 下 Docker 与.netcore (二) 之 Dockerfile

CentOS 下 Docker 与.netcore (三)之 三剑客之一 Docker-Compose

CentOS 下 Docker 与.netcore (四)之 三剑客之一 Docker-machine+jenkins 简单自动化部署

CentOS 下 Docker 与.netcore (五)之 三剑客之一 Docker-swarm 集群

1. 什么是 docker-swarm

在公司网站流量爆发式增长的时候,一台服务器往往不能满足需求,之前我的解决办法是通过 nginx 来实现负载均衡,有了 docker-machine 之后,解决方案会更加简单。当流量增加时,我们按照需要往 docker-swarm 集群中添加主机就可以了。

2. 原理

我们把一组 docker-swarm 集群中的所有 docker 容器统称作一个 service,其中的每一个 docker 容器称做一个 task,如下图

3. 开始搭建环境

上一章我们讲了 docker-machine,在这里我们需要用到。我在我本地 Hyper-v 创建 4 个虚拟机

其中:

CentOS 设置静态 IP:  192.168.8.200,并在这个虚机上搭建好 docker-machine

CentOS2 设置静态 IP:192.168.8.201

CentOS3 设置静态 IP:192.168.8.202

CentOS3 设置静态 IP:192.168.8.203

然后通过 200 节点,分别在 201,202,203 上搭建好 docker

4. 创建集群(swarm 命令)

 1)docker-mashine  ssh 到 host1 上创建 leader

[root@localhost ~]# docker-machine ssh host1
[root@host1 ~]# docker swarm init --advertise-addr 192.168.8.201

2)docker-mashine  ssh 到 host2 加入集群

[root@localhost ~]# docker-machine ssh host2

3)docker-mashine  ssh 到 host1 上查看集群列表

到此,集群构建完毕,是一个最简单的集群

5. 新建.netcore 项目

 1)修改 ValueController.cs
// GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            var ip = HttpContext.Connection.LocalIpAddress;
            var port = HttpContext.Connection.LocalPort;
            return new string[] { ip.ToString(), port.ToString() }; }
2)修改 Program.cs
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args).UseUrls("http://*:5000")
                .UseStartup<Startup>();
3)新建 dockerfile,并经属性设置为:始终复制到输出目录

FROM microsoft/dotnet:2.1-aspnetcore-runtime
MAINTAINER yishi.chen

LABEL description="DockerSwarmTest"
LABEL version="1.0"


WORKDIR /app
COPY . .
EXPOSE 5000
ENTRYPOINT ["dotnet","DockerSwarmTest.dll"]

4)构建 image 并上传到 docker-hub

5)创建 service

我们先只创建一个容器

测试接口

6)添加一个容器
[root@host1 ~]# docker service update --replicas 2 cys_web

查看运行状态

两个都已经启动

6. 模拟并发请求接口

新建一个控制台程序

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

namespace Client { class Program { static HttpClient httpClient = new HttpClient(); static void Main(string[] args) { Parallel.For(1, 10000, i => { HttpResponseMessage response = httpClient.SendAsync(new HttpRequestMessage { Method = new HttpMethod("GET"), RequestUri = new Uri("http://192.168.8.202:5000/api/values") }).Result; var result = response.Content.ReadAsStringAsync().Result; Console.WriteLine(result); }); } } }

运行测试,结果如下:

我们发现,请求 http://192.168.8.202:5000/api/values 时,是对 service 中的两个容器实现轮询调用的,因此,docker swarm 很简单的实现了负载,我们可以再把 host3 加进集群里,再测试一下有三个容器的情况的结果。

[root@host1 ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
b6qt1dnbj4hnf2jks0rnxjm8y *   host1               Ready               Active              Leader              18.09.0
p9vfq9qt6dtv929an5hzmirn9     host2               Ready               Active                                  18.09.0
uy37l58v2ooux2tju89ex1o7q     host3               Ready               Active                                  18.09.0

运行控制台测试

三台机器完成负载!!

 

至此三剑客分享完毕

Docker Compose 和 Docker Swarm 和 Docker Service

Docker Compose 和 Docker Swarm 和 Docker Service

Docker Compose

介绍

通过yml文件配置,高效管理多个docker,启停

中文文档

https://www.jb51.cc/manual/view/36129.html

安装

# 慢
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 国内镜像
$ sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

授权文件

$ sudo chmod +x /usr/local/bin/docker-compose

测试

$ docker-compose --version
docker-compose version 1.27.4, build 1110ad01

卸载

sudo rm /usr/local/bin/docker-compose

测试使用(官方给的)

1创建文件夹

$ mkdir composetest
$ cd composetest

2写测试程序Python。app.py

import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

3创建py文件依赖文件requirements.txt

flask
redis

4创建Dockerfile文件

FROM python:3.7-alpine
workdir /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
copY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
copY . .
CMD ["flask", "run"]

5创建docker-compose.yml

# version: "3.9" 需要版本对应
version: "3"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

6使用Compose构建并运行应用程序

docker-compose up
# 后台运行
# docker-compose up -d

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-87feppxX-1608950922543)(C:\Users\admin\AppData\Local\Temp\1608866566146.png)]

  1. docker images 自动下载依赖镜像
  2. 默认服务名: 文件名 _ 服务名 _ num(集群副本数量)
  3. 创建docker compose自己默认网络,并将所有启动的容器添加到网络中
  4. 在同一网络下可以直接使用域名访问

停止

# 前端运行使用 ctrl + c 停止
# 后台运行使用
docker-compose stop

yml文件规则

version: "3" # docker-compose核心版本
services: # 服务
	fw: # 服务名称
		image: redis # 服务配置
		ports: # 服务配置2
      		- "5000:5000"
      	depends_on: # 依赖(启动顺序)
      		- fw2
      		- redis
      	..... # 容器启动的所有配置
	fw2: 
		image: # 服务配置

官方文档 https://docs.docker.com/compose/compose-file/compose-file-v2/

测试开源程序(官方给的)

创建工作文件夹 my_wordpress/

创建docker-compose.yml

version: '3.3'

services:
   db:
     image: MysqL:5.7
     volumes:
       - db_data:/var/lib/MysqL
     restart: always
     environment:
       MysqL_ROOT_PASSWORD: somewordpress
       MysqL_DATABASE: wordpress
       MysqL_USER: wordpress
       MysqL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       wordpress_DB_HOST: db:3306
       wordpress_DB_USER: wordpress
       wordpress_DB_PASSWORD: wordpress
       wordpress_DB_NAME: wordpress
volumes:
    db_data: {}

后台运行

docker-compose up -d

Docker Swarm

  • 集群
  • 必须有两个或两个以上主节点才能运行

Swarm mode cluster

[root@centos3 ~]# docker swarm --help

Usage:  docker swarm COMMAND

Manage Swarm

Commands:
  ca          管理根CA
  init        初始化集群
  join        加入集群
  join-token  创建加入令牌
  leave       离开集群
  unlock      解锁群
  unlock-key  管理解锁密钥
  update      更新集群

Run 'docker swarm COMMAND --help' for more information on a command.

1初始化一个集群

docker swarm init [OPTIONS]
名字,简写默认描述
–advertise-addr通告地址(格式:<ip | interface>:端口)
–autolock启用管理器自动锁定(需要解锁密钥才能启动停止的管理器)
–availabilityactive节点的可用性(“活动”|“暂停”|“漏”)
–cert-expiry2160h0m0s节点证书的有效期(ns | us | ms | s | m | h)
–data-path-addr用于数据路径流量的地址或接口(格式:<ip | interface>)
–dispatcher-heartbeat5S调度员心跳周期(ns | us | ms | s | m | h)
–external-ca一个或多个证书签名端点的规格
–force-new-cluster强制从当前状态创建一个新的群集
–listen-addr0.0.0.0:2377监听地址(格式:<ip | interface>:端口)
–max-snapshots0要保留的附加木筏快照的数量
–snapshot-interval10000Raft快照之间的日志条目数
–task-history-limit5任务历史保留限制
# 初始化集群
docker swarm init --advertise-addr 192.168.0.191

2加入一个节点

docker swarm join [OPTIONS] HOST:PORT
名字,简写默认描述
–advertise-addr通告地址(格式:<ip | interface>:端口)
–availabilityactive节点的可用性(“活动”|“暂停”|“漏”)
–data-path-addr用于数据路径流量的地址或接口(格式:<ip | interface>)
–listen-addr0.0.0.0:2377监听地址(格式:<ip | interface>:端口)
–token进入群的令牌
# 例如加入一个节点
# 令牌SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2
docker swarm join --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2 192.168.0.191:2377

3获取令牌

docker swarm join-token [OPTIONS] (worker|manager)
# 工作令牌
docker swarm join-token worker
# 管理令牌
docker swarm join-token manager

查看节点

# 查看节点
docker node

Docker Service

docker service COMMAND
命令描述
docker service create创建一项新服务
docker service inspect显示一项或多项服务的详细信息
docker service logs获取服务或任务的日志
docker service ls列出服务
docker service ps列出一项或多项服务的任务
docker service rm删除一项或多项服务
docker service scale扩展一个或多个复制服务
docker service update更新服务

1创建服务

docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
名字,简写默认描述
–config指定配置以暴露给服务
–constraint展示位置限制
–container-label容器标签
–credential-spec托管服务帐户的凭证规范(仅限Windows)
–detach,-d真正立即退出,而不是等待服务收敛
–dns设置自定义DNS服务器
–dns-option设置DNS选项
–dns-search设置自定义DNS搜索域
–endpoint-mode要人端点模式(vip或dnsrr)
–entrypoint覆盖图像的默认入口点
–env,-e设置环境变量
–env-file读入环境变量文件
–group为容器设置一个或多个补充用户组
–health-cmd运行以检查运行状况的命令
–health-interval运行检查之间的时间(ms | s | m | h)
–health-retries0需要报告不健康的连续失败
–health-start-period在重新计数到不稳定(ms | s | m | h)之前,容器初始化的开始时间段
–health-timeout允许一次检查运行的最长时间(ms | s | m | h)
–host设置一个或多个自定义主机到IP映射(主机:IP)
–hostname容器主机名
–label, -l服务标签
–limit-cpu限制cpu
–limit-memory0限制记忆
–log-driver记录驱动程序的服务
–log-OPT记录驱动程序选项
–mode复制服务模式(复制或全局)
–mount将文件系统挂载附加到服务
–name服务名称
–network网络附件
–no-healthcheck禁用任何容器指定的HEALTHCHECK
–no-resolve-image不要查询注册表来解析图像摘要和支持的平台
–placement-PREF添加展示位置首选项
–publish,-p将端口发布为节点端口
–quiet,-q抑制进度输出
–read-only将容器的根文件系统挂载为只读
–replicas任务数量
–reserve-cpu预留cpu
–reserve-memory0保留内存
–restart-condition满足条件时重新启动(“none”|“on-failure”|“any”)(默认为“any”)
–restart-delay重启尝试之间的延迟(ns | us | ms | s | m | h)(默认5秒)
–restart-max-attempts放弃前的最大重启次数
–restart-window用于评估重新启动策略的窗口(ns | us | ms | s | m | h)
–rollback-delay0任务回滚之间的延迟(ns | us | ms | s | m | h)(默认值为0)
–rollback-failure-action回滚失败的操作(“暂停”|“继续”)(默认“暂停”)
–rollback-max-failure-ratio0在回滚期间容忍的失败率(默认0)
–rollback-monitor0(ns | us | ms | s | m | h)(默认5秒)每个任务回滚之后的持续时间
–rollback-order回滚顺序(“start-first”|“stop-first”)(默认“stop-first”)
–rollback-parallelism1同时回滚的任务的最大数量(0一次全部回滚)
–secret指定泄露给服务的秘密
–stop-grace-period强制杀死一个容器之前等待的时间(ns | us | ms | s | m | h)(默认10秒)
–stop-signal停止容器的信号
–tty, -t分配一个伪TTY
–update-delay0更新之间的延迟(ns | us | ms | s | m | h)(默认为0)
–update-failure-action更新失败的操作(“暂停”|“继续”|“回滚”)(默认“暂停”)
–update-max-failure-ratio0更新期间容许的失败率(默认0)
–update-monitor0(ns | us | ms | s | m | h)(默认5秒)每个任务更新后的持续时间
–update-order更新顺序(“start-first”|“stop-first”)(默认为“stop-first”)
–update-parallelism1同时更新的最大任务数(0个一次全部更新)
–user,-u用户名或UID(格式:<名称| uid>:<组| gid>)
–with-registry-auth向注册代理发送注册表认证详细信息
–workdir,-w容器内的工作目录
# 例如,启动一个Nginx服务,暴露8080端口
docker service create -p 8080:80 --name Nginx01 Nginx
# docker run 容器启动,单机版本
# docker service 服务启动,支持扩缩容器
# 查看服务
docker service ps Nginx01
# 查看副本
docker service ls
# 查看详情
docker service inspect Nginx01

2更新服务

docker service update [OPTIONS] SERVICE
名字,简写默认描述
–args服务命令参数
–config-add添加或更新服务上的配置文件
–config-RM删除配置文件
–constraint-add添加或更新展示位置约束
–constraint-RM删除约束
–container-label-add添加或更新容器标签
–container-label-rm用钥匙取出容器标签
–credential-spec托管服务帐户的凭证规范(仅限Windows)
–detach,-d立即退出,而不是等待服务收敛
–dns-add添加或更新自定义DNS服务器
–dns-option-add添加或更新DNS选项
–dns-option-rm删除一个DNS选项
–dns-rm删除自定义的DNS服务器
–dns-search-add添加或更新自定义DNS搜索域
–dns-search-rm删除一个DNS搜索域
–endpoint-mode端点模式(vip或dnsrr)
–entrypoint覆盖图像的默认入口点
–env-add添加或更新环境变量
–env-RM删除一个环境变量
–force即使没有更改需要,也强制更新
–group-add向容器添加一个附加的补充用户组
–group-RM从容器中删除先前添加的补充用户组
–health-cmd运行以检查运行状况的命令
–health-interval运行检查之间的时间(ms | s | m | h)
–health-retries0需要报告不健康的连续失败
–health-retries在重新计数到不稳定(ms | s | m | h)之前,容器初始化的开始时间段
–health-timeout允许一次检查运行的最长时间(ms | s | m | h)
–host加添加或更新自定义主机到IP映射(主机:IP)
–host-RM删除自定义的主机到IP映射(主机:IP)
–hostname容器主机名
–image服务图片标签
–label-add添加或更新服务标签
–label-RM用钥匙去除标签
–limit-cpu限制cpu
–limit-memory0限制记忆
–log-driver记录驱动程序的服务
–log-OPT记录驱动程序选项
–mount-add添加或更新服务上的装载
–mount-RM通过目标路径移除一个安装
–network加添加一个网络
–network-RM删除网络
–no-healthcheck禁用任何容器指定的HEALTHCHECK
–no-resolve-image不要查询注册表来解析图像摘要和支持的平台
–placement-PREF-ADD添加展示位置首选项
–placement-PREF-RM删除展示位置偏好设置
–publish相加添加或更新已发布的端口
–publish-RM通过目标端口删除发布的端口
–quiet,-q抑制进度输出
–read-only将容器的根文件系统挂载为只读
–replicas任务数量
–reserve-cpu预留cpu
–reserve-memory0保留内存
–restart-condition条件满足时重新启动(“none”|“on-failure”|“any”)
–restart-delay重启尝试之间的延迟(ns | us | ms | s | m | h)
–restart-max-attempts放弃前的最大重启次数
–restart-window用于评估重新启动策略的窗口(ns | us | ms | s | m | h)
–rollback回退到先前的规范
–rollback-delay0任务回滚之间的延迟(ns | us | ms | s | m | h)
–rollback-failure-action回滚失败的操作(“暂停”|“继续”)
–rollback-max-failure-ratio0在回滚期间容忍的失败率
–rollback-monitor0每个任务回滚后监视失败的持续时间(ns | us | ms | s | m | h)
–rollback-order回滚顺序(“start-first”|“stop-first”)
–rollback-parallelism0同时回滚的任务的最大数量(0一次全部回滚)
–secret-add添加或更新服务的秘密
–secret-RM去掉一个秘密
–stop-grace-period强制杀死一个容器之前的等待时间(ns | us | ms | s | m | h)
–stop-signal停止容器的信号
–tty, -t分配一个伪TTY
–update-delay0更新之间的延迟(ns | us | ms | s | m | h)
–update-failure-action更新失败的操作(“暂停”|“继续”|“回滚”)
–update-max-failure-ratio0更新期间容错的失败率
–update-monitor0(ns | us | ms | s | m | h)每个任务更新后的持续时间
–update-order更新顺序(“start-first”|“stop-first”)
–update-parallelism0同时更新的最大任务数(0个一次全部更新)
–user,-u用户名或UID(格式:<名称| uid>:<组| gid>)
–with-registry-auth向注册代理发送注册表认证详细信息
–workdir,-w容器内的工作目录
# 为 Nginx01 创建 10 个副本
docker service update --replicas 10 Nginx01 
# 或 使用 scale 命令
docker service scale Nginx01=10

移除服务

docker service rm Nginx01

今天的关于docker—— 三剑客之 Docker swarmdocker三剑客介绍的分享已经结束,谢谢您的关注,如果想了解更多关于35. docker swarm dockerStack 部署 投票应用、CentOS 下 Docker 与.netcore (三)之 三剑客之一 Docker-Compose、CentOS 下 Docker 与.netcore (五)之 三剑客之一 Docker-swarm 集群、Docker Compose 和 Docker Swarm 和 Docker Service的相关知识,请在本站进行查询。

本文标签: