成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

docker網(wǎng)絡(luò)高端實踐與原理解析

aaron / 1831人閱讀

摘要:壞處是容器與其它容器端口沖突網(wǎng)絡(luò)這樣可以通過容器名去訪問,其原理是在容器中的中加入了主機名解析。原理在宿主機上是一個虛擬網(wǎng)橋,類似一個交換機的存在。

更多問題希望大家關(guān)注我的github: https://github.com/fanux

網(wǎng)絡(luò)概述

端口映射:

$ docker run -p 8080:80 nginx:latest

如果沒有這個-p,會發(fā)現(xiàn)啟動了nginx但是無法通過宿主機訪問到web服務(wù),而使用了-p參數(shù)后就可以通過訪問主機的8080斷開去訪問nginx了。
端口映射的原理是作了net轉(zhuǎn)發(fā)

共享主機網(wǎng)絡(luò):

$ docker run --net=host nginx:latest

這種容器沒有自己的網(wǎng)絡(luò),完全共享主機的網(wǎng)絡(luò),所以可以通過主機ip直接訪問容器服務(wù)。 壞處是容器與其它容器端口沖突

link網(wǎng)絡(luò)

$ docker run --name mysql mysql:latest
$ docker run --link=mysql nginx:latest

這樣nginx可以通過容器名去訪問mysql,其原理是在nginx容器中的/etc/hosts中加入了mysql主機名解析。這種共享不可跨主機

$ 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ò)
進群中常用的網(wǎng)絡(luò)模式,使用vxlan等技術(shù)作了一層覆蓋,使每個容器有自己獨立的ip并可跨主機通信。

共享容器網(wǎng)絡(luò)

如kubernetes里pod的實現(xiàn),pod是多個容器的集合,這些容器都共享了同一個容器的網(wǎng)絡(luò),那么這些容器就如同在一個host上一樣。

bridge原理

在宿主機上ifconfig:

docker0: flags=4163  mtu 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是一個虛擬網(wǎng)橋,類似一個交換機的存在。 veth開頭的網(wǎng)卡就是為容器分配的一個設(shè)備,但是要注意這不是容器中的設(shè)備。由于linux物理網(wǎng)卡只能出現(xiàn)在一個namespace中,所以只能用虛擬設(shè)備給容器創(chuàng)建獨立的網(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": ""
    }
}

再引入一個概念:linux設(shè)備對,類似管道一樣,在一端寫另一端就可以讀,容器內(nèi)的eth0就與這個veth是一對設(shè)備對

           docker0         eth0 -> 宿主機
        ---------------    ----
         |          |
        vethx      vethy
        ----       ----
          |          |    ---->設(shè)備對
     +----+---+ +----+---+
     |  eth0  | |  eth0  |
     +--------+ +--------+
      容器1       容器2

單有這些還不夠,還需要iptables對包作一些處理,下文細(xì)說。有了這些理論,再去順著這個思路去讀網(wǎng)絡(luò)模塊的代碼

network namespace實踐

使用ip命令,如果沒有的話安裝一下:yum install net-tools

基本命令:

ip netns add nstest  # 創(chuàng)建一個net namespace
ip netns list        # 查看net namespace列表
ip netns delete nstest # 刪除
ip netns exec [ns name] command # 到對應(yīng)的ns里去執(zhí)行命令
ip netns exec [ns name] bash # 在ns中使用bash,需要要ns中做一系列操作時方便

開啟ns中的回環(huán)設(shè)備,以創(chuàng)建的nstest為例

ip netns exec nstest ip link set dev lo up

在主機上創(chuàng)建兩個虛擬網(wǎng)卡兩張網(wǎng)卡是linux設(shè)備對

ip link set add veth-a type veth peer name veth-b

添加veth-b到nstest中

ip link set veth-b netns nstest

驗證:

[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并啟動:

[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,自動添加了這個路由
[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

驗證相互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 ms
Docker bridge的網(wǎng)絡(luò)

我們?nèi)?chuàng)建兩個ns(ns1 與 ns2)模擬兩個容器,創(chuàng)建四張網(wǎng)卡(兩對設(shè)備對)模仿容器網(wǎng)卡。

 brtest
   |          +-------------+
   |-veth1 <--|--> eth1 ns1 |  
   |          |-------------+
   |-veth2 <--|--> eth1 ns2 |  
   |          +-------------+

再在宿主機上創(chuàng)建一個網(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)卡對:

[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=4098  mtu 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      # 主機上這兩張網(wǎng)卡工作在數(shù)據(jù)鏈路層,因此不需要設(shè)置ip也能通
[root@dev-86-208 ~]# ifconfig veth2 up

恭喜兩個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)然想在主機上能ping通容器的話需要給brtest加ip:

[root@dev-86-208 ~]# ip addr add 172.17.1.254/24 dev brtest

[root@dev-86-208 ~]# route -n # 上面動作設(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)绻枰獙θ萜骶W(wǎng)絡(luò)進行配置,如修改ip地址,進入到容器里面顯然不合適,而且有時不使用特權(quán)模式時是操作不了的,不過我們可以使用ip命令對其進行操作。

docker run -itd --name test ubuntu:14.04 /bin/bash

這時namespace其實已經(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

測試:

# 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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/27044.html

相關(guān)文章

  • ECUG Con 邀您共議服務(wù)端開發(fā)最深度實踐

    摘要:本屆大會仍然以交流云計算產(chǎn)業(yè)的最前沿技術(shù)探索和服務(wù)端開發(fā)運維的最成熟實踐為宗旨,圍繞各講師過去一年內(nèi)的技術(shù)演變和項目實踐進行互動和分享。 showImg(https://segmentfault.com/img/bVsmUZ);ECUG 全稱為 Effective Cloud User Group (實效云計算用戶組),由七牛云 CEO 許式偉于 2007 年發(fā)起,集結(jié)了一批具有高端視...

    dongxiawu 評論0 收藏0
  • 容器監(jiān)控實踐Docker原生

    摘要:可以指定一個已停止的容器,但是停止的容器不返回任何數(shù)據(jù)。但它并不意味著你的每個容器都能訪問那么多的內(nèi)存默認(rèn)時命令會每隔秒鐘刷新一次,如果只看當(dāng)前狀態(tài)指定查看某個容器的資源可以指定名稱或本文為容器監(jiān)控實踐系列文章,完整內(nèi)容見 前言 傳統(tǒng)虛機監(jiān)控一般采用類似Zabbix的方案,但容器出現(xiàn)之后,再使用Zabbix agent來采集數(shù)據(jù)的話就顯得有些吃力了,如果每個容器都像OS那樣監(jiān)控,則me...

    mushang 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<