前言

在前面的文章中,已经介绍如何在本地通过Docker Machine 创建虚拟Docker 主机,以及也可以在本地Windows 创建虚拟主机,也是可以使用的。这一节,我们将继续学习 Docker 三剑客之一 : Docker Swarm

Docker Swarm

Docker Swarm 是Docker 的本地聚集类,它将一组Docker 主机转换为一个虚拟单独的 Docker 主机。Docker Swarm 使用标准的Docker API。所以与Docker 守护进程交互的工具都可以使用 Swarm 对多个主机进行转换扩展。 包括有:

  • Docker Componse
  • Docker Machine
  • Dokku

Docker Swarm 支持即插即用原则,随着初始开发的结束,API 开发起来支持可插后端。 这意味着您可以交换调度后端 Docker Swarm 使用的开箱即用与后端您喜欢。 Swarm 的可切换设计为大多数用例提供了一个平滑的开箱体验。

安装 Docker Swarm

我们可以通过官方Docker Swarm 的镜像来创建一个集群,因为Docker Swarm 其实也是一个 Docker images

docker run swarm --help


$ docker run swarm --help
Unable to find image 'swarm:latest' locally
latest: Pulling from library/swarm
d85c18077b82: Pull complete 1e6bb16f8cb1: Pull complete 85bac13497d7: Pull complete Digest: sha256:b866583a3b8791bcd705b7bc0fd94c66b695a1a2dbaeb5f59ed29940e5015dc8
Status: Downloaded newer image for swarm:latest
Usage: swarm [OPTIONS] COMMAND [arg...] A Docker-native clustering system Version: 1.2.9 (527a849) Options:
--debug debug mode [$DEBUG]
--log-level, -l "info" Log level (options: debug, info, warn, error, fatal, panic)
--experimental enable experimental features
--help, -h show help
--version, -v print the version Commands:
create, c Create a cluster
list, l List nodes in a cluster
manage, m Manage a docker cluster
join, j Join a docker cluster
help Shows a list of commands or help for one command Run 'swarm COMMAND --help' for more information on a command.

因为是第一次使用镜像,所以Docker Engine 会检查当前环境是否有这个镜像,没有则拉取了最新的版本到本地。

使用Docker Swarm 镜像的好处

相比于其他方法,使用Swarm 镜像的好处在于

  • 不需要额外再系统上安装任何二进制执行文件来使用 Swarm
  • 可以通过docker engine 获取到最新版本
  • 容器与Swarm 环境隔离。不需要单独维护

创建具有交互式容器的集群

集群,需要创建一个管理节点和工作节点。这里测试创建一个管理节点,在管理节点加入两个工作节点,这就组成一集群。

创建管理节点

docker-machine ls 查看现有虚拟主机


$ docker-machine.exe ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default * virtualbox Running tcp://192.168.99.102:2376 v19.03.5

发现已经有一个虚拟主机在运行,其实可以将这个主机作为管理主机

通过 SSH 连接管理节点,在第一个虚拟机 创建管理节点

docker-machine ssh default 连接虚拟主机,开启Swarm


docker@default:~$ docker swarm init --advertise-addr 192.168.99.102
Swarm initialized: current node (5mohlisxbrkogfbtzk6nujkfw) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-4k26snh9hpamnpdpyk4qqogeolf6ing4u6e35jkjpwx83v9xcp-f2rhw7i7p9p0jeesvwb81xb9i 192.168.99.102:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

docker swarm init --advertise-addr 192.168.99.102

这里需要指定一个地址,因为虚拟机,通过ip address 可发现这个虚拟机有多个网卡,所以,我们需要指定一个地址。

创建主节点后,可以获取到一个 Token 这个token 呢 就是我们需要创建 服务节点所需要用到的。

docker swarm join --token SWMTKN-1-4k26snh9hpamnpdpyk4qqogeolf6ing4u6e35jkjpwx83v9xcp-f2rhw7i7p9p0jeesvwb81xb9i 192.168.99.102:2377

执行 docker info 后我们可以发现,当前Swarm 已经是活动的状态,管理节点 1


Swarm: active
NodeID: rzu7l3z4mysplwgdce8vj2364
Is Manager: true
ClusterID: uuq50bc4x4bckqfglkrj05vao
Managers: 1
Nodes: 1
Default Address Pool: 10.0.0.0/8

docker node ls 可以查看当前节点信息


docker@default:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
5mohlisxbrkogfbtzk6nujkfw * default Ready Active Leader 19.03.5

创建工作节点

docker-machine create work1 创建一个默认的VirtualBox VM 的虚拟主机。

docker-machine ssh work1 连接虚拟主机后,将本节点加入管理节点

docker@work1:~$ docker swarm join --token SWMTKN-1-4k26snh9hpamnpdpyk4qqogeolf6ing4u6e35jkjpwx83v9xcp-f2rhw7i7p9p0jeesvwb81xb9i 192.168.99.102:2377
This node joined a swarm as a worker.

同样的,再创建一个work2 节点,加入到default 当中。

管理节点信息

当前主机上,我们可以查看到所有的虚拟主机情况。

$ docker-machine.exe ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default * virtualbox Running tcp://192.168.99.102:2376 v19.03.5
work1 - virtualbox Running tcp://192.168.99.103:2376 v19.03.5
work2 - virtualbox Running tcp://192.168.99.104:2376 v19.03.5

进入管理主机,查看节点的情况。

docker@default:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
5mohlisxbrkogfbtzk6nujkfw * default Ready Active Leader 19.03.5
qqgd4abpjw08lwh31ddgez041 work1 Ready Active 19.03.5
gblxw2whlxl0k94nmfozhs7gl work2 Ready Active 19.03.5

服务和任务关系

  • 服务是一组任务的集合,一个服务可以有多个任务。
  • 任务是集群里面最小的一个单位,比如ping www.baidu.com

部署集群服务

docker-machine ssh default 连接管理主机


docker@default:~$ docker pull alpine
Using default tag: latest
latest: Pulling from library/alpine
c9b1b535fdd9: Pull complete Digest: sha256:ab00606a42621fb68f2ed6ad3c88be54397f981a7b70a79db3d1172b11c4367d
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

拉取一个 alpine linux 镜像

Alpine 操作系统是一个面向安全的轻型 Linux 发行版。它不同于通常 Linux 发行版,Alpine 采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗

部署任务

docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]

docker service create --replicas 1  --name hello-world alpine ping www.baidu.com
  • --replicas 指定任务的数量
  • --name 指定服务的名称
  • alpine 需要运行的镜像名称
  • ping www.baidu.com 镜像里面需要运行的命令

docker@default:~$ docker service create --replicas 1 --name hello-world alpine ping www.baidu.com
nzr66u3j32ndgzodw08cer1he
overall progress: 1 out of 1 tasks 1/1: running[==================================================>] verify: Service converged

常用命令

docker service ps <name> 查看服务的运行状态、以及进展

docker@default:~$ docker service ps hello-world
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
j03uhnoauhet hello-world.1 alpine:latest default Running Running 8 minutes ago

docker service ls 查看当前Swarm 集群所运行的所有任务

docker@default:~$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
nzr66u3j32nd hello-world replicated 1/1 alpine:latest

监控服务

docker service inspect --pretty hello-world 命令可以概览服务的运行情况。


ID: nzr66u3j32ndgzodw08cer1he
Name: hello-world
Service Mode: Replicated
Replicas: 1
Placement:
UpdateConfig:
Parallelism: 1
On failure: pause
Monitoring Period: 5s
Max failure ratio: 0
Update order: stop-first
RollbackConfig:
Parallelism: 1
On failure: pause
Monitoring Period: 5s
Max failure ratio: 0
Rollback order: stop-first
ContainerSpec:
Image: alpine:latest@sha256:ab00606a42621fb68f2ed6ad3c88be54397f981a7b70a79db3d1172b11c4367d
Args: ping www.baidu.com
Init: false
Resources:
Endpoint Mode: vip

弹性伸缩

docker service update --replicas 2 hello-world 将原来的服务任务数量改为2次

docker@default:~$ docker service update --replicas 2 hello-world
hello-world
overall progress: 2 out of 2 tasks 1/2: running [==================================================>] 2/2: running [==================================================>] verify: Service converged

docker service ps <name> 查看本次任务的运行情况

docker@default:~$ docker service ps hello-world
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
j03uhnoauhet hello-world.1 alpine:latest default Running Running 26 minutes ago
k6oudbv4e9he hello-world.2 alpine:latest work1 Running Running about a minute ago

这里将这两个任务分配到 default work1 节点

查看 work1 节点运行情况

### 进入work1
docker-machine ssh work1 docker@work1:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c86154f43f4 alpine:latest "ping www.baidu.com" 4 minutes ago Up 4 minutes hello-world.2.k6oudbv4e9henfqbhvulxt1y2

从集群退出

docker swarm leave 执行退出命令后,该节点已下线。

docker@default:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
5mohlisxbrkogfbtzk6nujkfw * default Ready Active Leader 19.03.5
qqgd4abpjw08lwh31ddgez041 work1 Down Active 19.03.5
gblxw2whlxl0k94nmfozhs7gl work2 Ready Active 19.03.5

参考

https://www.cnblogs.com/ityouknow/p/8903975.html

DOCKER 学习笔记8 Docker Swarm 集群搭建的更多相关文章

  1. Docker Swarm Mode 学习笔记(创建 Swarm 集群)

    Swarm 集群由管理节点与工作节点组成. 初始化集群 使用命令:docker swarm init 如果你的 Docker 主机有多个网卡, 拥有多个 IP 地址, 必须使用 --advertise ...

  2. 基于zookeeper的Swarm集群搭建

    简介 Swarm:docker原生的集群管理工具,将一组docker主机作为一个虚拟的docker主机来管理. 对客户端而言,Swarm集群就像是另一台普通的docker主机. Swarm集群中的每台 ...

  3. Docker系列之swarm集群搭建

    学习Docker很久了,今天分享一下Docker的swarm集群的搭建过程很简单 首先第一步是 每台机器上面都要安装docker 本人使用的是centos7操作系统,使用3太虚拟机,3太虚拟机必须网络 ...

  4. Docker swarm集群搭建教程

    一.什么是Swarm Swarm这个项目名称特别贴切.在Wiki的解释中,Swarm behavior是指动物的群集行为.比如我们常见的蜂群,鱼群,秋天往南飞的雁群都可以称作Swarm behavio ...

  5. 分享:docker swarm集群搭建

    [Y_H]实践原创 三台虚拟机:1台centOS , 2台ubuntu.   网上有用docker-machine创建虚拟机做的例子.   这里直接用VMware创建这三台虚拟机,然后用xshell连 ...

  6. docker swarm集群搭建以及使用滚动更新

    基础环境,三台虚拟机 172.17.3.70 172.17.3.71 172.17.3.72 系统配置:centos 7,关闭selinux 需要优化的基础配置: [root@sw1 ~]# vim ...

  7. docker swarm集群搭建及使用Portainer、shipyard

    一.规划 1.swarm01作为manager节点,swarm02和swarm03作为worker节点. # cat /etc/hosts 127.0.0.1   localhost 192.168. ...

  8. DOCKER 学习笔记7 Docker Machine 在阿里云实例化ECS 以及本地Windows 实例化虚拟机实战

    前言 通过以上6小节的学习,已经可以使用DOCKER 熟练的部署应用程序了.大家都可以发现使用 DOCKER 带来的方便之处,因为现在的话,只是在一台服务器上部署,这样部署,我们只需要一条命令,需要的 ...

  9. DOCKER 学习笔记7 Docker Machine 建立虚拟机实战,以及错误总结

    前言 通过以上6小节的学习,已经可以使用DOCKER 熟练的部署应用程序了.大家都可以发现使用 DOCKER 带来的方便之处,因为现在的话,只是在一台服务器上部署,这样部署,我们只需要一条命令,需要的 ...

随机推荐

  1. JVM性能优化系列-(1) Java内存区域

    1. Java内存区域 1.1 运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.主要包括:程序计数器.虚拟机栈.本地方法栈.Java堆.方法区(运 ...

  2. 基于 HTML5 + WebGL 的 3D 风力发电场

    前言    风能是一种开发中的洁净能源,它取之不尽.用之不竭.当然,建风力发电场首先应考虑气象条件和社会自然条件.近年来,我国海上和陆上风电发展迅猛.海水.陆地为我们的风力发电提供了很好地质保障.正是 ...

  3. Docker系列-第七篇Docker构建SpringBoot应用

    1.基于Dockerfile构建SpringBoot镜像 1.1准备工作 将SpringBoot项目通过maven打成jar包 mvn clean package #使用maven打包项目 1.2使用 ...

  4. MQ使用:apollo和rabbitmq

    apollo apollo 是一个更快.更可靠.更容易维护的消息代理,它是由最初的ActiveMQ的基础构建的.它使用一个完全不同的线程和消息调度架构来实现这一点.与ActiveMQ一样,apollo ...

  5. html包含html文件的方法

    我们在写asp页面的时候,常常使用include命令来包含公共文件.由于这个方法用起来非常方便,于是很多人在HTML页面里尝试使用include,但是发现根本就不起作用.这是因为,include是VB ...

  6. ORM _meta

    import os if __name__ == '__main__': os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'XadminDemon.se ...

  7. java中implements和extends的区别

    1,extends是继承某个类的,可以使用某个类的方法,也可以重写父类的方法. 2,implements是用于实现类接口,可以实现一个或多个类的接口,接口的方法一般为空的,所以必须重写这一个或多个的方 ...

  8. [LOJ#2743][DP]「JOI Open 2016」摩天大楼

    题目传送门 DP 经典题 考虑从小到大把数加入排列内 如下图(\(A\) 已经经过排序): 我们考虑如上,在 \(i\) ( \(A_i\) )不断增大的过程中,维护上面直线 \(y=A_i\) 之下 ...

  9. NOI2.5 4980:拯救行动

    描述 公主被恶人抓走,被关押在牢房的某个地方.牢房用N*M (N, M <= 200)的矩阵来表示.矩阵中的每项可以代表道路(@).墙壁(#).和守卫(x).  英勇的骑士(r)决定孤身一人去拯 ...

  10. ios--->ios沙盒总结

    ios沙盒总结 沙盒介绍 iOS应用程序只能在该程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等 ...