Docker网络
理解Dcoker0
先清空所有环境
测试
三个网络
# 问题:docker 是如何处理容器网络访问的?
# 启动一个tomcat
# 查看ip [ ysl]# docker exec -it tomcat01 ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 146: : <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever # 发现容器启动 ip地址,docker分配的! # 测试,Linux能不能 ping 通容器内部!
是可以 ping 通 docker容器内部的 (禁ping除外)
原理
每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0 桥接模式,使用的技术是veth-pair 技术!
再次测试ip addr
再启动一个容器
[ ysl]# docker run -d -P --name tomcat02 tomcat 369e4fb8fd1eed8887dabb4dfa1607c9db6fa3244a632d88f73d751f888dc84d
再次测试ip addr 发现又多了一对网卡
查看ip
# 发现这个容器带来的网卡都是一对对的 # veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连 # veth-pair 充当一个桥梁,链接各种虚拟网络设备的 # OpenStac,Docker容器之间的链接,ovs的链接,都是使用的 veth-pair 技术
测试 tomcat02 ping tomcat01
结论:容器和容器之间是可以互相ping通的!
小结
Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥 docker0,最多能分配约65535
Docker中的所有的网络接口都是虚拟的。虚拟的转发效率高!
测试删掉容器
只要容器删除,对应的一对网桥就没了!
--link
希望用名字来访问容器
启动tomcat01
直接用名字ping
解决
[ ysl]# docker run -d -P --name tomcat03 --link tomcat02 tomcat 6eac1dfba29cda8a2a20aea6e820f3b2ebbd85d0d9223b650306b34febb820b0 [ ysl]# docker exec -it tomcat03 ping tomcat02 PING tomcat02 (172.17.0.3) 56(84) bytes of data. 64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.127 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.092 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.088 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.087 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=5 ttl=64 time=0.098 ms # 通过 --link 就可以解决 # 但是反向ping就不行了 [ ysl]# docker exec -it tomcat02 ping tomcat03 ping: tomcat03: Name or service not known
探究: 查看 hosts 文件
现在Docker已经不建议使用 --link 了!
自定义网络
查看所有的Docker网络
[ ysl]# docker network ls NETWORK ID NAME DRIVER SCOPE 8ce5d63292ee bridge bridge local b01be88b9d12 host host local 54b9e50084dd none null local
网络模式
bridge :桥接 docker(默认)
host :和宿主机共享网络
none :不配置网络
container:容器网络连通(用的少!局限很大!)
测试,清空容器
[ ysl]# docker rm -f $(docker ps -aq) 6eac1dfba29c 4e2db5c641fd 369e4fb8fd1e # 直接启动的命令默认会有一个 --net bridge 操作,这个就是docker0 docker run -d -P --name tomcat01 tomcat docker run -d -P --name tomcat01 --net bridge tomcat
自定义一个网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet [ ysl]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet ce6c831fa98c8e809096eb37b682abf1ce9b541d73b75f4c7126dfe8748c5971 [ ysl]# docker network ls NETWORK ID NAME DRIVER SCOPE 8ce5d63292ee bridge bridge local b01be88b9d12 host host local ce6c831fa98c mynet bridge local 54b9e50084dd none null local # 查看信息 [ ysl]# docker network inspect mynet [ { "Name": "mynet", "Id": "ce6c831fa98c8e809096eb37b682abf1ce9b541d73b75f4c7126dfe8748c5971", "Created": "2020-05-27T16:30:22.691575681+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": {} } ] # 到这里网络就创建好了 # 用自己的网络启动容器 [ ysl]# docker run -d -P --name tomcat-net-01 --net mynet tomcat 0dcb6a5f014415cb6c98c93c9dac21b7f5cae21df5cc5e42f331cc6e07a1ec93 [ ysl]# docker run -d -P --name tomcat-net-02 --net mynet tomcat eec65d6dc9cdad33f85d3874fcf8291ed46c97893ae1298c7d23d9d85e7dda87 [ ysl]# docker network inspect mynet [ { "Name": "mynet", "Id": "ce6c831fa98c8e809096eb37b682abf1ce9b541d73b75f4c7126dfe8748c5971", "Created": "2020-05-27T16:30:22.691575681+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": { "0dcb6a5f014415cb6c98c93c9dac21b7f5cae21df5cc5e42f331cc6e07a1ec93": { "Name": "tomcat-net-01", "EndpointID": "2364095efd247b368c6787bef9889fa60e58fa0dbc588e59f3f34894044f158f", "MacAddress": "02:42:c0:a8:00:02", "IPv4Address": "192.168.0.2/16", "IPv6Address": "" }, "eec65d6dc9cdad33f85d3874fcf8291ed46c97893ae1298c7d23d9d85e7dda87": { "Name": "tomcat-net-02", "EndpointID": "1dfd0a22eb575215d2a2b899bf10079fba54cabda082a89b672b8bf4ec0c585e", "MacAddress": "02:42:c0:a8:00:03", "IPv4Address": "192.168.0.3/16", "IPv6Address": "" } }, "Options": {}, "Labels": {} } ]
测试 用名字 ping 一下
现在不使用 --link 也可以ping名字了!
网络连通
测试
这是不可能的!需要打通
# 测试打通 tomcat01 - mynet [ ysl]# docker network connect mynet tomcat01 # 看一下网络信息 docker network inspect mynet
连通之后就是将tomcat01 放到了 mynet 网络下!一个容器两个ip地址
再次ping
相关推荐
bwyyziq 2020-11-22
yangkang 2020-11-12
TaoTaoFu 2020-11-06
ppppfly 2020-10-23
王道革 2020-11-25
pigsmall 2020-11-19
changecan 2020-11-19
helloWorldAndYou 2020-11-16
nginxs 2020-11-14
红石丶 2020-11-13
WanKaShing 2020-11-12
滴水穿石点石成金 2020-11-12
张荣珍 2020-11-12
wuxunanjing 2020-11-11
魅惑青花瓷 2020-11-11
lihongtai 2020-11-09
yangkang 2020-11-09
worldsnow 2020-11-06