国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

docker系列--網絡模式解讀

zollero / 654人閱讀

摘要:網絡主要是單機網絡和多主機通信模式。下面分別介紹一下的各個網絡模式。設計的網絡模型。是以對定義的元數據。用戶可以通過定義這樣的元數據來自定義和驅動的行為。

前言

理解docker,主要從namesapce,cgroups,聯合文件,運行時(runC),網絡幾個方面。接下來我們會花一些時間,分別介紹。

docker系列--namespace解讀

docker系列--cgroups解讀

docker系列--unionfs解讀

docker系列--runC解讀

docker系列--網絡模式解讀

namesapce主要是隔離作用,cgroups主要是資源限制,聯合文件主要用于鏡像分層存儲和管理,runC是運行時,遵循了oci接口,一般來說基于libcontainer。網絡主要是docker單機網絡和多主機通信模式。

本機網絡模式

我們在使用docker run創建Docker容器時,可以用--net選項指定容器的網絡模式,Docker有以下4種網絡模式:

host模式,使用--net=host指定。

container模式,使用--net=container:NAME_or_ID指定。

none模式,使用--net=none指定。

bridge模式,使用--net=bridge指定,默認設置。

下面分別介紹一下Docker的各個網絡模式。

1)none:不為容器配置任何網絡功能。
在該模式下,需要以--net=none參數啟動容器:

$ docker run --net=none -ti ubuntu:latest ip addr show
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default
    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
    inet6 ::1/128 scope host
        valid_lft forever preferred_lft forever

可以看到Docker容器僅有一lo環回接口,用戶使用--net=none啟動容器之后,仍然可以手動為容器配置網絡。

2)container:與另一個運行中的容器共享Network Namespace,共享相同的網絡視圖。
舉個例子,首先以默認網絡配置(bridge模式)啟動一個容器,設置hostname為dockerNet,dns為8.8.4.4。

$ docker run -h dockerNet --dns 8.8.4.4 -tid ubuntu:latest bash
d25864df1a3bbdd40613552197bd1a965acaf7f3dcb2673d50c875d4a303a67f
$ docker exec -ti d25864df1a3b bash
root@dockerNet:/# ip addr show
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default
        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
        inet6 ::1/128 scope host
            valid_lft forever preferred_lft forever
1739: eth0:  mtu 1500 qdisc noqueue state UP group default
        link/ether 02:42:ac:11:00:01 brd ff:ff:ff:ff:ff:ff
        inet 172.17.0.1/16 scope global eth0
            valid_lft forever preferred_lft forever
        inet6 fe80::42:acff:fe11:1/64 scope link
            valid_lft forever preferred_lft forever
root@dockerNet:/# cat /etc/resolv.conf
nameserver 8.8.4.4
root@dockerNet:/# exit
exit

然后以--net=container:d25864df1a3b方式啟動另一個容器:

$ docker run --net=container:d25864df1a3b -ti ubuntu:latest bash
root@dockerNet:/# ip addr show
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default
        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
        inet6 ::1/128 scope host
            valid_lft forever preferred_lft forever
1739: eth0:  mtu 1500 qdisc noqueue state UP group default
        link/ether 02:42:ac:11:00:01 brd ff:ff:ff:ff:ff:ff
        inet 172.17.0.1/16 scope global eth0
            valid_lft forever preferred_lft forever
        inet6 fe80::42:acff:fe11:1/64 scope link
            valid_lft forever preferred_lft forever
root@dockerNet:/# cat /etc/resolv.conf
nameserver 8.8.4.4

可以看到,使用--net=container:d25864df1a3b參數啟動的容器,其IP地址、DNS、hostname都繼承了容器d25864df1a3b。實質上兩個容器是共享同一個Network Namespace的,自然網絡配置也是完全相同。

3)host:與主機共享Root Network Namespace,容器有完整的權限可以操縱主機的協議棧、路由表和防火墻等,所以被認為是不安全的。
相應的,host模式啟動時需要指定--net=host參數。舉個例子:

$ docker run -ti --net=host ubuntu:latest bash
root@darcy-HP:/# ip addr show
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default
        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
        inet6 ::1/128 scope host
            valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc pfifo_fast state DOWN
group default qlen 1000
        link/ether 2c:41:38:9e:e4:d5 brd ff:ff:ff:ff:ff:ff
3: eth1:  mtu 1500 qdisc pfifo_fast state UP
group default qlen 1000
        link/ether 00:1b:21:cc:ee:6d brd ff:ff:ff:ff:ff:ff
        inet 10.110.52.38/22 brd 10.110.55.255 scope global eth1
            valid_lft forever preferred_lft forever
        inet6 fe80::21b:21ff:fecc:ee6d/64 scope link
            valid_lft forever preferred_lft forever
1642: docker0:  mtu 1500 qdisc noqueue state UP
group default
        link/ether 22:f2:f3:18:62:5d brd ff:ff:ff:ff:ff:ff
        inet 172.17.42.1/16 scope global docker0
            valid_lft forever preferred_lft forever
        inet6 fe80::348e:71ff:fe44:2d41/64 scope link
            valid_lft forever preferred_lft forever

host模式下,容器可以操縱主機的網絡配置,這是危險的,除非萬不得已,應該盡可能避免使用host模式。

4)bridge:Docker設計的NAT網絡模型。
Docker daemon啟動時會在主機創建一個Linux網橋(默認為docker0,可通過-b參數手動指定)。容器啟動時,Docker會創建一對veth pair(虛擬網絡接口)設備,veth設備的特點是成對存在,從一端進入的數據會同時出現在另一端。Docker會將一端掛載到docker0網橋上,另一端放入容器的Network Namespace內,從而實現容器與主機通信的目的。bridge模式下的網絡拓撲圖如下圖所示。

在橋接模式下,Docker容器與Internet的通信,以及不同容器之間的通信,都是通過iptables規則控制的。
總之,Docker網絡的初始化動作包括:創建docker0網橋、為docker0網橋新建子網及路由、創建相應的iptables規則等。

跨主機通信模式

docker在跨主機通信方面一直比較弱。目前主要有容器網絡模型(CNM)和容器網絡接口(CNI),下面我們分別介紹。當然k8s和docker之間通信采納的是CNI。

CNM模式

CNM是一個被 Docker 提出的規范?,F在已經被Cisco Contiv, Kuryr, Open Virtual Networking (OVN), Project Calico, VMware 和 Weave 這些公司和項目所采納。

Libnetwork是CNM的原生實現。它為Docker daemon和網絡驅動程序之間提供了接口。網絡控制器負責將驅動和一個網絡進行對接。每個驅動程序負責管理它所擁有的網絡以及為該網絡提供的各種服務,例如IPAM等等。由多個驅動支撐的多個網絡可以同時并存。網絡驅動可以按提供方被劃分為原生驅動(libnetwork內置的或Docker支持的)或者遠程驅動 (第三方插件)。原生驅動包括 none, bridge, overlay 以及 MACvlan。驅動也可以被按照適用范圍被劃分為本地(單主機)的和全局的 (多主機)。

『Network Sandbox』– 一個容器內部的網絡棧。

『Endpoint』– 一個通常成對出現的網絡接口。一端在網絡容器內,另一端在網絡內。 一個Endpoints可以加入一個網絡。一個容器可以有多個endpoints。

『Network』– 一個endpoints的集合。該集合內的所有endpoints可以互聯互通。

最后,CNM還支持標簽(labels)。Lable是以key-value對定義的元數據。用戶可以通過定義label這樣的元數據來自定義libnetwork和驅動的行為。

API使用步驟

接著我們看下一般使用libnetwork的方法,具體的步驟一般是下面這樣的:

(1)獲取一個NetworkController對象用于進行下面的操作。獲取對象的時候指定Driver。

(2)通過NetworkController對象的NewNetwork()建立一個網絡。這里最簡單的理解就是現在我們有了一個bridge了。

(3)通過網絡的CreateEndpoint()在這個網絡上建立Endpoint。這里最簡單的理解就是每建立一個Endpoint,我們上面建立的bridge上就會多出一個VIF口等著虛擬機或者Sandbox連上來。假設這里使用的是veth,則veth的一頭目前接在了bridge中,另一頭還暴露在外面。

(4) 調用上面建立的Endpoint的Join方法,提供容器信息,于是libnetwork的代碼就會建立一個Sandbox對象(一般這里的Sandbox就是容器的namespace,所以不會重復建立),然后將第三步建立的veth的一頭接入到這個Sandbox中,也就是將其放到Sandbox的namespace中。

(5)當Sandbox的生命周期結束時,調用Endpoint的Leave方法使其從這個Network中解綁。簡單的說就是將veth從Sandbox的namespace中拿出來回到物理機上。

(6)如果一個Endpoint無用了,則可以調用Delete方法刪除。

(7)如果一個Network無用了,則可以調用Delete方法刪除。

CNI模式

CNI(Conteinre Network Interface) 是 google 和 CoreOS 主導制定的容器網絡標準,它 本身并不是實現或者代碼,可以理解成一個協議。這個標準是在 rkt 網絡提議 的基礎上發展起來的,綜合考慮了靈活性、擴展性、ip 分配、多網卡等因素。

這個協議連接了兩個組件:容器管理系統和網絡插件。它們之間通過 JSON 格式的文件進行通信,實現容器的網絡功能。具體的事情都是插件來實現的,包括:創建容器網絡空間(network namespace)、把網絡接口(interface)放到對應的網絡空間、給網絡接口分配 IP 等等。

CNI本身實現了一些基本的插件(https://github.com/containern..., 比如bridge、ipvlan、macvlan、loopback、vlan等網絡接口管理插件,還有dhcp、host-local等IP管理插件,并且主流的container網絡解決方案都有對應CNI的支持能力,比如Flannel、Calico、Weave、Contiv、SR-IOV、Amazon ECS CNI Plugins等。

具體Flannel的分析可以閱讀我之前的文章(k8s與網絡--Flannel解讀)。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/27448.html

相關文章

  • docker系列--網絡模式解讀

    摘要:網絡主要是單機網絡和多主機通信模式。下面分別介紹一下的各個網絡模式。設計的網絡模型。是以對定義的元數據。用戶可以通過定義這樣的元數據來自定義和驅動的行為。 前言 理解docker,主要從namesapce,cgroups,聯合文件,運行時(runC),網絡幾個方面。接下來我們會花一些時間,分別介紹。 docker系列--namespace解讀 docker系列--cgroups解讀 ...

    haitiancoder 評論0 收藏0
  • docker系列--網絡模式解讀

    摘要:網絡主要是單機網絡和多主機通信模式。下面分別介紹一下的各個網絡模式。設計的網絡模型。是以對定義的元數據。用戶可以通過定義這樣的元數據來自定義和驅動的行為。 前言 理解docker,主要從namesapce,cgroups,聯合文件,運行時(runC),網絡幾個方面。接下來我們會花一些時間,分別介紹。 docker系列--namespace解讀 docker系列--cgroups解讀 ...

    xiaotianyi 評論0 收藏0
  • docker系列--cgroups解讀

    摘要:系列解讀系列解讀系列解讀系列解讀系列網絡模式解讀主要是隔離作用,主要是資源限制,聯合文件主要用于鏡像分層存儲和管理,是運行時,遵循了接口,一般來說基于。凍結暫停中的進程。配置時間都以微秒為單位,文件名中用表示。 前言 理解docker,主要從namesapce,cgroups,聯合文件,運行時(runC),網絡幾個方面。接下來我們會花一些時間,分別介紹。 docker系列--name...

    岳光 評論0 收藏0
  • docker系列--cgroups解讀

    摘要:系列解讀系列解讀系列解讀系列解讀系列網絡模式解讀主要是隔離作用,主要是資源限制,聯合文件主要用于鏡像分層存儲和管理,是運行時,遵循了接口,一般來說基于。凍結暫停中的進程。配置時間都以微秒為單位,文件名中用表示。 前言 理解docker,主要從namesapce,cgroups,聯合文件,運行時(runC),網絡幾個方面。接下來我們會花一些時間,分別介紹。 docker系列--name...

    cikenerd 評論0 收藏0
  • docker系列--cgroups解讀

    摘要:系列解讀系列解讀系列解讀系列解讀系列網絡模式解讀主要是隔離作用,主要是資源限制,聯合文件主要用于鏡像分層存儲和管理,是運行時,遵循了接口,一般來說基于。凍結暫停中的進程。配置時間都以微秒為單位,文件名中用表示。 前言 理解docker,主要從namesapce,cgroups,聯合文件,運行時(runC),網絡幾個方面。接下來我們會花一些時間,分別介紹。 docker系列--name...

    alogy 評論0 收藏0

發表評論

0條評論

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