一文搞懂Docker的网络模式
一 前言
根据上篇知识了解到,通过设置不同的网络空间来达到网络协议栈的完全隔离,对于不同空间的协议栈是完全隔离,每个网络空间都可以有自己的iptables来进行单独的转发过滤等,不同的网络空间默认无法进行网络通信的,但是通过veth可以把两个不同的网络空间打通达到通讯的目的,前一篇文章也进行了相关的说明。 二 Docker的网络模式2.1 桥接模式
Docker的默认使用的是linux的桥接模式,有个docker0的虚拟桥,docker 每启动一个容器就给这个容器分配一个container ip,同时设置了docker0 桥作为默认的网关,默认情况下容器的网络都通过veth的技术来接到docker0这个虚拟桥上来达到通讯的目的。 docker run -d --name nginx02 -P nginx docker run -d --name nginx03 -P nginx
启动两个nginx镜像,用docker ps看下是否存在: root@ubuntu-lab:/home/miao# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bd64ce2fdfd2 nginx "/docker-entrypoint.…" 4 minutes ago Up 4 minutes 0.0.0.0:49154->80/tcp, :::49154->80/tcp nginx03 687427d720b1 nginx "/docker-entrypoint.…" 5 minutes ago Up 5 minutes 0.0.0.0:49153->80/tcp, :::49153->80/tcp nginx02
我们知道veth都是成对出现的,我们来验证下,是否有两个veth,且一端应该是配置了ip的即container-ip,另一端可以理解为插在虚拟网桥上的。
由于nginx的容器默认是没有带ip命令的,需要安装下: docker exec -it nginx02 /bin/bash apt-get update apt-get install iproute2
用命令看下容器内的网卡情况: root@ubuntu-lab:~# docker exec -it nginx03 ip addr 1: lo: 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 29: eth0@if30: mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever root@ubuntu-lab:~# docker exec -it nginx02 ip addr 1: lo: 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 27: eth0@if28: 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 root@ubuntu-lab:~#
清楚地看到配置的地址分别为: 172.17.0.2 和172.17.0.3 注意看下网卡名都是含有@符号的,这个是veth的标识,eth0是其中的一端,这个配置了上面的地址,另一端是if30和if28,这个需要到宿主机器上查看:# ip addr show 28: vethd7194ee@if27: mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 66:c6:93:2e:6b:7d brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet6 fe80::64c6:93ff:fe2e:6b7d/64 scope link valid_lft forever preferred_lft forever 30: veth8236973@if29: mtu 1500 qdisc noqueue master docker0 state UP group default link/ether be:9d:3d:ca:38:53 brd ff:ff:ff:ff:ff:ff link-netnsid 3 inet6 fe80::bc9d:3dff:feca:3853/64 scope link valid_lft forever preferred_lft forever
看到了28序号的30序号的网卡,刚好对应容器内的27和29两个序号的网卡。
那我们再来看下网桥情况: root@ubuntu-lab:~# brctl show bridge name bridge id STP enabled interfaces docker0 8000.0242726f7fa2 no veth8236973 vethd7194ee
看到了吧,网桥上插着veth的一端,画出图形如下:
docker 桥接模式
注意到这里面和上一篇桥接模式的区别为没有看到单独的网络空间(实际上应该有,不然怎么做网络隔离那,通过下面的命令没看到): root@ubuntu-lab:~# ip netns list
但是两者网络是互通的,测试: root@ubuntu-lab:~# docker exec -it nginx02 ping 172.17.0.3 PING 172.17.0.3 (172.17.0.3): 56 data bytes 64 bytes from 172.17.0.3: icmp_seq=0 ttl=64 time=0.224 ms 64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.108 ms ^C--- 172.17.0.3 ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max/stddev = 0.108/0.166/0.224/0.058 ms
顺便说下,我们启动nginx的时候,通过-P指定了随机端口和80端口的映射,这个是通过nat来实现的,测试如下图: root@ubuntu-lab:~# iptables -t nat -vnL
桥接模式缺点,虽然我们可以互通,但是不能通过容器的名称ping通,有一定局限性。 3.2 host模式
host模式比较简单,如果容器以host模式启动,容器不会获得独立的Network namespace,和宿主主机共享Network namespace,不能配置ip,也不会虚拟出网卡。 它启动的端口也会占用主机的端口,外部访问直接通过宿主机器的ip进行访问即可。 root@ubuntu-lab:/home/miao# docker run -d --name nginx01 --network host nginx root@ubuntu-lab:/home/miao# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0ebd1b751f50 nginx "/docker-entrypoint.…" About an hour ago Up 36 seconds nginx01 root@ubuntu-lab:/home/miao# netstat -antp|grep 80 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 79104/nginx: master tcp6 0 0 :::80 :::* LISTEN 79104/nginx: master
外部访问测试:
3.3 none模式
这个模式下没有网络,端口也不能通过-p来映射出来,没办法联网,监听只能在lo上,也就是只能本机访问,容器更安全,不过也只能测试玩玩。 root@ubuntu-lab:/home/miao# docker run --name mynginx --network none -d nginx 99a861a124099946d6f8802f09871b6cc9881d5c10161c084997bd4847e872a7 root@ubuntu-lab:/home/miao# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 99a861a12409 nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds mynginx 三 其他3.1 容器名是否可以ping通
如果我们想通过容器名ping通,那么我们就可以通过容器名做连接,即实现: root@ubuntu-lab:/home/miao# docker exec -it nginx02 ping nginx03 ping: unknown host
最简单地采用link方式: root@ubuntu-lab:/home/miao# docker run -d -P --name nginx02 --link nginx03 nginx #安装ping工具 root@ubuntu-lab:/home/miao# docker exec -it nginx02 root@3748ab1cb1e0:/# apt-get install -y iputils-ping root@ubuntu-lab:/home/miao# docker exec -it nginx02 ping nginx03 PING nginx03 (172.17.0.3) 56(84) bytes of data. 64 bytes from nginx03 (172.17.0.3): icmp_seq=1 ttl=64 time=0.106 ms 64 bytes from nginx03 (172.17.0.3): icmp_seq=2 ttl=64 time=0.087 ms ^C
ok,就这样简单地通了,那么反过来那: root@ubuntu-lab:/home/miao# docker exec -it nginx03 ping nginx02 OCI runtime exec failed: exec failed: unable to start container process: exec: "ping": executable file not found in $PATH: unknown
不行,反向不通.其实只是将nginx03的ip和host的映射,配置到了nginx02容器的/etc/hosts里面。 root@ubuntu-lab:/home/miao# docker exec -it nginx02 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 nginx03 bd64ce2fdfd2 172.17.0.2 3748ab1cb1e0 3.2 docker的自定义网络
我们原来使用docker0作为虚拟网桥进行容器的连接,但是有docker0有限制,比如不能通过容器名直接访问。
确保网络环境干净 root@ubuntu-lab:/home/miao# docker network ls NETWORK ID NAME DRIVER SCOPE d8f1fa7ccbd3 bridge bridge local 1bd98c27e839 host host local 84542ce461aa none null local
创建自定义网络 root@ubuntu-lab:/home/miao# docker network create --driver bridge --subnet 192.168.3.0/24 --gateway 192.168.3.1 mynet db74fc9a41e40002755989da5d83d59cca1dfb490f6c26a9f85026617d2d25cc root@ubuntu-lab:/home/miao# docker network ls NETWORK ID NAME DRIVER SCOPE ... 48ee4153016f mynet bridge local ...
启动两个新的容器,网络设置成我们新建的网络: root@ubuntu-lab:/home/miao# docker run -d -P --name nginx-net-01 --net mynet nginx c44262be7824f4649f96b0df83ac44460f7c49c135577ee832af2a93f0cf81e3 root@ubuntu-lab:/home/miao# docker run -d -P --name nginx-net-02 --net mynet nginx c488ece52f691fd228916df2046fa17efd971ad81299d46f358be6c372593095 root@ubuntu-lab:/home/miao# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c488ece52f69 nginx "/docker-entrypoint.…" 3 seconds ago Up 3 seconds 0.0.0.0:49161->80/tcp, :::49161->80/tcp nginx-net-02 c44262be7824 nginx "/docker-entrypoint.…" 10 seconds ago Up 9 seconds 0.0.0.0:49160->80/tcp, :::49160->80/tcp nginx-net-01
可以看到ip是我们网络内的ip如下: root@ubuntu-lab:/home/miao# docker inspect nginx-net-02|grep IPAddress "SecondaryIPAddresses": null, "IPAddress": "", "IPAddress": "192.168.3.3", root@ubuntu-lab:/home/miao# docker inspect nginx-net-01|grep IPAddress "SecondaryIPAddresses": null, "IPAddress": "", "IPAddress": "192.168.3.2",
测试下: root@ubuntu-lab:/home/miao# docker exec -it nginx-net-02 ping nginx-net-01 PING nginx-net-01 (192.168.3.2) 56(84) bytes of data. 64 bytes from nginx-net-01.mynet (192.168.3.2): icmp_seq=1 ttl=64 time=0.215 ms 64 bytes from nginx-net-01.mynet (192.168.3.2): icmp_seq=2 ttl=64 time=0.175 ms
不用额外配置,自定义网络直接可以ping通,牛了。 3.3 跨网络访问
我们把nginx02,nginx03也启动起来,现在的docker的容器的网络情况如下图:
如上图,如果我们想通过nginx02访问nginx-net-01怎么办,这个场景也比较常见,比如我们的应用在一个网络环境,数据库在另外一个网络环境(我这么懒应该不会这么部署)。 # 我们把nginx02 连接到mynet网络上去 root@ubuntu-lab:/home/miao# docker network connect mynet nginx02 # 查看执行成功后的变化: root@ubuntu-lab:/home/miao# docker network inspect mynet "Containers": { "3748ab1cb1e07f590dce7283d9e40f2edcc6fa15c1ebfefe4a4d6441e9ec5a25": { "Name": "nginx02", "EndpointID": "7f7aea9645f2dee4502122f3bd302aa662b55ec31f972827246b8e381904b42b", "MacAddress": "02:42:c0:a8:03:04", "IPv4Address": "192.168.3.4/24", "IPv6Address": "" }, "c44262be7824f4649f96b0df83ac44460f7c49c135577ee832af2a93f0cf81e3": { "Name": "nginx-net-01", "EndpointID": "b925305ae883ca4d621983bac339f16e87580a37e9e89dfb41c8fbd51b819213", "MacAddress": "02:42:c0:a8:03:02", "IPv4Address": "192.168.3.2/24", "IPv6Address": "" }, "c488ece52f691fd228916df2046fa17efd971ad81299d46f358be6c372593095": { "Name": "nginx-net-02", "EndpointID": "5e1ecdcbbaba78fa050a69780543f82dd90a445e8fcea8170e383b5161ca5dd7", "MacAddress": "02:42:c0:a8:03:03", "IPv4Address": "192.168.3.3/24", "IPv6Address": "" } },
原来是把nginx02直接加入到mynet网络,分配一个新的ip: 192.168.3.4 , 相当于这个容器有了两个ip:root@ubuntu-lab:/home/miao# docker exec -it nginx02 ping nginx-net-01 PING nginx-net-01 (192.168.3.2) 56(84) bytes of data. 64 bytes from nginx-net-01.mynet (192.168.3.2): icmp_seq=1 ttl=64 time=11.9 ms 64 bytes from nginx-net-01.mynet (192.168.3.2): icmp_seq=2 ttl=64 time=0.127 ms ^C --- nginx-net-01 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1003ms rtt min/avg/max/mdev = 0.127/6.003/11.880/5.876 ms root@ubuntu-lab:/home/miao# docker exec -it nginx02 ping nginx-net-02 PING nginx-net-02 (192.168.3.3) 56(84) bytes of data. 64 bytes from nginx-net-02.mynet (192.168.3.3): icmp_seq=1 ttl=64 time=0.184 ms 64 bytes from nginx-net-02.mynet (192.168.3.3): icmp_seq=2 ttl=64 time=0.080 m
如上,现在ping稳稳的,那么我们来看看nginx02的网卡信息: root@3748ab1cb1e0:/# ip addr 1: lo: 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 47: eth0@if48: mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever 49: eth1@if50: mtu 1500 qdisc noqueue state UP group default link/ether 02:42:c0:a8:03:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 192.168.3.4/24 brd 192.168.3.255 scope global eth1 valid_lft forever preferred_lft forever
原来是新建立veth对,配置ip是mynet里面网段的ip,看看桥里面信息: root@ubuntu-lab:/home/miao# brctl show bridge name bridge id STP enabled interfaces br-db74fc9a41e4 8000.024238d7721a no veth28769e3 veth8adc720 vetha525bf6
这个是通过新建个网桥把三个网卡连接起来了。我理解这相当于通过一个交换机把三者都接起来,只是在nginx02上新增了一块网卡。 看下: root@ubuntu-lab:/home/miao# docker exec -it nginx-net-02 /bin/bash root@c488ece52f69:/# ip addr 1: lo: 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 41: eth0@if42: mtu 1500 qdisc noqueue state UP group default link/ether 02:42:c0:a8:03:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 192.168.3.3/24 brd 192.168.3.255 scope global eth0 valid_lft forever preferred_lft forever
这里面有要注意的地方,mynet网络的主机只有一个ip。其实还有更复杂的场景没测试,我觉得现在这个也够了,下次用到再说。
建议大家在屈臣氏瞧见这四款好物,可别错过了,物美价廉想问各位姐妹们一个问题,大家平时去逛实体店的时候,是不是都喜欢在屈臣氏里头溜达一圈呢?屈臣氏里面琳琅满目的护肤品真的可以满足大家的日常了,关键比起在专柜的价格来说,真的划算很多呢,
2022年面试小技巧,vue常见的面试题汇总,需要的抓紧收藏起来1。vue在created和mounted这两个生命周期中请求数据有什么区别呢?若涉及页面加载,在created的时候,视图中的html并没有渲染出来,所以这个时候如果直接去操作d
中国平安下跌60之后,跳空下跌再阴跌,还在下跌的路上股票价格下跌的幅度达到60的基础上,中国平安又出现了一个跳空下跌的技术形态,而且跳空下跌之后又出现了持续性的阴跌。在最近一个时期,几乎每一个交易日它的股票价格不断地创出新的低点。中
羊肉是子宫肌瘤的发物吗?若想呵护子宫,饮食有哪些注意事项子宫是女性特有的一个生殖器官不仅是孕育新生命的成熟,也是产生月经的场所,女性的子宫是否健康可能直接关或者身体健康。一说到子宫很多人会不自觉地联想到子宫肌瘤,在人们的认知中,子宫肌瘤
长期喝水与长期喝茶,谁的身体更健康?人体的生命活动离不开水作为支撑任何时候水都会参与人体代谢没有水就没有生命长期喝白开水与长期饮茶的人相比谁的身体更健康?白开水和茶水如何选择?一个健康的成年人,人体中水的分量大约占了
女性50岁后,每天吃一片叶酸,半年后身体会如何?看完涨知识了王阿姨今年55岁,以前感觉身体还是非常不错的,并且王阿姨非常注重养生,即便自己在退休以后也是在超市里打扫卫生,根本就没有察觉出身体有任何不适。但是自从今年以来,王阿姨感觉自己的身体
多彩趣味活动为儿童成长赋能为丰富社区儿童生活,引导广大少年儿童传承优良革命传统,培养时代责任感和使命感,帮助更多家庭辅导儿童健康成长,近日,区妇女儿童发展中心向部分街镇配送了一系列精彩课程,有爱的手作童梦奇
国庆去哪儿玩之探秘湘西边城茶峒在营地早早便起床了,豌豆爸爸感叹到出门旅行是一点都不感觉累的,依次和营地的车友道别,快速地收拾行囊,下一站的目的地在边城茶峒。之前拖着拖挂房车是很少有机会走国道的,因为高速的路况稳
我国特殊的地级市,只辖3镇3街道,却拥有天下第一级别的景区在我国所有地级市中,通常都会设有一个或者多个市辖区数个县,有的还代管县级市。但是我国各个地级市里,只有四座最为特殊,它们不设县区,直接管辖街道或镇,被形象地称为直筒子市。这四座特殊
贵州六盘水钟山区值得游玩的旅游景点有哪些?自驾游有什么攻略?钟山区钟山区,隶属于贵州省六盘水市,钟山区位于川滇黔桂结合部,贵阳昆明两大城市中心点,北连三秦东达百越南可下海西能入滇,为西部旱码头四省立交桥,是西南通江达海的咽喉要塞。钟山区处于
蓄势待发内地赴澳旅行团即将恢复本澳旅游业界已蓄势待发正等待内地公布具体细节和安排目前导游从业员数量充足可随时上岗市场期待恢复团队游,为澳注入活水。中央宣布恢复内地居民赴澳旅游电子签注及旅行
缅甸游记之四缅甸的吃穿住行作者史济荣秋日生活打卡季神秘的缅甸,新奇的地方,就算我长十双眼睛,也不够我看的。我没有悲天悯人的情怀,我不是冷眼旁观的过客,我是一个满怀好奇心的旅行者,总想把一切摄入眼中,眼睛不够用,手机继
来衡水湖樱花岛赴一场浪漫之约当前,衡水湖旅游景区5A创建进入决战冲刺阶段。湖区三颗明珠之一的樱花岛开始试运营。近日,记者来到这个唯一可通过陆路进入的湖心岛,开启一场浪漫之旅。秋日的衡水湖散发着清爽怡人的气息。
江西龙虎山悬棺之谜专家无可奈何,悬赏100万却至今无人能解江西龙虎山作为一处知名道教圣地,古往今来吸引了无数信仰者前来拜会。与此同时,这里峰峦峭立岩石嵌空的景观也令不少游览者心驰神往。但与这二者相比,近年来龙虎山出现的另一处景观明显更具吸
老人去世前,有哪些异常?一般来说,身边的老年人,过了平均寿命,七十多岁已经算是高寿了,更不用说有些老人,活到百岁去世,人们还会称作喜丧。有人会说,身边的长辈年龄很大,走得很突然,其实并非如此,仔细观察这些
敏捷软件开发四要素敏捷软件开发需要快速交付,保障质量,在这种背景下,应启动敏捷开发模式。把握下面4要点,则项目不会失控和成本上升。1建立有效的业务模型要提升甲乙方或企业内部沟通效率,避免需求难以澄清
聊聊往事离婚很久了,想想这么多年一个人生活的日子真的是感慨万千!无依无靠的一个人,赶上什么事都是一个人咬着牙坚持,对情感对他人没有任何期盼,心中没有任何幻想,像个机器人一样每天重复着同样的
没本事的男人通常有哪些特征?1喜欢自吹自擂,把面子看得太重男人都好面子,这是毋庸置疑的,他们往往会把自尊心看得太重,不愿意在外人面前露了怯。好面子不是一件坏事,但是我们都应该知道面子是靠自己的实力赢来的,而不
从400公里到4亿公里中国航天不断创新跨越央视网消息十年来,我国一些关键核心技术实现突破,战略性新兴产业发展壮大,载人航天探月探火取得重大成果。400公里,这是地球到太空中近地轨道的距离。在这片繁忙的区域中,最耀眼的就是中
外星人来过地球了吗?天文学家认为神话或许是外星人的线索在各个文明的传说中,天外来客都是很常见的,而且天外来客无一例外都拥有神一般的技术能力。因此很多人都认为,宇宙中不但存在外星人,且它们在很久以前就来过地球并与人类发生过接触了,只是由
韦伯望远镜再拍创生之柱,天文学家或许创生之柱早已不存在2022年10月19日,NASA宣布詹姆斯韦伯太空望远镜继哈勃之后再一次拍摄到了创生之柱的高清图像,与之前拍摄的不同,装载了更先进拍摄一起的韦伯所拍摄的创生之柱细节更为清晰,在创生
谭宁等GRL热带海道关闭对太平洋海洋环流及温度梯度的影响海道的变化,可以直接影响海洋环流能量和水汽输送,影响区域及全球气候,因此海道开合一直是古气候研究领域的热点问题。从晚中新世到上新世,地球气候系统发生了重要变化,全球温度进一步降低北