以下内容皆参考至狂神说docker学习视频
Docker网络学习
1. Docker网络模型
- 在wsl2中,
ip addr
查看网络如下
# 我们发现这个容器带来网卡,都是一对对的
# veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连
# 正因为有这个特性,veth-pair充当一个桥梁, 连接各种虚拟网络设备
# OpenStac, Docker容器之间的链接,OVS的链接, 都是使用veth-pair技术
- 进入容器查看容器ip
docker exec -it tomcat01 ip addr
如果出现 OCI runtime exec failed: exec failed:
,则进入容器后执行:
apt update
apt install -y iproute2
- 我们测试一下tomcat01和tomcat02之间是否可以ping通!再次运行一个tomcat02
结论:容器与容器之间是可以相互ping通的!
绘制一个网络模型图
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200814101617604.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZhbmppYW5oYWk=,size_16,color_FFFFFF,t_70#pic_center)
结论:tomcat01和tomcat02是共用的一个路由器,docker0
所有容器不指定网络的情况下,都是docker0路由的,doucker会给我们的容器分配一个默认的可用IP
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200814102155735.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZhbmppYW5oYWk=,size_16,color_FFFFFF,t_70#pic_center)
Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥docker0.
2. link的使用
思考一个场景,我们编写了一个微服务,database url =ip; 项目不重启,数据ip换掉了,我们希望可以处理这个问题,可以按名字来进行访问容器
直接 docker exec -it tomcat02 ping tomcat01
,发现是ping不通的;解决方法:通过–link既可以解决网络连通问题
在启动tomcat时使用link命令: docker run -d -P --name tomcat03 --link tomcat02 tomcat
,这个时候再 docker exec -it tomcat03 ping tomcat02
,就可以ping通了
反向可以ping通吗? 执行 docker exec -it tomcat02 ping tomcat03
,发现反向ping不通
探究其原因,查看host文件发现其实这个tomcat03就是在本地配置了tomcat02的配置,执行 docker exec -it tomcat03 cat /etc/hosts
如下:
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 tomcat02 f22ed47ed1be
172.17.0.4 3a2bcaba804c
本质探究:–link 就是我们在hosts配置中增加了一个172.17.0.3 tomcat02 f22ed47ed1be
3. 自定义网络
我们现在玩Docker已经不建议使用–link了;Docker0的问题:它不支持容器名链接访问!
-
查看所有网络
2. 网络模式bridge: 桥接模式,桥接 docker 默认,自己创建的也是用brdge模式 none: 不配置网络 host: 和宿主机共享网络 container:容器网络连通!(用的少, 局限很大)
我们直接启动的命令默认有一个 --net bridge,而这个就是我们的docker0,
docker run -d -P --name tomcat01 tomcat
与docker run -d -P *--name tomcat01 --net bridge tomcat
是等价的。 docker0特点,默认,容器名不能访问, –link可以打通连接!,我们可以自定义一个网络!如下:
# --driver bridge # --subnet 192.168.0.0/16 可以支持255*255个网络 192.168.0.2 ~ 192.168.255.254 # --gateway 192.168.0.1 docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet root@程哥哥Redmibook:~# docker network ls NETWORK ID NAME DRIVER SCOPE 96771c136621 bridge bridge local 9cbacd058f0e host host local 075850a6fdb4 mynet bridge local 7febd5f666b6 none null local #自定义网络mynet创建成功
在自己创建的网络里面启动两个容器,过程如下
root@程哥哥Redmibook:~# docker network inspect mynet [ { "Name": "mynet", "Id": "075850a6fdb48390ca67680b39630c13d19eda1beda7364496738318f02320d7", "Created": "2022-04-25T14:13:35.137312937+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "192.168.0.0/16", "Gateway": "192.168.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, "Options": {}, "Labels": {} } ] root@程哥哥Redmibook:~# docker run -d -P --name tomcat-mynet01 --net mynet tomcat f055f7730993161a37fc21acada953f15969c8de4a30a7063b9ef689d038e4e2 root@程哥哥Redmibook:~# docker run -d -P --name tomcat-mynet02 --net mynet tomcat 99975b2eee389baac6d16c7c4e1469b779077c2249d0ee5a46d317ab6b29363a root@程哥哥Redmibook:~# docker network inspect mynet [ { "Name": "mynet", "Id": "075850a6fdb48390ca67680b39630c13d19eda1beda7364496738318f02320d7", "Created": "2022-04-25T14:13:35.137312937+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "192.168.0.0/16", "Gateway": "192.168.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "99975b2eee389baac6d16c7c4e1469b779077c2249d0ee5a46d317ab6b29363a": { "Name": "tomcat-mynet02", "EndpointID": "d967e96f6768727a1514a210009562e086286e676cfc56f160640bceac578de0", "MacAddress": "02:42:c0:a8:00:03", "IPv4Address": "192.168.0.3/16", "IPv6Address": "" }, "f055f7730993161a37fc21acada953f15969c8de4a30a7063b9ef689d038e4e2": { "Name": "tomcat-mynet01", "EndpointID": "76aadd24a3a2df0ed14e07f9bfd045449eb3d29c3e8257a5393ff4b97719e280", "MacAddress": "02:42:c0:a8:00:02", "IPv4Address": "192.168.0.2/16", "IPv6Address": "" } }, "Options": {}, "Labels": {} } ] #再次ping成功 docker exec -it tomcat-net-01 ping 192.168.0.3 docker exec -it tomcat-net-01 ping tomcat-net-02
我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络
好处:
redis - 不同的集群使用不同的网络,保证集群时安全和健康的 mysql - 不同的集群使用不同的网络,保证集群时安全和健康的
4.网络连通
docker network connect 测试打通tomcat01 和mynet
# 连通之后就是讲tomcat01 放到了mynet网路下 # 一个容器两个ip地址: # 阿里云服务器,公网ip,私网ip docker network connect mynet tomcat01 # 连通ok root@程哥哥Redmibook:~# docker exec -it tomcat01 ping tomcat-net-01 PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data. 64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.100 ms 64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.085 ms ^C --- tomcat-net-01 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1000ms rtt min/avg/max/mdev = 0.085/0.092/0.100/0.012 ms # 依旧无法连通,没有connect root@程哥哥Redmibook:~# docker exec -it tomcat02 ping tomcat-net-01 ping: tomcat-net-01: Name or service not known
结论:假设要跨网络 操作别人,就要使用docker network connect连通…!