摘要:壞處是容器與其它容器端口沖突網(wǎng)絡(luò)這樣可以通過容器名去訪問,其原理是在容器中的中加入了主機(jī)名解析。原理在宿主機(jī)上是一個(gè)虛擬網(wǎng)橋,類似一個(gè)交換機(jī)的存在。
更多問題希望大家關(guān)注我的github: https://github.com/fanux
網(wǎng)絡(luò)概述端口映射:
$ docker run -p 8080:80 nginx:latest
如果沒有這個(gè)-p,會(huì)發(fā)現(xiàn)啟動(dòng)了nginx但是無法通過宿主機(jī)訪問到web服務(wù),而使用了-p參數(shù)后就可以通過訪問主機(jī)的8080斷開去訪問nginx了。
端口映射的原理是作了net轉(zhuǎn)發(fā)
共享主機(jī)網(wǎng)絡(luò):
$ docker run --net=host nginx:latest
這種容器沒有自己的網(wǎng)絡(luò),完全共享主機(jī)的網(wǎng)絡(luò),所以可以通過主機(jī)ip直接訪問容器服務(wù)。 壞處是容器與其它容器端口沖突
link網(wǎng)絡(luò)
$ docker run --name mysql mysql:latest $ docker run --link=mysql nginx:latest
這樣nginx可以通過容器名去訪問mysql,其原理是在nginx容器中的/etc/hosts中加入了mysql主機(jī)名解析。這種共享不可跨主機(jī)
$ docker run --rm -it --name c1 centos:latest /bin/bash
$ docker run --rm -it --name c2 --link c1 centos:latest /bin/bash [root@178d290d873c /]# 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.4 c1 3b7b15fa7e20 # 看這里 172.17.0.5 178d290d873c
none模式
容器不創(chuàng)建網(wǎng)絡(luò),需要自行定義
overlay網(wǎng)絡(luò)
進(jìn)群中常用的網(wǎng)絡(luò)模式,使用vxlan等技術(shù)作了一層覆蓋,使每個(gè)容器有自己獨(dú)立的ip并可跨主機(jī)通信。
共享容器網(wǎng)絡(luò)
如kubernetes里pod的實(shí)現(xiàn),pod是多個(gè)容器的集合,這些容器都共享了同一個(gè)容器的網(wǎng)絡(luò),那么這些容器就如同在一個(gè)host上一樣。
bridge原理在宿主機(jī)上ifconfig:
docker0: flags=4163mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0 inet6 fe80::42:a4ff:fe60:b79d prefixlen 64 scopeid 0x20 ether 02:42:a4:60:b7:9d txqueuelen 0 (Ethernet) RX packets 23465 bytes 3407255 (3.2 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 24676 bytes 22031766 (21.0 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 vethcd2d45d: flags=4163 mtu 1500 inet6 fe80::c4d6:dcff:fe7d:5f44 prefixlen 64 scopeid 0x20 ether c6:d6:dc:7d:5f:44 txqueuelen 0 (Ethernet) RX packets 415 bytes 82875 (80.9 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 372 bytes 379450 (370.5 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker0是一個(gè)虛擬網(wǎng)橋,類似一個(gè)交換機(jī)的存在。 veth開頭的網(wǎng)卡就是為容器分配的一個(gè)設(shè)備,但是要注意這不是容器中的設(shè)備。由于linux物理網(wǎng)卡只能出現(xiàn)在一個(gè)namespace中,所以只能用虛擬設(shè)備給容器創(chuàng)建獨(dú)立的網(wǎng)卡。
docker network inspect bridge 看一下,這是給容器內(nèi)部分配的地址:
"Containers": { "ac8c983592f06d585a75184b4dcd012338645fb7fa60b07c722f59ce43ceb807": { "Name": "sick_snyder", "EndpointID": "0755707344f30c40d686a2b4fdcabf45d6e1a64f8de8618b9a3a8c8e5b203ddc", "MacAddress": "02:42:ac:11:00:02", "IPv4Address": "172.17.0.2/16", "IPv6Address": "" } }
再引入一個(gè)概念:linux設(shè)備對(duì),類似管道一樣,在一端寫另一端就可以讀,容器內(nèi)的eth0就與這個(gè)veth是一對(duì)設(shè)備對(duì)
docker0 eth0 -> 宿主機(jī) --------------- ---- | | vethx vethy ---- ---- | | ---->設(shè)備對(duì) +----+---+ +----+---+ | eth0 | | eth0 | +--------+ +--------+ 容器1 容器2
單有這些還不夠,還需要iptables對(duì)包作一些處理,下文細(xì)說。有了這些理論,再去順著這個(gè)思路去讀網(wǎng)絡(luò)模塊的代碼
network namespace實(shí)踐使用ip命令,如果沒有的話安裝一下:yum install net-tools
基本命令:
ip netns add nstest # 創(chuàng)建一個(gè)net namespace ip netns list # 查看net namespace列表 ip netns delete nstest # 刪除 ip netns exec [ns name] command # 到對(duì)應(yīng)的ns里去執(zhí)行命令 ip netns exec [ns name] bash # 在ns中使用bash,需要要ns中做一系列操作時(shí)方便
開啟ns中的回環(huán)設(shè)備,以創(chuàng)建的nstest為例
ip netns exec nstest ip link set dev lo up
在主機(jī)上創(chuàng)建兩個(gè)虛擬網(wǎng)卡兩張網(wǎng)卡是linux設(shè)備對(duì)
ip link set add veth-a type veth peer name veth-b
添加veth-b到nstest中
ip link set veth-b netns nstest
驗(yàn)證:
[root@dev-86-208 ~]# ip netns exec nstest ip link 1: lo:mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 251: veth-b@if252: mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000 link/ether aa:0a:7d:01:06:d3 brd ff:ff:ff:ff:ff:ff link-netnsid 0
為網(wǎng)卡設(shè)置ip并啟動(dòng):
[root@dev-86-208 ~]# ip addr add 10.0.0.1/24 dev veth-a [root@dev-86-208 ~]# ip link set dev veth-a up [root@dev-86-208 ~]# ip netns exec nstest ip addr add 10.0.0.2/24 dev veth-b [root@dev-86-208 ~]# ip netns exec nstest ip link set dev veth-b up 設(shè)置完ip,自動(dòng)添加了這個(gè)路由 [root@dev-86-208 ~]# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default 10.1.86.1 0.0.0.0 UG 100 0 0 eth0 10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 veth-a # 目的地址是10.0.0.0/24的就從這張網(wǎng)卡發(fā)出 10.1.86.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0 172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-4b03f208bc30 ns里面的路由表 [root@dev-86-208 ~]# ip netns exec nstest ip route 10.0.0.0/24 dev veth-b proto kernel scope link src 10.0.0.2
驗(yàn)證相互ping:
[root@dev-86-208 ~]# ip netns exec nstest ping 10.0.0.1 PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data. 64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.043 ms 64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=0.032 ms [root@dev-86-208 ~]# ping 10.0.0.2 PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data. 64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.069 ms 64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.024 msDocker bridge的網(wǎng)絡(luò)
我們?nèi)?chuàng)建兩個(gè)ns(ns1 與 ns2)模擬兩個(gè)容器,創(chuàng)建四張網(wǎng)卡(兩對(duì)設(shè)備對(duì))模仿容器網(wǎng)卡。
brtest | +-------------+ |-veth1 <--|--> eth1 ns1 | | |-------------+ |-veth2 <--|--> eth1 ns2 | | +-------------+
再在宿主機(jī)上創(chuàng)建一個(gè)網(wǎng)橋brtest模擬docker0網(wǎng)橋,將veth1和veth2橋接到上面。
添加namespace:
[root@dev-86-208 ~]# ip netns add ns1 [root@dev-86-208 ~]# ip netns add ns2 [root@dev-86-208 ~]# ip netns list ns2 ns1 test1 (id: 3) nstest (id: 2) [root@dev-86-208 ~]# ip netns exec ns1 ip link set dev lo up [root@dev-86-208 ~]# ip netns exec ns2 ip link set dev lo up
添加網(wǎng)卡對(duì):
[root@dev-86-208 ~]# ip link add veth1 type veth peer name eth1 [root@dev-86-208 ~]# ip link set eth1 netns ns1 [root@dev-86-208 ~]# ip link add veth2 type veth peer name eth1 [root@dev-86-208 ~]# ip link set eth1 netns ns2 [root@dev-86-208 ~]# ip netns exec ns1 ip link 1: lo:mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 255: eth1@if256: mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000 link/ether ae:93:ba:2c:54:93 brd ff:ff:ff:ff:ff:ff link-netnsid 0 [root@dev-86-208 ~]# ip netns exec ns2 ip link 257: eth1@if258: mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000 link/ether 3a:a6:f3:27:9d:83 brd ff:ff:ff:ff:ff:ff link-netnsid 0 1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
配置地址:
[root@dev-86-208 ~]# ip netns exec ns1 ip addr add 172.17.1.1/24 dev eth1 [root@dev-86-208 ~]# ip netns exec ns2 ip addr add 172.17.1.2/24 dev eth1 [root@dev-86-208 ~]# ip netns exec ns1 ip link set dev eth1 up [root@dev-86-208 ~]# ip netns exec ns2 ip link set dev eth1 up
創(chuàng)建網(wǎng)橋:
[root@dev-86-208 ~]# brctl addbr brtest [root@dev-86-208 ~]# ifconfig brtest brtest: flags=4098mtu 1500 ether 1e:60:eb:c1:e6:d0 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@dev-86-208 ~]# brctl addif brtest veth1 [root@dev-86-208 ~]# brctl addif brtest veth2 [root@dev-86-208 ~]# ifconfig brtest up [root@dev-86-208 ~]# ifconfig veth1 up # 主機(jī)上這兩張網(wǎng)卡工作在數(shù)據(jù)鏈路層,因此不需要設(shè)置ip也能通 [root@dev-86-208 ~]# ifconfig veth2 up
恭喜兩個(gè)eth1之間可以通了:
[root@dev-86-208 ~]# ip netns exec ns1 ping 172.17.1.2 PING 172.17.1.2 (172.17.1.2) 56(84) bytes of data. 64 bytes from 172.17.1.2: icmp_seq=1 ttl=64 time=0.063 ms 64 bytes from 172.17.1.2: icmp_seq=2 ttl=64 time=0.022 ms [root@dev-86-208 ~]# ip netns exec ns2 ping 172.17.1.1 PING 172.17.1.1 (172.17.1.1) 56(84) bytes of data. 64 bytes from 172.17.1.1: icmp_seq=1 ttl=64 time=0.038 ms 64 bytes from 172.17.1.1: icmp_seq=2 ttl=64 time=0.041 ms
當(dāng)然想在主機(jī)上能ping通容器的話需要給brtest加ip:
[root@dev-86-208 ~]# ip addr add 172.17.1.254/24 dev brtest [root@dev-86-208 ~]# route -n # 上面動(dòng)作設(shè)置了路由 Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 172.17.1.0 0.0.0.0 255.255.255.0 U 0 0 0 brtest [root@dev-86-208 ~]# ping 172.17.1.1 PING 172.17.1.1 (172.17.1.1) 56(84) bytes of data. 64 bytes from 172.17.1.1: icmp_seq=1 ttl=64 time=0.046 ms 64 bytes from 172.17.1.1: icmp_seq=2 ttl=64 time=0.030 ms
以上操作就是docker bridge模式的模型
用ip命令配置docker網(wǎng)絡(luò)我們?nèi)绻枰獙?duì)容器網(wǎng)絡(luò)進(jìn)行配置,如修改ip地址,進(jìn)入到容器里面顯然不合適,而且有時(shí)不使用特權(quán)模式時(shí)是操作不了的,不過我們可以使用ip命令對(duì)其進(jìn)行操作。
docker run -itd --name test ubuntu:14.04 /bin/bash
這時(shí)namespace其實(shí)已經(jīng)建立了,不過使用ip命令看不到
docker inspect --format "{{ .State.Pid }}" test 3847 mkdir /var/run/netns # 如果不存在才創(chuàng)建 ln -s /proc/3847/ns/net /var/run/netns/test
測(cè)試:
# ip netns list test [root@dev-86-208 ~]# ip netns exec test1 ip link 1: lo:mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 253: eth0@if254: mtu 1500 qdisc noqueue state UP mode DEFAULT link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/27044.html
摘要:本屆大會(huì)仍然以交流云計(jì)算產(chǎn)業(yè)的最前沿技術(shù)探索和服務(wù)端開發(fā)運(yùn)維的最成熟實(shí)踐為宗旨,圍繞各講師過去一年內(nèi)的技術(shù)演變和項(xiàng)目實(shí)踐進(jìn)行互動(dòng)和分享。 showImg(https://segmentfault.com/img/bVsmUZ);ECUG 全稱為 Effective Cloud User Group (實(shí)效云計(jì)算用戶組),由七牛云 CEO 許式偉于 2007 年發(fā)起,集結(jié)了一批具有高端視...
摘要:可以指定一個(gè)已停止的容器,但是停止的容器不返回任何數(shù)據(jù)。但它并不意味著你的每個(gè)容器都能訪問那么多的內(nèi)存默認(rèn)時(shí)命令會(huì)每隔秒鐘刷新一次,如果只看當(dāng)前狀態(tài)指定查看某個(gè)容器的資源可以指定名稱或本文為容器監(jiān)控實(shí)踐系列文章,完整內(nèi)容見 前言 傳統(tǒng)虛機(jī)監(jiān)控一般采用類似Zabbix的方案,但容器出現(xiàn)之后,再使用Zabbix agent來采集數(shù)據(jù)的話就顯得有些吃力了,如果每個(gè)容器都像OS那樣監(jiān)控,則me...
閱讀 3943·2021-09-10 11:22
閱讀 2449·2021-09-03 10:30
閱讀 3738·2019-08-30 15:55
閱讀 2060·2019-08-30 15:44
閱讀 907·2019-08-30 15:44
閱讀 649·2019-08-30 14:04
閱讀 3127·2019-08-29 17:18
閱讀 1339·2019-08-29 15:04