当前位置:   article > 正文

docker网络_docker 172.18.0.1

docker 172.18.0.1

docker网络

1、理解docker0

  • 安装Docker时,它会自动创建三个网络形式,可以通过以下命令进行查看docker创建的网络。
docker network --help #查看帮助文档
  • 1

在这里插入图片描述

docker network ls #查看所有创建的网络
  • 1

在这里插入图片描述

  • Docker内置这三个网络,运行容器时,你可以使用该--network标志来指定容器应连接到哪些网络。这里的bridge网络代表docker0所有Docker安装中存在的网络。除非你使用该docker run --network=选项指定,否则Docker守护程序默认将容器连接到此网络,这就是docker0。
  • 也可以在Linux中使用ip addr命令来查看当前的网卡信息
    在这里插入图片描述
  • docker是如何处理容器访问的呢?
    场景1:
    在容器中运行tomcat1和tomcat2怎么让他们进行通信,相互访问
    在这里插入图片描述
    测试步骤:

1、在容器中启动一个tomcat01容器

docker run -d -P --name tomcat01 tomcat
  • 1

在这里插入图片描述
2、查看容器内部的网络地址

docker exec -it tomcat01 ip addr
  • 1

在这里插入图片描述
3、在容器中启动一个tomcat02容器

docker run -d -P --name tomcat02 tomcat
  • 1

在这里插入图片描述
4、查看容器内部的网络地址

docker exec -it tomcat02 ip addr
  • 1

在这里插入图片描述
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
  • 1

在这里插入图片描述
结论:
tomcat01和tomcat02是共用了路由器docker0。所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip,这些IP最多可以是 65535。

  • 那么Linux能不能ping通容器内部?

直接在linux中ping 刚才看到的容器地址,结果是可以ping通的,说明Linux是可以和每个容器进行通信的。在这里插入图片描述

3、原理
Linux宿主机的物理网卡其实这里的docker0是指直连的(NAT)然后通过docker0网桥完成宿主机与容器之间的通信见下图。
在这里插入图片描述
总结:
docker中所有的网络接口都是虚拟的,这是虚拟的转法效率高(就好比你用内网下载快是一样的,当容器删除时,对应的网桥就会被删除。

  • docker是否能够通过容器名之间进行访问呢

场景2:

思考一个问题,我们编写一个微服务,database url=ip: 微服务项目不重启,数据库容器重启后ip变掉了,导致服务的数据连接失败,这是不允许的 。我们希望可以处理这个问题,可不可以用容器名来进行容器之间的访问呢?

1、测试,通过一个容器名去 ping另外一个容器名
在这里插入图片描述
结果可以看出是ping不通的。

解决方式一:

--link #使容器进行连接
  • 1

再次启动一个tomcat03容器,然后使用--link连接tomcat02容器

docker run -d -P --name tomcat03 --link tomcat02 tomcat
  • 1

结果如下图,通过--link解决了这个问题
在这里插入图片描述
那么如果反向去操作能够ping通吗?
从下图结果可以看出反响是不行的。在这里插入图片描述
那是因为在tomcat03中配置了tomcat02所以可以ping通,由于反向没有配置所以是不行的。
1、查看tomcat03的本地hosts发现它里面配置了tomcat02的地址所以可以进行访问。

docker exec -it tomcat03 cat /etc/hosts
  • 1

在这里插入图片描述

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
  • 1
  • 2

我们可以自定义一个网络桥接 --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

  • 1
  • 2
  • 3
  • 4
  • 5

配置成并查看自己配置的网络
在这里插入图片描述
查看自己配置网络的详情
在这里插入图片描述
使用自己定义的网络启动容器
在这里插入图片描述
继续查看自己配置网络详情,就会出现tomcat01 tomcat02这两个网络。
在这里插入图片描述
然后我们分别用ip和名称测试
在这里插入图片描述
总结:我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络。
好处:
使不同的集群使用不同的网络,保证集群是安全和健康的。

场景3:能不能让不同网络之间的容器相互连通呢?
在这里插入图片描述
用默认的docker0启动两个容器,用自定义网络启动两个容器,发现是无法进行访问的。
在这里插入图片描述
查看network帮助文档发现有connect命令
在这里插入图片描述
继续查看connect帮助文档看到connect可以解决网络连通问题
在这里插入图片描述
使用该命令进行测试

docker network connect myet	tomcat01
  • 1

自定义网络连通默认容器
在这里插入图片描述
我们发现在自定义网络中出现了tomcat01
在这里插入图片描述
然后用用tomcat01pingtomcat-net-01是可以通的。
实操:
docker搭建redis集群
1、创建redis集群的自定义网络

docker network create --driver bridge --subnet 172.38.0.0/16
  • 1

2、查看刚才创建的网络

#查看自定义的网络
docker network ls
#查看自定义的网络详情
docker inspect redis
  • 1
  • 2
  • 3
  • 4

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

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
  • 1
  • 2
  • 3
  • 4
  • 5
#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
  • 1
  • 2
  • 3
  • 4
  • 5
#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
  • 1
  • 2
  • 3
  • 4
  • 5
#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
  • 1
  • 2
  • 3
  • 4
  • 5
#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
  • 1
  • 2
  • 3
  • 4
  • 5
#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
  • 1
  • 2
  • 3
  • 4
  • 5

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
  • 1

6、连接集群

redis-cli-c
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/867970
推荐阅读
相关标签
  

闽ICP备14008679号