<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] ## 一 容器網絡的類型 Docker 網絡從覆蓋范圍可分為單個 host 上的容器網絡和跨多個 host 的網絡,多host網絡又分為原生網絡和第三方網絡,如下: * 原生單機網絡 * None:不為容器配置任何網絡功能,`--net=none ` * Host:與主機共享Network Namespace,`--net=host ` * Container:與另一個運行中的容器共享網絡名稱空間,`--net=container:ID ` * Bridge:Docker設計的,默認的NAT網絡模型,`--net=bridge` * 原生多機網絡 * overlay:基于vxlan的隧道網絡 * macvlan:基于網卡虛擬化的大局域網 * 第三方多機網絡[本章不討論] * flannel * weave * calico > 原生網絡和單機網絡都是通過不同的driver來實現的,未來可能還會有更多的開源driver ## 二 原生單機網絡 docker安裝好后,默認會創建三個網絡,分別是none,host和bridge,用docker network ls命令查看如下 ```sh [root@docker01 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 3cb9e3ca4456 bridge bridge local 4cc3166d4351 host host local f61ddbb4efdf none null local ``` ### A. none網絡 none 網絡就是什么都沒有的網絡。掛在這個網絡下的容器除了 lo,沒有其他任何網卡。容器創建時,可以通過?`--network=none`?指定使用 none 網絡。 ``` docker run -it --rm --network=none centos:6.9 [root@5fa702165cb2 /]# ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 ``` 封閉意味著隔離,一些對安全性要求高并且不需要聯網的應用可以使用 none 網絡。 比如某個容器的唯一用途是生成隨機密碼,就可以放到 none 網絡中避免密碼被竊取。 ### B. host網絡 連接到 host 網絡的容器共享 Docker host 的網絡棧,容器的網絡配置與 host 完全一樣。可以通過?`--network=host`?指定使用 host 網絡。 在容器中可以看到 host 的所有網卡,并且連 hostname 也是 host 的。 ``` docker run -it --rm --network=host busybox / # hostname docker01 / # ip l|egrep ^[1-9]|awk '{print $1,$2}' 1: lo: 2: eth0: 3: docker0: 9: vethccf4863@if8: ``` Docker host 的網絡最大的好處就是性能,如果容器對網絡傳輸效率有較高要求,可以選擇 host 網絡,但要考慮端口沖突問題 另一個用途是讓容器可以直接配置 host 網路。如某些跨 host 的網絡解決方案,本身也是以容器方式運行的,需要對網絡進行配置,比如管理 iptables ### C. Container網絡 container網絡嚴格來說并不是一種網絡類型,因為它只是讓一個容器使用主容器的網絡名稱空間,主容器的網絡是什么類型都不影響 1. 創建主容器并查看網卡信息 ```sh docker run -d --name bbx --rm busybox sleep 900 [root@docker01 ~]# docker exec -it bbx ip a|egrep eth0|awk '{print $1,$2}' 34: eth0@if35: inet 172.17.0.2/16 ``` 2. 創建新容器并使用主容器網絡 ```sh [root@docker01 ~]# docker run --network=container:bbx busybox ip a|grep eth0|awk '{print $1,$2}' 34: eth0@if35: inet 172.17.0.2/16 ``` 3. 用途說明 可以明顯看出來,上訴兩個容器使用的是同一個網卡,其他整個網絡名稱空間用的都是一個,用這種方式組織的容器,容器間通信十分便捷,效率也很高 ## 三 **bridge?網絡** ### A. bridge網絡入門解釋 如果不指定`--network`,創建的容器默認都會掛到?`docker0`?上,docker0是安裝時創建的linux bridge網絡(可以理解為NAT),可以用linux管理bridge的命令進行查看和管理 ```sh yum install bridge-utils docker container rm -f `docker container ls -a -q` [root@docker01 ~]# brctl show bridge name bridge id STP enabled interfaces docker0 8000.024277f99a61 no ``` 可以看到網橋docker0的信息,可以把docker0理解為一個虛擬交換機,現在這個交換機上沒有接設備,我們啟動一個容器看看結果 ```sh docker run -d --name bbx --rm busybox sleep 900 [root@docker01 ~]# brctl show bridge name bridge id STP enabled interfaces docker0 8000.024277f99a61 no veth0652c67 ``` 交換機docker0已近連接了虛擬接口對(veth pair)的接口`veth0652c67`,該虛擬接口對的另一個接口連接到了剛剛新建的容器bbx中 >veth pair 是一種成對出現的特殊網絡設備,可以想象成由一根虛擬網線連接起來的一對網卡,網卡的一頭在容器中,另一頭掛在網橋?`docker0`?上 ```sh [root@docker01 ~]# ip a|grep veth0652c67|awk '{print $1,$2}' 33: veth0652c67@if32: [root@docker01 ~]# docker exec -it bbx sh / # ip a|grep eth0|awk '{print $1,$2}' 32: eth0@if33: [root@docker01 ~]# docker network inspect bridge |grep -A1 Subnet "Subnet": "172.17.0.0/16", "Gateway": "172.17.0.1" ``` 上面代碼解釋說明: * docker主機中多了一塊網卡,編號33,名稱veth0652c67,對端網卡編號if32 * bbx容器中有一個網卡,編號32,名稱eth0,對端網卡邊哈if33,正好是一對 * 默認分配的IP地址段是`172.17.0.0/16`,網關IP就是docker0的IP ### B. bridge網絡自定義 默認的bridge網絡是自動創建的,已有的信息不能修改,但docker支持自定義新的bridge網絡,子網段、網關、是否自動分配等都可以自定義 1. 創建簡單的自定義bridge網絡 ```sh docker network create --driver bridge noah_net [root@docker01 ~]# brctl show bridge name bridge id STP enabled interfaces br-a83f1d0be49e 8000.0242e25e18d4 no docker0 8000.024277f99a61 no [root@docker01 ~]# docker network inspect noah_net |grep -A1 Subnet "Subnet": "172.18.0.0/16", "Gateway": "172.18.0.1" ``` 2. 創建自定義網段的bridge網絡 ```sh docker network create --driver bridge \ --subnet 192.168.4.0/24 \ --gateway 192.168.4.1 \ noah_net2 [root@docker01 ~]# docker network inspect noah_net2 |grep -A1 Subnet "Subnet": "192.168.4.0/24", "Gateway": "192.168.4.1" ``` 3. 使用自定義網絡創建容器 以上兩個自定義網絡創建好以后,創建容器時只要指定--network=xxx,就可以使用新的bridge網絡了. 使用`--subnet`創建的網絡,還可以通過--ip手動分配IP,非`--subnet`參數創建的網絡不能手動分配IP,會報錯 ```sh [root@docker01 ~]# docker run -it --rm --network=noah_net busybox ip addr|grep "172" inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0 [root@docker01 ~]# docker run -it --rm --network=noah-net2 --ip 192.168.4.99 busybox ip addr|grep "192" inet 192.168.4.99/24 brd 192.168.4.255 scope global eth0 ``` ### C. bridge網絡之間通信 先說結論: * 相同bridge網絡下的容器互相之間可以通過IP通信 * 不同bridge網絡下的容器互相之間不能通過IP通信 * 不同bridge網絡之間不能通過添加路由解決通信問題 * iptables DROP 掉了不同bridge網絡間的通信 基于以上原因,要解決不同bridge網絡之間的通信問題,常用的解決辦法就是為容器配置多個bridge的網卡,通過`docker network connect`?命令實現。 ```sh docker run -d --name bbx1 --network=noah_net busybox sleep 900 docker network connect noah-net2 bbx1 [root@docker01 ~]# docker exec -it bbx1 ip a|grep inet inet 127.0.0.1/8 scope host lo inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0 inet 192.168.4.2/24 brd 192.168.4.255 scope global eth1 [root@docker01 ~]# docker exec -it bbx1 ping -c1 192.168.4.1 PING 192.168.4.1 (192.168.4.1): 56 data bytes 64 bytes from 192.168.4.1: seq=0 ttl=64 time=0.192 ms ``` --- ## 四 macvlan網絡 ### A. 什么是macvlan: macvlan 本質上是一種網卡虛擬化技術 macvlan 本身是 linux kernel 模塊,允許在同一個物理網卡上配置多個 MAC 地址,即多個 interface,每個 interface 可以配置自己的 IP。 使用macvlan可以實現容器跨主機通信: ### B. 創建macvlan: 首先需要再開一臺虛擬機,創建好docker環境,然后兩臺機器都執行下列命令 ``` docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1 ``` >說明:docker不會為macvlan創建網關,所以這里的網關要事先存在 macvlan最好自己手動管理IP地址,不要自動分配,容易IP沖突 兩臺docker主機上分別創建容器測試: 1. docker01: `docker run -it --network macvlan_1 --ip=10.0.0.111 busybox:latest /bin/sh ` 2. docker02: `docker run -it --network macvlan_1 --ip=10.0.0.112 busybox:latest /bin/sh ` ## 五 overlay網絡 overlay網絡是基于 VxLAN 的 隧道網絡,VxLAN 可將二層數據封裝到 UDP 進行傳輸,VxLAN 提供與 VLAN 相同的以太網二層服務,但是擁有更強的擴展性和靈活性。 不同overlay網絡是互相隔離的,要相互通信的話,也是需要把容器加入多個網絡才行. Docerk overlay 網絡需要一個 key-value 數據庫用于保存網絡狀態信息,包括 Network、Endpoint、IP 等。Consul、Etcd 和 ZooKeeper 都支持,這里使用 Consul。 ### A. 環境準備工作 1. 分別修改docker配置文件 docker01、02上都增加如下配置在daemon.json文件中 ```sh vim /etc/docker/daemon.json { "cluster-store": "consul://10.0.0.11:8500", "cluster-advertise": "10.0.0.12:2376" } systemctl daemon-reload systemctl restart docker # cluster-store是consul的地址 # cluster-advertise是自己的地址 ``` 2. docker01上運行consul ```sh docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap ``` 運行成功后,可以訪問consul的web頁:http://10.0.0.11:8500/ui/#/dc1/kv/ ### B. overlay網絡功能測試 1. 創建overlay網絡(任意主機) 由于overlay信息會寫入數據庫,所以在docker02上創建overlay網絡,docker01上是可以看到的 ```sh [root@docker02 ~]# docker network create -d overlay olay-1 [root@docker01 ~]# docker network ls|grep olay-1 bda0ae8345d8 olay-1 overlay global [root@docker01 ~]# docker network inspect olay-1|grep -A1 Subnet "Subnet": "10.0.1.0/24", "Gateway": "10.0.1.1" ``` 2. 啟動容器測試 ```sh [root@docker01 ~]# docker run --rm --network olay-1 busybox ip a s|grep inet inet 127.0.0.1/8 scope host lo inet 10.0.1.2/24 brd 10.0.1.255 scope global eth0 inet 172.19.0.2/16 brd 172.19.255.255 scope global eth1 [root@docker02 ~]# docker run --rm --network olay-1 busybox ip a s|grep inet inet 127.0.0.1/8 scope host lo inet 10.0.1.2/24 brd 10.0.1.255 scope global eth0 inet 172.18.0.2/16 brd 172.18.255.255 scope global eth1 ``` 3. 測試結果說明 上面的結果中,每個容器都分別有eth0和eth1兩個網卡,其中eth0屬于overlay網絡,用于跨主機通信,eth1用于與宿主機通信 overlay網絡支持docker dns server,支持使用容器名進行通信 ### B. overlay IPAM docker 默認為 overlay 網絡分配 24 位掩碼的子網(10.0.X.0/24),所有主機共享這個 subnet,容器啟動時會順序從此空間分配 IP。當然我們也可以通過`--subnet`指定 IP 空間。 ``` docker network create -d overlay --subnet 10.22.1.0/24 ov_net3 ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看