多主机
在没有多个物理主机的情况下我们可以使用 docker-machine 启动多态虚拟主机(参考 Docker Machine 的安装和使用)。
启动主管理节点
在管理节点启动 Swarm 集群:
$ docker-machine ssh m0
$ docker swarm init --advertise-addr 192.168.56.102
Swarm initialized: current node (w3mcx5az7hle83x54myigl8ej) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-16os6vw7xyxsru81wdq46dh33e1ypbgvikaxiqxivngyq7wkfz-0d77s470esvona8tvedyy66uw 192.168.56.102:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
这里我们是将虚拟机 m0 作为了主管理节点。我们还可以将宿主机添加为管理节点:
# 在 m0 执行
$ $ docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-16os6vw7xyxsru81wdq46dh33e1ypbgvikaxiqxivngyq7wkfz-44j3lbw94vmhzjwr8g65opuoi 192.168.56.102:2377
# 在宿主机执行
$ docker swarm join --token SWMTKN-1-16os6vw7xyxsru81wdq46dh33e1ypbgvikaxiqxivngyq7wkfz-44j3lbw94vmhzjwr8g65opuoi 192.168.56.102:2377
This node joined a swarm as a manager.
检查集群信息:
$ docker info
...
Swarm: active
NodeID: emjyva9udrhuet3eof6f57mvu
Is Manager: true
ClusterID: ec1rip1hudoepr4g8tvhi7zne
Managers: 2
Nodes: 5
Default Address Pool: 10.0.0.0/8
SubnetSize: 24
Data Path Port: 4789
Orchestration:
Task History Retention Limit: 5
Raft:
Snapshot Interval: 10000
Number of Old Snapshots to Retain: 0
Heartbeat Tick: 1
Election Tick: 10
Dispatcher:
Heartbeat Period: 5 seconds
CA Configuration:
Expiry Duration: 3 months
Force Rotate: 0
Autolock Managers: false
Root Rotation In Progress: false
Node Address: 192.168.56.1
Manager Addresses:
192.168.56.102:2377
192.168.56.1:2377
...
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
emjyva9udrhuet3eof6f57mvu * barwe-deepin Ready Active Reachable 19.03.8
pxnrxz35fkwx4opftt6qesl5d c0 Ready Active 19.03.12
wgx447gnd1y10qmqruqv8h7wb c1 Ready Active 19.03.12
xmqom69sj40gteu25i14oq4mv c2 Ready Active 19.03.12
w3mcx5az7hle83x54myigl8ej m0 Ready Active Leader 19.03.12
可以看到我们的宿主机在集群中的地址是 192.168.56.1,这与我们创建虚拟机时使用的虚拟网关地址是一致的。
也就是说,对于集群所在的子网来说,我们的宿主机不仅仅是一个节点,也相当于网关。
启动工作节点
将工作节点加入 Swarm 集群(以 c0 为例):
$ docker-machine ssh c0
$ docker swarm join --token SWMTKN-1-16os6vw7xyxsru81wdq46dh33e1ypbgvikaxiqxivngyq7wkfz-0d77s470esvona8tvedyy66uw 192.168.56.102:2377
This node joined a swarm as a worker.
检查集群和节点
查看 Swarm 集群:
$ docker-machine ssh m0 # 任意管理节点均可
$ docker info
...
Swarm: active # swarm 集群处于激活状态
NodeID: w3mcx5az7hle83x54myigl8ej
Is Manager: true
ClusterID: ec1rip1hudoepr4g8tvhi7zne
Managers: 1 # 管理节点数量
Nodes: 4 # 节点总数(管理节点 + 工作节点)
Default Address Pool: 10.0.0.0/8
SubnetSize: 24
Data Path Port: 4789
Orchestration:
Task History Retention Limit: 5
Raft:
Snapshot Interval: 10000
Number of Old Snapshots to Retain: 0
Heartbeat Tick: 1
Election Tick: 10
Dispatcher:
Heartbeat Period: 5 seconds
CA Configuration:
Expiry Duration: 3 months
Force Rotate: 0
Autolock Managers: false
Root Rotation In Progress: false
Node Address: 192.168.56.102 # 当前(管理)节点地址
Manager Addresses:
192.168.56.102:2377
...
在任意管理节点可查看集群节点:
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
pxnrxz35fkwx4opftt6qesl5d c0 Ready Active 19.03.12
wgx447gnd1y10qmqruqv8h7wb c1 Ready Active 19.03.12
xmqom69sj40gteu25i14oq4mv c2 Ready Active 19.03.12
w3mcx5az7hle83x54myigl8ej * m0 Ready Active Leader 19.03.12
MANAGER STATUS
- 没有值:工作节点
- Leader: 管理节点中的老大,负责该集群的集群管理和编排决策
- Reachable: 其他管理节点,当老大挂掉之后会从这些节点中选出新的老大
- Unavailable: 不可用的管理节点,管理员应该手动检查并处理这个节点(管理员:小老弟你怎么肥四?)
AVAILABILITY
- Active: 该节点可以正常执行任务
- Pause: 该节点不会接受新的任务,但是正在运行的任务仍然可以继续运行
- Drain: 该节点不再接受新的任务,正在运行的任务也会被停止,然后转移到其他可用的节点上
删除节点
删除管理节点
删除之前先迁移该节点上的服务:
docker node update --availability drain 节点名称|节点ID
降级节点:
docker node demote 节点名称|节点ID
在降完级后的工作节点中执行命令离开集群:
docker swarm leave
回到管理节点中删除该节点:
docker node rm 节点名称|节点ID
删除工作节点
同样先迁移服务:
docker node update --availability drain 节点名称|节点ID
然后主动离开集群:
docker swarm leave
最后在管理节点中删除该节点:
docker node rm 节点名称|节点ID
服务管理
创建服务
docker service create --replicas 1 --name mynginx -p 80:80 nginx
- --replicas: 该服务需要运行多少个实例(一个实例就是一个任务)
- --name: 服务名称
查看服务
查看运行的所有服务:
docker service ls
查看某个服务的详细信息:
docker service ps xxx
弹性服务
增加或者减少实例数量:
# 将 xxx 服务实例数改成2,多退少补
docker service scale xxx=2
# 或者
# docker service update --replicas 2 xxx
删除服务
docker service rm xxx
评论区