准备工作
至少需要 2 台以上的机器搭建 docker swarm,每台机器之间都能ping通。根据一致性协议,至少要大于2台主机。
一台机器当做 manager,其它的机器作为 worker。
看看 docker swarm 有哪些命令:
docker swarm --helpUsage: docker swarm COMMANDManage SwarmCommands:ca Display and rotate the root CAinit Initialize a swarmjoin Join a swarm as a node and/or managerjoin-token Manage join tokensleave Leave the swarmunlock Unlock swarmunlock-key Manage the unlock keyupdate Update the swarm
我们看到init这个参数,它用于初始化swarm。我们再看看它的具体参数:
docker swarm init --helpUsage: docker swarm init [OPTIONS]Initialize a swarmOptions:--advertise-addr string Advertised address(format: <ip|interface>[:port])--autolock Enable manager autolocking(requiring an unlock keyto start a stopped manager)--availability string Availability of the node("active"|"pause"|"drain")(default "active")--cert-expiry duration Validity period for nodecertificates(ns|us|ms|s|m|h) (default2160h0m0s)--data-path-addr string Address or interface touse for data path traffic(format: <ip|interface>)...
后面的选项参数很多,注意看第一个参数,它用于广播地址。也就是说,告诉其他工作者:我是谁,我在哪里。
新建 manager
初始化集群,在 manager 机器上操作:
docker swarm init --advertise-addr=192.168.113.130
初始化结果:
Swarm initialized: current node (zgbzi61s274oh2hubv6lhzhnm) is now a manager.To add a worker to this swarm, run the following command:docker swarm join --token SWMTKN-1-4uddqewwy5r86ywaescfktepx54i8txi0uhk0dw6axhxrfkll7-bwiein2hxpsrn0fnagpc7at5j 192.168.113.130:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
初始化集群后,会生成一个token。其他工作者想要加入集群,必须携带此token。就好比参加一个私人舞会,请柬是很重要的。
上面还显示了加入集群的命令,来让我们看看这个命令的详情:
docker swarm join --helpUsage: docker swarm join [OPTIONS] HOST:PORTJoin a swarm as a node and/or managerOptions:--advertise-addr string Advertised address (format:<ip|interface>[:port])--availability string Availability of the node("active"|"pause"|"drain") (default "active")--data-path-addr string Address or interface to use for data pathtraffic (format: <ip|interface>)--listen-addr node-addr Listen address (format:<ip|interface>[:port]) (default 0.0.0.0:2377)--token string Token for entry into the swarm
获取令牌的快捷指令:
docker swarm join-token worker # 获取工作节点的加入token
docker swarm join-token manager # 获取管理节点的加入token
新建worker
切换到其它worker机器,输入新建manager后打印的凭证:
docker swarm join --token SWMTKN-1-4uddqewwy5r86ywaescfktepx54i8txi0uhk0dw6axhxrfkll7-bwiein2hxpsrn0fnagpc7at5j 192.168.113.130:2377
注意:manager的防火墙必须开放某些端口:
firewall-cmd --add-port=2376/tcp --permanent
firewall-cmd --add-port=2377/tcp --permanent
firewall-cmd --add-port=7946/tcp --permanent
firewall-cmd --add-port=7946/udp --permanent
firewall-cmd --add-port=4789/udp --permanent
切换到 manager 机器,输入命令查看已加入的 worker
docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
ozavne9qnzcy99pnho1p4r851 www Ready Active
zgbzi61s274oh2hubv6lhzhnm * www Ready Active Leader
新建服务
新建一个名为busybox镜像,取个别名为demo:
docker service create --name demo busybox sh -c "while true;do sleep 3600;done"
gf13affebul808h7lxvq4y0rk
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
其实新建服务就是创建了一个容器。
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
gf13affebul8 demo replicated 1/1 busybox:latest
我们在上面得知有一个正在运行的进程。
查看服务进程:
docker service ps demo
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
n3l7uh6tlkws demo.1 busybox:latest www Running Running 4 minutes ago
docker swarm 最大的好处就是可以动态地扩缩容:
docker service scale demo=5
上面的命令把demo容器扩容至5个。
删除服务:
docker service rm demo
