范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

一文搞懂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。其实还有更复杂的场景没测试,我觉得现在这个也够了,下次用到再说。

苹果是引领者还是跟随者?在不可避免即将到来的可折叠设备竞争中目前可折叠似乎是下一代手机外观开发的方向。市场也对它们大肆宣传,销售量每天都在增长。智能手机平板电脑领域的大多数品牌都推出了(或即将宣布)他们自己的可折叠设备,但只有一家公司例外苹苹果里的智商税淘宝上的一条苹果数据线当你点击购买后,恭喜你你已经成为千万个反抗苹果专利霸权中的一员。同样是数据线,为啥淘宝9块9包邮还能赚钱,而苹果官网却要卖到145块真的是因为原厂质量好吗,当新款ModelY搭载三大黑科技,大幅压缩成本未来特斯拉在全球车市的占有率将达到20,特斯拉德克萨斯州奥斯汀新工厂开业典礼现场,马斯克再度立下了Flag,马斯克之所以有这么足的底气,取决于德州新工厂生产的最大主角新款Model宁夏计质院研发的一种用于检定电涡流传感器动静态指标的控制系统获国家发明专利授权戳上面的蓝字宁夏市场监管关注我们哦!近日,宁夏计量质量检验检测研究院(以下简称宁夏计质院)联合中国矿业大学(北京)研发的一种用于检定电涡流传感器动静态指标的控制系统获国家发明专利授100位中国学者合作的研究综述被曝抄袭,智源发表声明承认错误,转交第三方专家调查嗯哼首先咳嗽一声,以表事态严峻。昨天,国内人工智能学术圈曝出了一起重大的论文抄袭事故,登上知乎热搜谷歌大脑研究员于4月8日在个人博客发文,指出北京智源人工智能研究院清华大学等等单位中国股市北上资金大幅流入的6只科技股(附名单)什么是高科技?高科技的高指的是相对于传统科技中的高,高科技都内容会随着时代的变化而发生改变,比如说从前的2G技术能被称之为高科技,但相对于现在的5G来说,它就只是一个传统的科技了,第六季超级测试员开启!汽车机器人欧尚Z6亮智慧进化实力4月14日,欧尚汽车第六季超级测试员我的汽车机器人Z6智慧进化顺利完成。从2015年起,欧尚汽车便开始推出超级测试员活动,邀请用户亲临现场,见证欧尚汽车每款产品的极致实力。今年,新尘埃落定?小米传来新消息,华为这次却毫无办法作为国产高端旗舰的代表品牌,华为之所以能够稳步立足于高端市场,与苹果三星正面抗衡,很大一部分靠的是自研的麒麟芯片。麒麟芯片近几年的成长速度我们也都看到了,甚至苹果在发布会上还与麒麟委托购买比特币合同是否有效?北京仲裁委比特币属虚拟财产,受法律保护华夏时报(www。chinatimes。net。cn)记者王永菲冉学东北京报道4月13日,北京仲裁委员会(下称北京仲裁委)判决一项委托管理比特币纠纷案件,北京仲裁委判决委托合同有效我国科研人员通过人工智能技术赋能生物医学复杂系统建模开启生物医学研究新范式国际顶尖学术期刊自然机器智能4月11日发表军事科学院军事医学研究院伯晓晨团队文章。文中提出一种基于图神经网络技术的转录因子调控网络建模方法。该方法可通过实验观测数据和计算分析方法重iPhone营销副总裁谈微距摄影大赛充分展现产品的潜力苹果公司表示,ShotoniPhone的微距摄影大赛证明,当用户拿到苹果的产品时,产品的真正潜力已经充分展现。最近,苹果宣布了其以微距拍摄为重点的ShotoniPhone挑战赛的1
比亚迪DMi混合动力系统2003年开始研发,2008年正式上市的混合动力车型比亚迪F3DM,是中国品牌首款量产插电式混合动力汽车。这款具有里程碑式意义的车型奠定了比亚迪在中国新能源汽车市场中的开拓者和引领究竟EHS电混系统有何奥秘呢?今天就让我为大家揭晓。2003年开始研发,2008年正式上市的混合动力车型比亚迪F3DM,是中国品牌首款量产插电式混合动力汽车。这款具有里程碑式意义的车型奠定了比亚迪在中国新能源汽车市场中的开拓者和引领比亚迪BYD,BuildYourDreams8月20日,由中国汽车工业协会主办,汽车之家承办的818中国汽车新消费论坛以线上的方式隆重召开。比亚迪品牌及公关事业部总经理李云飞发表演讲,他表示比亚迪愿意与更多上下游合作伙伴,连呼伦贝尔比亚迪F3限时特惠0。3万元欢迎试乘试驾忙碌的工作,使您倍加疲劳,是时候奖励自己一下了,比亚迪益丰祥泰店回馈客户大放价,09月28日09月28日,比亚迪F3降价6。28,奖励奋斗的自己,幸福有你更有礼促销时间2021年0评述丨新兴品牌闪迪大师优化内容创作流程,助力影视创意人士西部数据的品牌布局再一次细化。2021年8月18日,西部数据于上海电影博物馆发布了全新的SanDiskProfessional闪迪大师品牌,新品牌独自开辟出一个细分化的领域,将面向新能源汽车首选比亚迪。日前,我们从外媒获悉,比亚迪已经通过当地经销商开始向挪威首批客户交付七座版唐(参数询价)EV车型。新车在挪威的起售价格为59。99万挪威克朗,约合人民币44。1万元,相比国内市场补比亚迪宋MAX家庭型用车,进店享优惠宋MAX目前是比亚迪旗下最畅销的车型,每月销量超过1。4万台,足以用爆款来形容。宋MAX热销的背后,与该车极富表现力的DragonFace设计不无关系,该车设计语言出自一位知名德国比亚迪新能源汽车的领导者。日前,我们从外媒获悉,比亚迪已经通过当地经销商开始向挪威首批客户交付七座版唐(参数询价)EV车型。新车在挪威的起售价格为59。99万挪威克朗,约合人民币44。1万元,相比国内市场补比亚迪新能源好在哪里18月新能源车零售147。9万辆,同比增长202。1。与传统燃油车走势形成强烈差异化的特征,实现对燃油车市场的替代效应,并拉动车市向新能源化转型的步伐。主流合资品牌中的南北大众的新比亚迪超级混动汽车。2003年开始研发,2008年正式上市的混合动力车型比亚迪F3DM,是中国品牌首款量产插电式混合动力汽车。这款具有里程碑式意义的车型奠定了比亚迪在中国新能源汽车市场中的开拓者和引领宋MAX目前是比亚迪旗下最畅销的车型宋MAX目前是比亚迪旗下最畅销的车型,每月销量超过1。4万台,足以用爆款来形容。宋MAX热销的背后,与该车极富表现力的DragonFace设计不无关系,该车设计语言出自一位知名德国