赞
踩
1、理解docker0
docker network --help #查看帮助文档
docker network ls #查看所有创建的网络
--network
标志来指定容器应连接到哪些网络。这里的bridge
网络代表docker0
所有Docker安装中存在的网络。除非你使用该docker run --network=选项指定,否则Docker守护程序默认将容器连接到此网络,这就是docker0。ip addr
命令来查看当前的网卡信息1、在容器中启动一个tomcat01容器
docker run -d -P --name tomcat01 tomcat
2、查看容器内部的网络地址
docker exec -it tomcat01 ip addr
3、在容器中启动一个tomcat02容器
docker run -d -P --name tomcat02 tomcat
4、查看容器内部的网络地址
docker exec -it tomcat02 ip addr
5、查看Linux网卡地址
现象:通过上面操作我们可以看出当tomcat01容器启动时没有用--network
指定网络形式,默认使用bridge
网络代表docker0
为其分派了一个261:eth0@if262:
IP地址:172.18.0.2/16。当tomcat02容器启动时也是使用默认的模式docker0为其分派了一个263:eth0@if264:
IP地址:172.18.0.3/16。而通过查看Linux的网卡信息可以看到docker0网卡,IP地址是172.18.0.1/16,并且多出来了262:vethxxxxxxx@if261 和264:vethxxxxxxx@if263,两块网卡对比之下发现都是成对出现的。
本质:
通过分析发现新增的网卡是成对出现的,这并不是偶然。这就是使用Linux下的
evth-pair 技术,其本质就是一对虚拟的设备接口,它的一端连着通信协议一端构成通道彼此相连,evth-pair 就充当了桥梁的作用,连接各种虚拟网络设备,这样一来就使的容器件有了沟通桥梁,完成了通信。
例如: OpenStac,Docker容器之间的连接,OVS的连接,都是使用evth-pair技术实现的。
原理:
其实这里的docker0 充当的是网络中的路由,就好比家里的路由器他和你上网使用的网段时一样的,所以可以相互ping通,在结合evth-pair技术来完成容器间的通信,网络通信方式见下图:
测试:
docker exec -it tomcat02 ping 172.18.0.2
结论:
tomcat01和tomcat02是共用了路由器docker0。所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip,这些IP最多可以是 65535。
直接在linux中ping
刚才看到的容器地址,结果是可以ping通的,说明Linux是可以和每个容器进行通信的。
3、原理
Linux宿主机的物理网卡其实这里的docker0是指直连的(NAT)然后通过docker0网桥完成宿主机与容器之间的通信见下图。
总结:
docker中所有的网络接口都是虚拟的,这是虚拟的转法效率高(就好比你用内网下载快是一样的,当容器删除时,对应的网桥就会被删除。
场景2:
思考一个问题,我们编写一个微服务,database url=ip: 微服务项目不重启,数据库容器重启后ip变掉了,导致服务的数据连接失败,这是不允许的 。我们希望可以处理这个问题,可不可以用容器名来进行容器之间的访问呢?
1、测试,通过一个容器名去 ping另外一个容器名
结果可以看出是ping不通的。
解决方式一:
--link #使容器进行连接
再次启动一个tomcat03容器,然后使用--link
连接tomcat02容器
docker run -d -P --name tomcat03 --link tomcat02 tomcat
结果如下图,通过--link
解决了这个问题
那么如果反向去操作能够ping通吗?
从下图结果可以看出反响是不行的。
那是因为在tomcat03中配置了tomcat02所以可以ping通,由于反向没有配置所以是不行的。
1、查看tomcat03的本地hosts发现它里面配置了tomcat02的地址所以可以进行访问。
docker exec -it tomcat03 cat /etc/hosts
2、查看tomcat02的本地hosts发现它里面没有配置了tomcat03的地址所以不可以进行访问。
如果要访问可以从新启动tomcat02用–link命令进行配置,就可以。其本质就是通过hosts 映射去做的,在真实的docker中已经不推荐这么使用了。
解决方式2:自定义网络
1、查看所有的docker网络
2、网络模式
bridge 桥接模式(docker默认的)
none 不配置网络
host 主机模式(和宿主机共享网络)
container 容器内网络连通(几乎不用)
3、自定义网络步骤:
查看帮助文档
查看网络创建帮助文档
创建自己的网络
我们平时直接启动的命令默认是–net bridge 就是docker0但是域名不能访问。
docker run -d -P --name tomcat01 tomcat等价于
docker run -d -P --name tomcat01 --net bridge tomcat
我们可以自定义一个网络桥接 --driver bridge
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
#子网的地址 --subnet 192.168.0.0/16
#范围 192.168.0.2 -- 192.168.255.255
#网关地址(路由器)--gateway 192.168.0.1 mynet
配置成并查看自己配置的网络
查看自己配置网络的详情
使用自己定义的网络启动容器
继续查看自己配置网络详情,就会出现tomcat01 tomcat02这两个网络。
然后我们分别用ip和名称测试
总结:我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络。
好处:
使不同的集群使用不同的网络,保证集群是安全和健康的。
场景3:能不能让不同网络之间的容器相互连通呢?
用默认的docker0启动两个容器,用自定义网络启动两个容器,发现是无法进行访问的。
查看network帮助文档发现有connect命令
继续查看connect帮助文档看到connect可以解决网络连通问题
使用该命令进行测试
docker network connect myet tomcat01
自定义网络连通默认容器
我们发现在自定义网络中出现了tomcat01
然后用用tomcat01pingtomcat-net-01是可以通的。
实操:
docker搭建redis集群
1、创建redis集群的自定义网络
docker network create --driver bridge --subnet 172.38.0.0/16
2、查看刚才创建的网络
#查看自定义的网络
docker network ls
#查看自定义的网络详情
docker inspect redis
3、利用shell脚本创建集群的目录、配置文件以及用自定义网络启动redis
for port in $(seq 1 6);\ do \ mkdir -p /myfile/redis/node-${port}/conf touch /myfile/redis/node-${port}/conf/redis.conf cat << EOF >> /mydata/redis/node-${port}/conf/redis.conf port 6379 bind 0.0.0.0 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 cluster-announce-ip 172.38.0.1${port} cluster-announce-port 6379 cluster-announce-bus-port 16379 appendonly yes EOF done docker run -p 637${port}:6379 -p 1637${port}:16379 --nane redis-${port} \ -v /myfile/redis/node-${port}/data:/data \ -v /myfile/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
4、用自定义网络分别启动redis
#redis-1
docker run -p 6371:6379 -p 16371:16379 --nane redis-1 \
-v /myfile/redis/node-1/data:/data \
-v /myfile/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#redis-2
docker run -p 6372:6379 -p 16372:16379 --nane redis-2 \
-v /myfile/redis/node-2/data:/data \
-v /myfile/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#redis-3
docker run -p 6373:6379 -p 16373:16379 --nane redis-1 \
-v /myfile/redis/node-3/data:/data \
-v /myfile/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#redis-4
docker run -p 6374:6379 -p 16374:16379 --nane redis-1 \
-v /myfile/redis/node-4/data:/data \
-v /myfile/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#redis-5
docker run -p 6375:6379 -p 16375:16379 --nane redis-1 \
-v /myfile/redis/node-5/data:/data \
-v /myfile/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#redis-6
docker run -p 6376:6379 -p 16376:16379 --nane redis-1 \
-v /myfile/redis/node-6/data:/data \
-v /myfile/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
5、创建集群
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
6、连接集群
redis-cli-c
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。