Docker Machine
Docker Machine 是一种在虚拟主机上安装 Docker 的工具,并可以使用 docker-machine 命令来管理主机。Docker Machine 也可以集中管理所有的 docker 主机,比如快速的给 100 台服务器安装上 docker。
Docker Swarm简介
Swarm 是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源。Swarm 和 Kubernetes 比较类似,但是更加轻,具有的功能也较 kubernetes 更少一些。
从集群角度来说,一个 Swarm 由一个或多个 Docker 节点组成。这些节点可以是物理服务器、虚拟机、树莓派(Raspberry Pi)或云实例。唯一的前提就是要求所有节点通过可靠的网络相连。Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。
Docker Swarm部署
①机器环境(三台机器,centos系统)
IP:192.168.31.43 主机名:manager43 担任角色:swarm manager
IP:192.168.31.188 主机名:node188 担任角色:swarm node
IP:192.168.31.139 主机名:node139 担任角色:swarm node
②准备工作
1) 修改主机名
# 192.168.31.43 主机上执行
[root@manager43 ~]# hostnamectl set-hostname manager43
# 192.168.31.188 主机上执行
[root@node188 ~]# hostnamectl set-hostname node188
# 192.168.31.139 主机上执行
[root@node139 ~]# hostnamectl set-hostname node139
2)配置hosts文件(可配置可不配置)
[root@manager43 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.31.43 manager43
192.168.31.188 node188
192.168.31.139 node139
# 使用scp复制到node主机
[root@manager43 ~]# scp /etc/hosts root@192.168.31.188:/etc/hosts
[root@manager43 ~]# scp /etc/hosts root@192.168.31.139:/etc/hosts
3) 设置防火墙
关闭三台机器上的防火墙。如果开启防火墙,则需要在所有节点的防火墙上依次放行2377/tcp(管理端口)、7946/udp(节点间通信端口)、4789/udp(overlay 网络端口)端口。
[root@manager43 ~]# systemctl disable firewalld.service
[root@manager43 ~]# systemctl stop firewalld.service
4) 安装docker并配置加速器(在三台主机都要安装哟...)
[root@manager43 ~]# yum -y install docker
[root@node188 ~]# yum -y install docker
[root@node139 ~]# yum -y install docker
③创建Swarm并添加节点
1) 创建Swarm集群
[root@manager43 ~]# docker swarm init --advertise-addr 192.168.31.43
Swarm initialized: current node (z2n633mty5py7u9wyl423qnq0) is now a manager.
To add a worker to this swarm, run the following command:
# 这就是添加节点的方式(要保存初始化后token,因为在节点加入时要使用token作为通讯的密钥)
docker swarm join --token SWMTKN-1-2lefzq18zohy9yr1vskutf1sfb2a590xz9d0mjj2m15zu9eprw-2938j5f50t35ycut0vbj2sx0s 192.168.31.43:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
上面命令执行后,该机器自动加入到swarm集群。这个会创建一个集群token,获取全球唯一的 token,作为集群唯一标识。后续将其他节点加入集群都会用到这个token值。
其中,--advertise-addr参数表示其它swarm中的worker节点使用此ip地址与manager联系。命令的输出包含了其它节点如何加入集群的命令。
2) 查看集群的相关信息
[root@manager43 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
3jcmnzjh0e99ipgshk1ykuovd * manager43 Ready Active Leader 18.06.0-ce
上面的命令是查看集群中的机器(注意上面node ID旁边那个*号表示现在连接到这个节点上)
3) 添加节点主机到Swarm集群
上面我们在创建Swarm集群的时候就已经给出了添加节点的方法
# 192.168.31.188 主机上执行
[root@node188 ~]# docker swarm join --token SWMTKN-1-2lefzq18zohy9yr1vskutf1sfb2a590xz9d0mjj2m15zu9eprw-2938j5f50t35ycut0vbj2sx0s 192.168.31.43:2377
This node joined a swarm as a worker.
# 192.168.31.139 主机上执行
[root@node139 ~]# docker swarm join --token SWMTKN-1-2lefzq18zohy9yr1vskutf1sfb2a590xz9d0mjj2m15zu9eprw-2938j5f50t35ycut0vbj2sx0s 192.168.31.43:2377
This node joined a swarm as a worker.
在manager43主机上我们可以看一下集群中的机器及状态
[root@manager43 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
3jcmnzjh0e99ipgshk1ykuovd * manager43 Ready Active Leader 18.06.0-ce
vww7ue2xprzg46bjx7afo4h04 node139 Ready Active 18.06.1-ce
c5klw5ns4adcvumzgiv66xpyj node188 Ready Active 18.06.1-ce
更改节点的availablity状态
swarm集群中node的availability状态可以为 active或者drain,其中:
active状态:node可以接受来自manager节点的任务分派;
drain状态:node节点会结束task,且不再接受来自manager节点的任务分派(也就是下线节点)
[root@manager43 ~]# docker node update --availability drain node139
# 将node139节点下线(已分配的任务会转移到其他node)。如果要删除node139节点,命令是"docker node rm --force node139"
[root@manager43 ~]# docker node update --availability active node139 #再次修改为active状态(将下线的节点再次上线)
swarm中部署services相关指令官网
docker service create #Create a new service
docker service inspect #Display detailed information on one or more services
docker service logs #Fetch the logs of a service or task
docker service ls #List services
docker service ps #List the tasks of one or more services
docker service rm #Remove one or more services
docker service rollback #Revert changes to a service’s configuration
docker service scale # [动态扩容或者缩容:增减容器数量](https://www.cnblogs.com/zhujingzhi/p/9792432.html#_label6)
docker service update #Update a service
多服务Swarm集群部署
结合compose和swarm进行多服务的编排
【单机实践】部署的服务有三个(nginx服务,visualizer服务,portainer服务) 都是集群 GUI 管理服务。docker service部署的是单个服务,使用docker stack进行多服务编排部署
docker-compose.yml
version: '3.8'
services:
nginx:
image: nginx
ports:
- 8888:80
deploy:
mode: replicated
replicas: 3
visualizer:
image: dockersamples/visualizer
ports:
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
replicas: 1
placement:
constraints: [node.role == manager]
portainer:
image: portainer/portainer
ports:
- "9000:9000"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
replicas: 1
placement:
constraints: [node.role == manager]
docker stack deploy -c docker-compose.yml deploy_deamon
Docker Swarm 容器网络
在Docker版本1.12之后swarm模式原生支持覆盖网络(overlay networks),可以先创建一个覆盖网络,然后启动容器的时候启用这个覆盖网络,
这样只要是这个覆盖网络内的容器,不管在不在同一个宿主机上都能相互通信。
swarm模式的覆盖网络包括以下功能:
1)可以附加多个服务到同一个网络。
2)默认情况下,service discovery为每个swarm服务分配一个虚拟IP地址(vip)和DNS名称,使得在同一个网络中容器之间可以使用服务名称为互相连接。
3)可以配置使用DNS轮循而不使用VIP
4)为了可以使用swarm的覆盖网络,在启用swarm模式之间你需要在swarm节点之间开放以下端口:
5)TCP/UDP端口7946 – 用于容器网络发现
6)UDP端口4789 – 用于容器覆盖网络
步骤:
①创建overlay网络
docker network create --driver overlay --opt encrypted --subnet 10.10.19.0/24 ngx_net
# –-opt encrypted 默认情况下swarm中的节点通信是加密的。在不同节点的容器之间,可选的–opt encrypted参数能在它们的vxlan流量启用附加的加密层。
# --subnet 命令行参数指定overlay网络使用的子网网段。当不指定一个子网时,swarm管理器自动选择一个子网并分配给网络。
②将服务连接到overlay网络
docker service create --replicas 5 --network ngx_net --name my-test -p 80:80 nginx