[root@master ~]# docker swarm init --advertise-addr 192.168.1.200
Swarm initialized: current node (udbgr7vn9x5gntpqbj8m82x7l) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-22q5qlm1mxbilt504ghcf0ug9gsn9a40szbhiohyh9kqiayyku-a8crg1xr8vab1vwrh7kmsy3kw \
192.168.1.200:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
root@host2:~# docker swarm join \
> --token SWMTKN-1-22q5qlm1mxbilt504ghcf0ug9gsn9a40szbhiohyh9kqiayyku-a8crg1xr8vab1vwrh7kmsy3kw \
> 192.168.1.200:2377
This node joined a swarm as a worker. 4、查看添加结果
docker node ls可以看到两个 worker node 已经添加进来了。
[root@master ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
c1scfpzw4s9hx1ykiggzs5qym host1 Ready Active 18.04.0-ce
6cwk70xzafhfwn1x3replywn7 host2 Ready Active 18.04.0-ce
udbgr7vn9x5gntpqbj8m82x7l * master Ready Active Leader 18.04.0-ce
至此,三节点的 swarm 集群就已经搭建好了,操作还是相当简单的。
三、部署 Docker Service
1、创建 service
我们创建好了 Swarm 集群, 现在部署一个运行 httpd 镜像的 service,执行如下命令:
[root@master ~]# docker service create --name web_server httpd
gjy6az3urqsbktichzoz6vpdh
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged 2、查看
通过 docker service ls 可以查看当前 swarm 中的 service。
[root@master ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
gjy6az3urqsb web_server replicated 1/1 httpd:latest
REPLICAS 显示当前副本信息,1/1 的意思是 web_server 这个 service 期望的容器副本数量为 1,目前已经启动的副本数量为 1。也就是当前 service 已经部署完成。
命令 docker service ps可以查看 service 每个副本的状态。
[root@master ~]# docker service ps gjy6az3urqsb
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
b86hi4ivf855 web_server.1 httpd:latest master Running Running 3 minutes ago
我们可以看到 service 被分配到了 master 上面。
3、service scale up
前面部署了只有一个副本的 Service,不过对于 web 服务,我们通常会运行多个实例。这样可以负载均衡,同时也能提供高可用。
swarm 要实现这个目标非常简单,增加 service 的副本数就可以了。在 swarm-manager 上执行如下命令:
[root@master ~]# docker service scale web_server=5
web_server scaled to 5
overall progress: 5 out of 5 tasks
1/5: running [==================================================>]
2/5: running [==================================================>]
3/5: running [==================================================>]
4/5: running [==================================================>]
5/5: running [==================================================>]
verify: Service converged
副本数增加到 5,通过 docker service ls和 docker service ps web_server查看副本的详细信息。
[root@master ~]# docker service create --name web_server --replicas=2 httpd
r9q5qbwz78j9yfzlkam9cjo2f
overall progress: 2 out of 2 tasks
1/2: running
2/2: running
verify: Service converged
我们可以看到 host1 和 host2 上面个运行一个副本。
[root@master ~]# docker service ps web_server
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
xpnhww0d1kdj web_server.1 httpd:latest host2 Running Running about a minute ago
wq7ltc215laf web_server.2 httpd:latest host1 Running Running about a minute ago
要访问 http 服务,最起码网络得通吧,服务的 IP 我们得知道吧,但这些信息目前我们都不清楚。不过至少我们知道每个副本都是一个运行的容器,要不先看看容器的网络配置吧。
root@host1:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7694a2dc91e5 httpd:latest "httpd-foreground" 2 minutes ago Up 2 minutes 80/tcp web_server.2.wq7ltc215lafm5s8b4hcnwn7r
在 host11 上运行了一个容器,是 web_server 的一个副本,容器监听了 80 端口,但并没有映射到 Docker Host,所以只能通过容器的 IP 访问。查看一下容器的 IP。
root@host1:~# docker exec 7694a2dc91e5 ip r
default via 172.17.0.1 dev eth0
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.2
容器 IP 为 172.17.0.2,实际上连接的是 Docker 默认 bridge 网络。
我们可以直接在 swarm-worker1 上访问容器的 http 服务。
root@host1:~# curl 172.17.0.2
It works!
但这样的访问也仅仅是容器层面的访问,服务并没有暴露给外部网络,只能在 Docker 主机上访问。换句话说,当前配置下,我们无法访问 service web_server。
1、从外部访问 service
要将 service 暴露到外部,方法其实很简单,执行下面的命令:
[root@master ~]# docker service update --publish-add 8080:80 web_server
web_server
overall progress: 2 out of 2 tasks
1/2: running
2/2: running
verify: Service converged
如果是新建 service,可以直接用使用 --publish 参数,比如: