因为忘记关闭防火墙了!!!!! 要永久关闭!!
修改hostname
https://blog.csdn.net/qq_27327261/article/details/109100219
关闭防火墙
https://blog.csdn.net/qq_27327261/article/details/109099020
1) 初始化swarm
docker swarm init
# Swarm initialized: current node (0r4xjgtu4nd9txrsbfn1lo5gu) is now a manager.
#
# To add a worker to this swarm, run the following command:
#
# docker swarm join \
# --token SWMTKN-1-0q35cj5j0va82a0t3mhkbesirqb6lqgqlkmznbwx1ojbou4u75-ejrors77ezcw25nmy9g90u9a0 \
# 172.16.0.226:2377
#
# To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
2)创建overlay网络
docker network create -d overlay --attachable prod-overlay
3)创建10个overlay容器
docker service create -td --name c --replicas 10 --network prod-overlay busybox
4)不同虚拟机的容器ping一下是可以ping通的
docker exec c.1.0d5lp95bt73ou3t18zky09qc5 ping c.3.e9blo0rq21tnppvkmg66nsygi
https://blog.csdn.net/mylitboy/article/details/106369721
Docker Swarm实现跨宿主机容器间访问
麦粒橙 2020-05-27 06:05:47 264 收藏 1
分类专栏: Docker 文章标签: docker swarm
版权
使用Docker Swarm实现跨宿主机容器间访问
背景:
在SerA服务器,运行了一个任务调度系统xxl容器ConA。
在SerB服务器,运行了一个SpringBoot服务ConB,注册到任务调度系统中。
在任务调度系统中,看到的调度器节点IP是SerB服务器分配给ConB容器的IP地址。 导致任务调度系统调度失败,提示ConB地址链接不上。
分析下来,是由于ConA和ConB是跨宿主机的容器,无法通信。
网上看到了很多方案,包括Overlay网络、OpenvSwitch、consul方案等,最终使用Docker Swarm解决了,发现很简单,过程如下。
1. 初始化swarm
在主节点运行docker swarm init
,初始化swarm。
docker swarm init
# Swarm initialized: current node (0r4xjgtu4nd9txrsbfn1lo5gu) is now a manager.
#
# To add a worker to this swarm, run the following command:
#
# docker swarm join \
# --token SWMTKN-1-0q35cj5j0va82a0t3mhkbesirqb6lqgqlkmznbwx1ojbou4u75-ejrors77ezcw25nmy9g90u9a0 \
# 172.16.0.226:2377
#
# To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
2. 创建Overlay网络
在主节点,创建overlay模式网络。
docker network create --driver=overlay --gateway 192.168.1.1 --subnet 192.168.1.0/24 --attachable my_network
# m3k69pn88gtre361upi
可以通过docker network ls
命令,查看网络列表。
docker network ls
# NETWORK ID NAME DRIVER SCOPE
# acaeb6e14a1e bridge bridge local
# a8e5fdd055b9 docker_gwbridge bridge local
# b50eb414bcb4 host host local
# om6lst4j52go ingress overlay swarm
# m3k69pn88gtr my_network overlay swarm
# 0c76adacfcfc none null local
3. 子节点加入集群
复制上面初始化swarm命令结果中的语句,在子节点运行即可。
docker swarm join \--token SWMTKN-1-va82a0t3mhkbesirqb6lqgqlkmznbwxu4u75-ejrors790u9a0 \172.16.0.226:2377
# This node joined a swarm as a worker.
可以在主节点,通过docker node ls
命令,查看节点列表。
docker node ls
# ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
# 0r4xjgtu4nd9tsbfn1lo5gu * ecs-01 Ready Active Leader
# s67afk1e9nx0174yeqff6g2 ecs.h02 Ready Active
4. 运行容器加入网络
在容器运行命令中,加入--network my_network --ip 192.168.1.123
即可。
docker run -it -d --network my_network --ip 192.168.1.123 ubuntu
https://chanjarster.github.io/post/docker-overlay-network/
一种生产环境Docker Overlay Network的配置方案
January 9, 2019
介绍一种生产环境Docker overlay network的配置方案。
概要
先讲一下生产环境中的问题:
- 有多个Docker host,希望能够通过Docker swarm连接起来。
- Docker swarm只适合于无状态应用,不适合有状态应用。
- 因此生产环境中会同时存在
- 无状态应用:利用
docker service create
/docker stack deploy
创建的。 - 有状态应用:利用
docker run
/docker compose up
创建的。
- 无状态应用:利用
- 希望两种应用能够连接到同一个overlay网络,在网络内部能够通过
tasks.<service-name>
DNS name 连接到无状态应用(见Container discovery)<container-name>
DNS name 连接到有状态应用
解决办法:
- 创建attachable的overlay network
- 有状态应用挂到这个overlay network上
- 无状态应用也挂到这个overlay network上
步骤
到manager节点上创建attachable的overlay network,名字叫做prod-overlay:
docker network create -d overlay --attachable prod-overlay
在manager节点上查看这个网络是否创建成功:
$ docker network lsNETWORK ID NAME DRIVER SCOPE
fbfde97ed12a bridge bridge local
73ab6bbac970 docker_gwbridge bridge local
a2adb3de5f7a host host local
nm7pgzuh6ww4 ingress overlay swarm
638e550dab67 none null local
qqf78g8iio10 prod-overlay overlay swarm
在worker节点上查看这个网络,这时你看不到这个网络,不过不要担心,当后面在worker节点上创建工作负载后就能看到了:
$ docker network lsNETWORK ID NAME DRIVER SCOPE
fbfde97ed12a bridge bridge local
73ab6bbac970 docker_gwbridge bridge local
a2adb3de5f7a host host local
nm7pgzuh6ww4 ingress overlay swarm
638e550dab67 none null local
在manager上创建容器c1
,挂到prod-overlay
network上:
docker run --name c1 --network prod-overlay -itd busybox
在worker上创建容器c2
,挂到prod-overlay
network上:
docker run --name c2 --network prod-overlay -itd busybox
在manager上创建service c
,挂到prod-overlay
network上:
docker service create -td --name c --replicas 2 --network prod-overlay busybox
验证
查看worker节点的network
之前在worker节点上没有看到prod-overlay
network,现在你应该可以看见了:
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
01180b9d4833 bridge bridge local
cd94df435afc docker_gwbridge bridge local
74721e7670eb host host local
nm7pgzuh6ww4 ingress overlay swarm
32e6853ea78d none null local
dw8kd2nb2yl3 prod-overlay overlay swarm
确认容器可以互ping
到manager节点上,让c1
ping c2
$ docker exec c1 ping -c 2 c2
PING c2 (10.0.2.2): 56 data bytes
64 bytes from 10.0.2.2: seq=0 ttl=64 time=0.682 ms
64 bytes from 10.0.2.2: seq=1 ttl=64 time=0.652 ms
到manager节点上,让c1
ping tasks.c
,tasks.c
是之前创建的service c
的DNS name:
$ docker exec c1 ping -c 2 tasks.c
PING tasks.c (10.0.2.8): 56 data bytes
64 bytes from 10.0.2.8: seq=0 ttl=64 time=2.772 ms
64 bytes from 10.0.2.8: seq=1 ttl=64 time=0.694 ms
到manager节点上,让c1
查询 tasks.c
的DNS name,可以看到tasks.c
有两条记录:
$ docker exec c1 nslookup -type=a tasks.c
Server: 127.0.0.11
Address: 127.0.0.11:53Non-authoritative answer:
Name: tasks.c
Address: 10.0.2.7
Name: tasks.c
Address: 10.0.2.8
到manager节点上,查看service c
的task,看到有c.1
、c.2
两个task,分别部署在两个节点上:
$ docker service ps c
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
p5n70vhtnz2f c.1 busybox:latest docker-learn-1 Running Running 17 minutes ago
byuoox1t7cve c.2 busybox:latest docker-learn-2 Running Running 17 minutes ago
到c.1
task所在的节点上,查看task c.1
的容器名:
$ docker ps -f name=c.1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
795a3bd3c20a busybox:latest "sh" 21 minutes ago Up 21 minutes c.1.p5n70vhtnz2f5q8p2pcvbyfmw
然后在c1
里ping task c.1
的容器名:
$ docker exec c1 ping -c 2 c.1.p5n70vhtnz2f5q8p2pcvbyfmw
PING c.1.p5n70vhtnz2f5q8p2pcvbyfmw (10.0.2.7): 56 data bytes
64 bytes from 10.0.2.7: seq=0 ttl=64 time=0.198 ms
64 bytes from 10.0.2.7: seq=1 ttl=64 time=0.128 ms
你同样可以:
- 在
c2
里:- ping
c1
- ping
tasks.c
- ping task
c.1
、c.2
的容器
- ping
- 在task
c.1
、c.2
的容器里:- ping
c1
、c2
; - ping
tasks.c
- ping task
c.1
、c.2
的容器
- ping
注意
通过docker run
/ docker compose up
创建的容器的名字,要保证在整个集群里是唯一的。docker 不会帮你检查名称冲突的情况,如果名称冲突了那么会得到错误的DNS结果。
参考资料
- Use overlay networks
- Use an overlay network for standalone containers
- Docker Reference Architecture: Designing Scalable, Portable Docker Container Networks