最近很多小伙伴都在问docker——三剑客之Dockerswarm和docker三剑客介绍这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展35.dockerswarmdockerS
最近很多小伙伴都在问docker—— 三剑客之 Docker swarm和docker三剑客介绍这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展35. docker swarm dockerStack 部署 投票应用、CentOS 下 Docker 与.netcore (三)之 三剑客之一 Docker-Compose、CentOS 下 Docker 与.netcore (五)之 三剑客之一 Docker-swarm 集群、Docker Compose 和 Docker Swarm 和 Docker Service等相关知识,下面开始了哦!
本文目录一览:- docker—— 三剑客之 Docker swarm(docker三剑客介绍)
- 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 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 部署 投票应用
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 (一) 之 安装
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 (一) 之 安装
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
介绍
通过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)]
- docker images 自动下载依赖镜像
- 默认服务名: 文件名 _ 服务名 _ num(集群副本数量)
- 创建docker compose自己默认网络,并将所有启动的容器添加到网络中
- 在同一网络下可以直接使用域名访问
停止
# 前端运行使用 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
- 集群
- 必须有两个或两个以上主节点才能运行
[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 | 假 | 启用管理器自动锁定(需要解锁密钥才能启动停止的管理器) |
–availability | active | 节点的可用性(“活动”|“暂停”|“漏”) |
–cert-expiry | 2160h0m0s | 节点证书的有效期(ns | us | ms | s | m | h) |
–data-path-addr | 用于数据路径流量的地址或接口(格式:<ip | interface>) | |
–dispatcher-heartbeat | 5S | 调度员心跳周期(ns | us | ms | s | m | h) |
–external-ca | 一个或多个证书签名端点的规格 | |
–force-new-cluster | 假 | 强制从当前状态创建一个新的群集 |
–listen-addr | 0.0.0.0:2377 | 监听地址(格式:<ip | interface>:端口) |
–max-snapshots | 0 | 要保留的附加木筏快照的数量 |
–snapshot-interval | 10000 | Raft快照之间的日志条目数 |
–task-history-limit | 5 | 任务历史保留限制 |
# 初始化集群
docker swarm init --advertise-addr 192.168.0.191
2加入一个节点
docker swarm join [OPTIONS] HOST:PORT
名字,简写 | 默认 | 描述 |
---|---|---|
–advertise-addr | 通告地址(格式:<ip | interface>:端口) | |
–availability | active | 节点的可用性(“活动”|“暂停”|“漏”) |
–data-path-addr | 用于数据路径流量的地址或接口(格式:<ip | interface>) | |
–listen-addr | 0.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-retries | 0 | 需要报告不健康的连续失败 |
–health-start-period | 在重新计数到不稳定(ms | s | m | h)之前,容器初始化的开始时间段 | |
–health-timeout | 允许一次检查运行的最长时间(ms | s | m | h) | |
–host | 设置一个或多个自定义主机到IP映射(主机:IP) | |
–hostname | 容器主机名 | |
–label, -l | 服务标签 | |
–limit-cpu | 限制cpu | |
–limit-memory | 0 | 限制记忆 |
–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-memory | 0 | 保留内存 |
–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-delay | 0 | 任务回滚之间的延迟(ns | us | ms | s | m | h)(默认值为0) |
–rollback-failure-action | 回滚失败的操作(“暂停”|“继续”)(默认“暂停”) | |
–rollback-max-failure-ratio | 0 | 在回滚期间容忍的失败率(默认0) |
–rollback-monitor | 0 | (ns | us | ms | s | m | h)(默认5秒)每个任务回滚之后的持续时间 |
–rollback-order | 回滚顺序(“start-first”|“stop-first”)(默认“stop-first”) | |
–rollback-parallelism | 1 | 同时回滚的任务的最大数量(0一次全部回滚) |
–secret | 指定泄露给服务的秘密 | |
–stop-grace-period | 强制杀死一个容器之前等待的时间(ns | us | ms | s | m | h)(默认10秒) | |
–stop-signal | 停止容器的信号 | |
–tty, -t | 假 | 分配一个伪TTY |
–update-delay | 0 | 更新之间的延迟(ns | us | ms | s | m | h)(默认为0) |
–update-failure-action | 更新失败的操作(“暂停”|“继续”|“回滚”)(默认“暂停”) | |
–update-max-failure-ratio | 0 | 更新期间容许的失败率(默认0) |
–update-monitor | 0 | (ns | us | ms | s | m | h)(默认5秒)每个任务更新后的持续时间 |
–update-order | 更新顺序(“start-first”|“stop-first”)(默认为“stop-first”) | |
–update-parallelism | 1 | 同时更新的最大任务数(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-retries | 0 | 需要报告不健康的连续失败 |
–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-memory | 0 | 限制记忆 |
–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-memory | 0 | 保留内存 |
–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-delay | 0 | 任务回滚之间的延迟(ns | us | ms | s | m | h) |
–rollback-failure-action | 回滚失败的操作(“暂停”|“继续”) | |
–rollback-max-failure-ratio | 0 | 在回滚期间容忍的失败率 |
–rollback-monitor | 0 | 每个任务回滚后监视失败的持续时间(ns | us | ms | s | m | h) |
–rollback-order | 回滚顺序(“start-first”|“stop-first”) | |
–rollback-parallelism | 0 | 同时回滚的任务的最大数量(0一次全部回滚) |
–secret-add | 添加或更新服务的秘密 | |
–secret-RM | 去掉一个秘密 | |
–stop-grace-period | 强制杀死一个容器之前的等待时间(ns | us | ms | s | m | h) | |
–stop-signal | 停止容器的信号 | |
–tty, -t | 假 | 分配一个伪TTY |
–update-delay | 0 | 更新之间的延迟(ns | us | ms | s | m | h) |
–update-failure-action | 更新失败的操作(“暂停”|“继续”|“回滚”) | |
–update-max-failure-ratio | 0 | 更新期间容错的失败率 |
–update-monitor | 0 | (ns | us | ms | s | m | h)每个任务更新后的持续时间 |
–update-order | 更新顺序(“start-first”|“stop-first”) | |
–update-parallelism | 0 | 同时更新的最大任务数(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 swarm和docker三剑客介绍的分享已经结束,谢谢您的关注,如果想了解更多关于35. docker swarm dockerStack 部署 投票应用、CentOS 下 Docker 与.netcore (三)之 三剑客之一 Docker-Compose、CentOS 下 Docker 与.netcore (五)之 三剑客之一 Docker-swarm 集群、Docker Compose 和 Docker Swarm 和 Docker Service的相关知识,请在本站进行查询。
本文标签: