我正在参加「掘金·启航计划」
这里我们部署一个应用wordpress来继续学习,这里我们之前也基于docker run相关命令创建了mysql和wordpress两个容器,基于公共bridge进行通信
在集群里面service创建在哪个节点是不知道,那通信怎么进行呢?这里之前说过可以通过overlay方式让两个节点连在一个overlay上面以进行通信。
创建overlay-network
docker network create -d overlay demo
接着我们去worker1和worker2节点去看一下:
目前是看不到这个demo网络的。
创建mysql和wordpress节点
我们先创建一个mysql的service:
docker service create --name mysql --env MYSQL_ROOT_PASSWORD=root
--env MYSQL_DATABASE=wordpress --network demo --mount type=volume,source=mysql-data,destination=/var/lib/mysql
mysql
创建了两个环境变量,--mount是挂载存储地址用的,可以参考之前的-v。然后我们选择了demo网络:
这个service运行在manager节点上面。
然后创建第二个wordpress service:
做了一个内部80映射到外部80的操作,DBHOST就是mysql。创建之后看一下位置:
这个service运行在worker2上面
尝试访问wordpress
这个是worker2可以访问的地址,我们输入这个地址:
可以正常访问了,这里我们装一下,后面需要看看数据库能不能连接上!后面安装成功了,意味着可以连接。
这里如果我们尝试输入worker1的地址:
创建的network为啥其他节点看不到
最后我们之前创建的demo网络,虽然连接成功了,但是在work1和2节点上面输入docker network ls还是看不到,这是为什么呢?
而且当我们的wordpress部署在worker2之后,worker2就能看到这个网络了:
这个就是整个swarm内部处理的:当容器被分配到指定节点之后,为了保证网络同步,所以指定节点也会拥有该网络,跟之前依赖的分布式存储etcd的目的一样,只不过swarm底层机制完成了这些操作和通信,不需要再依赖了