您好,登錄后才能下訂單哦!
Docker啟動時, 會自動在主機上創建一個docker0虛擬網橋, 實際上是Linux的一個bridge,可以理解為一個軟件交換機, 它會而掛載到它的網口之間進行轉發 當創建一個Docker容器的時候, 同理會創建一對veth pair接口(當數據包發送到一個接口時, 另外一個接口也可以收到相同的數據包), 這對接口一端在容器內, 即eth0;另一端在本地并被掛載到docker0網橋, 名稱以veth開頭。
Docker容器的DNS和主機名
實際上容器中/etc目錄下有3個文件是容器啟動后被虛擬文件覆蓋掉的, 分別是/etc/hostname、 /etc/hosts、 /etc/resolve.conf,通過在容器中運行mount命令可以查看。
Docker容器的5種網絡模式
在使用docker run創建docker容器時, 可以用--net選項指定容器的網絡模式, Docker有以下5種網絡模式:
1. bridge模式
使用docker run --net=bridge指定, bridge模式是Docker默認的網絡設置, 此模式會為每一個容器分配Network Namespace、 設置IP等, 并將一個主機上的Docker容器連接到一個虛擬網橋上。 此模式與外界通信使用NAT協議, 增加了通訊的復雜性, 在復雜場景下使用會有諸多
限制。
route -n 查看 IP routing tables;
iptables -t nat -L -n 查看iptables rules.
2. host模式
使用docker run --net=host指定, 這種模式Docker Server將不為Docker容器創建網絡協議棧, 即不會創建獨立的network namespace,Docker容器中的進程處于宿主機的網絡環境中,相當于Docker容器的宿主機共用同一個network namespace,使用宿主機的網卡、 IP、 端口等信息。 此模式沒有網絡隔離性, 同時會引起網絡資源的競爭與沖突。
3. container模式
使用docker run --net=container:othercontainer_name指定, 這種模式與host模式相似, 指定新創建的容器和已經存在的某個容器共享同一個network namespace, 以下兩種模式都共享network namespace,區別就在于host模與宿主機共享, 而container模式與某個存在的容器共享。 在container模式下, 兩個容器的進程可以通過lo回環網絡設備通訊, 增加了容器間通訊的便利性和效率。 container模式的應用場景就在于可以將一個應用的多個組件放在不同的容器趾, 這些 容器配成container模式的網絡, 這樣它們可以作為一個整體對外提供服務。 同
時, 這種模式也降低了容器間的隔離性。
docker run -it --name helloworld busybox sh docker run -it --name helloword-con --
net=container:helloword busybox sh
4. none模式
使用docker run --net=none指定, 在這種模式下, Docker容器擁有自己的Network
Namespace, 但是, 并不為Docker容器進行任何網絡配置。 也就是說, 這個Docker容器沒有網卡、 IP、 路由等信息。 需要我們自己為Docker容器添加網卡、 配置IP等。 這種模式如果不進行特定的配置是無法正常使用的, 但它也給了用戶最大的自由度來自定義容器的網絡環境。
5. overlay模式
overlay網絡特點:
跨主機通訊
無需做端口映射
無需擔心IP沖突
服務發現與k/v存儲: etcd, consul
[root@localhost ~]# docker pull busybox
//下載一個busybox
[root@localhost ~]# docker network ls
//查看原生網絡
1.None:什么都沒有的網絡
[root@localhost ~]# docker run -itd --name none --network none busybox:latest
//根據busybox創建一個容器,網卡為none
[root@localhost ~]# docker exec -it none /bin/sh
//進入剛剛創建的容器
/ # ip a
//查看一下IP
用到None網絡的容器,會發現它只有一個Loop back回環的地址,沒有Mac地址,IP等信息,意味著他不能跟外界通信,是被隔離起來的網絡。需要我們自己為Docker容器添加網卡、 配置IP等。 這種模式如果不進行特定的配置是無法正常使用的, 但它也給了用戶最大的自由度來自定義容器的網絡環境。
使用場景:
隔離意味著安全,所以此網絡可以運行一些關于安全方面的驗證碼、效驗碼等服務。
2.Host網絡:基于宿主機的網絡
[root@localhost ~]# docker run -itd --name host --network host busybox:latest
//根據busybox創建一個容器,網卡為host
[root@localhost ~]# docker exec -it host /bin/sh
//進入剛剛創建的容器
/ # ip a
//查看一下IP
用到Host網絡的容器,它的網絡跟宿主機的網絡一模一樣,那是因為,在創建這個容器之初、并沒有對它的Net網絡棧進行隔離,而是直接使用的宿主機的網絡棧。
使用場景:
網絡配置與dockerHost完全相同,性能較好,但不便之處是靈活性不高,此模式沒有網絡隔離性,容器與宿主機出現端口沖突問題。
3.Bridge:橋接網絡
[root@localhost ~]# brctl show
//查看一下橋接網絡
docker0:在我們安裝docker這個服務的時候,默認就會生產- -張docker0的網卡,一般默認IP為172.17.0.1/16.
[root@localhost ~]# docker run -itd --name test1 busybox:latest
//根據busybox創建一個容器
[root@localhost ~]# docker exec -it test1 /bin/sh
//進入剛剛創建的容器
/ # ip a
//查看一下IP
/ # exit
//退出容器
[root@localhost ~]# ip a
//查看一下IP,*會發現多出一張網卡(docker0的網卡@容器中的if6)*
[root@localhost ~]# brctl show
//查看一下橋接網絡,*這里也多了一個網卡*
容器默認使用的網絡是docker0網絡,docker0此時相當于一個路由器,基于此網絡的容器,網段都是和docker0一致的。
自帶了-個ContainerDNSserver功能(域名解析)
1.bridge
[root@localhost ~]# docker network create -d bridge my_net
//創建一個名稱為my_net的bridge網絡
-d:設置網卡模式
[root@localhost ~]# ip a
//查看ip,會發現多了一個網卡
[root@localhost ~]# brctl show
//查看一下橋接網絡,這里也多了一個網卡
[root@localhost ~]# docker run -itd --name test3 --network my_net busybox:latest
//開啟一臺容器,網卡為剛剛創建的my_net
[root@localhost ~]# docker exec -it test3 /bin/sh
//進入剛剛創建的容器
/ # ip a
//查看一下IP
[root@localhost ~]# ip a
//查看ip,會發現多了一個網卡
[root@localhost ~]# brctl show
//查看一下橋接網絡,這里也多了一個網卡
[root@localhost ~]# docker run -itd --name test4 --network my_net busybox:latest
//開啟一臺容器,網卡為剛剛創建的my_net
[root@localhost ~]# docker exec -it test3 /bin/sh
/ # ping test4
//ping 剛剛創建的容器名稱
自定義網絡優點,它可以通過容器的名稱通信。
2.指定容器IP
[root@localhost ~]# docker run -itd --name t1 --network my_net --ip 172.18.0.8 busybox:latest
//開啟一個容器并指定IP
[root@localhost ~]# docker network create -d bridge --subnet 172.30.16.0/24 --gateway 172.30.16.1 my_net3
//創建一個自定義網絡,并且指定網關和網段
[root@localhost ~]# docker network ls
//查看網絡
[root@localhost ~]# ip a
如果想要給容器指定IP地址,那么自定義網絡的時候,必須指定網關gate和subnet網段選項。
開啟兩個容器測試一下
[root@localhost ~]# docker run -itd --name test5 --network my_net3 --ip 172.30.16.5 busybox:latest
//開啟一個容器test5并指定IP
[root@localhost ~]# docker exec -it test5 /bin/sh
/ # ip a
[root@localhost ~]# docker run -itd --name test6 --network my_net3 --ip 172.30.16.6 busybox:latest
//開啟一個容器test6并指定IP
[root@localhost ~]# docker exec -it test6 /bin/sh
/ # ip a
/ # ping test5
3.各網卡互通
[root@localhost ~]# iptables-save
//查看網卡信息的配置規則(可以看到防火墻的規則當另一個網卡信息來到自己這里時直接丟棄)
[root@localhost ~]# docker network connect my_net3 test4
//my_net3網卡橋接test4 (網卡名稱 容器名稱)
[root@localhost ~]# docker exec -it test5 /bin/sh
/ # ping test4
剩下的以此類推,然后就可以各個網卡互通了
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。