目錄
- 一、Docker原生網路
- 1.橋接網路
- 2.host網路
- 3.none模式
- 二、Docker自定義網路
- 1.創建自定義網橋
- 2.雙網卡實作不同網段間通信
- 三、Docker容器通信
- 1.內部訪問外部
- 2.外部訪問內部
- 四、跨主機容器網路
- 1.跨主機同網段容器通信
- 2.跨主機不同網段容器通信
一、Docker原生網路
docker的鏡像是令人稱道的地方,但網路功能還是相對薄弱的部分,docker安裝后會自動創建3種網路:bridge、host、none;
首先將前面的harbor倉庫停掉

docker安裝時會創建一個名為 docker0 的Linux bridge,新建的容器會自動橋接到這個介面

1.橋接網路
主機可以直接訪問,外部主機是不可見的,容器通過宿主機的NAT規則后可以訪問外網,

安裝網橋管理工具包

查詢網橋資訊

運行一個容器查看橋接

洗掉掉容器之后,橋接又消失了!

2.host網路
host模式可以讓容器共享宿主機網路堆疊,這樣的好處是外部主機與容器直接通信,但是容器的網路缺少隔離性;

host網路模式需要在容器創建時指定 --network=host;
可以看到橋介面上沒有出現新的橋介面

我們查看埠,可以發現docker運行容器所使用的鏡像nginx占用的是80埠

這時如果再運行一個容器,起名為demo2,啟動之后,查看行程有兩個行程demo,demo2

但是很快再查看行程,demo2消失了,這是因為加上引數–network host會占用虛擬機的80埠,所以剛開始嘗試啟動會看到行程,但是會被demo的80埠擠掉demo2

查看日志

3.none模式
none模式是指禁用網路功能,只有lo介面,在容器創建時使用, --network=none指定;
先洗掉掉剛才創建的容器

重新運行容器,ip addr的可以看到只有lo介面

二、Docker自定義網路
1、自定義網路模式,docker提供了三種自定義網路驅動:bridge、overlay、macvlan;
bridge驅動類似默認的bridge網路模式,但增加了一些新的功能,overlay和macvlan是用于創建跨主機網路,
2、建議使用自定義的網路來控制哪些容器可以相互通信,還可以自動DNS決議容器名稱到IP地址,
先運行兩個容器

docker inspect : 獲取容器/鏡像的元資料,查看各自的ip


可以看到和docker 0處于同一網段

當容器停掉時,資源會釋放,重新啟動則會按照啟動順序分配動態ip;
啟動順序為先啟動demo2容器再demo1

此時demo2容器分到的ip是172.17.0.2

demo1容器分到的ip是172.17.0.3

運行busybox鏡像產生的容器,分配到的ip是172.17.0.4且容器可以相互ping通

洗掉容器

1.創建自定義網橋
查看型別為bridge

使用自定義網橋運行容器

再運行一個容器,發現可以ping 通demo1,說明這個模式是可以提供決議

還可以自己定義網段:在創建時指定引數:–subnet 、–gateway

查看資訊

使用–ip引數可以指定容器ip地址,但必須是在自定義網橋上,默認的bridge模式不支持,同一網橋上的容器是可以互通的


使用自定義網路再運行busybox鏡像產生的容器,測驗連通性

可以ping通

2.雙網卡實作不同網段間通信
創建一個新的自定義網路mynet1

分別用不同的自定義網路,啟動busybox鏡像容器

可以看到,橋接到不同網橋上的容器,彼此是不通信的,docker在設計上就是要隔離不同network的;
那么如何使兩個不同網橋的容器通信呢?可以使用 docker network connect命令為容器添加第二塊網卡

用mynet1啟動busybox鏡像容器

為該容器配置第二塊網卡;
docker attach :連接到正在運行中的容器,再查看其ip,已經有了另一網段的ip,且可以ping通了

三、Docker容器通信
容器之間除了使用ip通信外,還可以使用容器名稱通信,docker 1.10開始,內嵌了一個DNS server,dns決議功能必須在自定義網路中使用,啟動容器時使用 --name 引數指定容器名稱,
Joined容器一種較為特別的網路模式,在容器創建時使用–network=container:vm1指定,(vm1指定的是運行的容器名)

處于這個模式下的 Docker 容器會共享一個網路堆疊,這樣兩個容器之間可以使用localhost高效快速通信;

再運行一個容器

–link 可以用來鏈接2個容器;
–link的格式:
–link < name or id >:alias
name和id是源容器的name和id,alias是源容器在link下的別名;
測驗可以ping通

查看busybox的容器的域名決議檔案,看到demo對應的ip是172.17.0.2

停掉demo容器,用nginx鏡像重新運行一個容器test

此時這個容器被分配到172.17.0.2的ip

再啟動demo,查看ip


連接到運行中的busybox的容器,查看/etc/hosts,發現已經自動修改了決議

1.內部訪問外部
容器如何訪問外網是通過iptables的SNAT實作的;

可以看到路由轉發功能是開啟的

真機打開火墻,開啟地址偽裝

那么我們在容器里面可以ping百度

2.外部訪問內部
外網訪問容器用到了docker-proxy和iptables DNAT,宿主機訪問本機容器使用的是iptables DNAT,外部主機訪問容器或容器之間的訪問是docker-proxy實作;
運行容器,埠映射:-p 選項指定映射埠(訪問宿主機的80埠就相當于訪問Docker的80埠);
docker port :列出指定容器的埠映射

docker history nginx 也可以看到暴露的埠為80

iptables -L 列出所有規則


查看iptables DNAT目的地轉換規則


真機訪問宿主機的80埠,就可以成功訪問到容器

docker-proxy行程占用的就是80埠

將iptables里面目的地轉換規則的第六條洗掉




再次測驗,發現依然能訪問到nginx發布頁面

將docker-proxy行程殺掉

此時外網就無法訪問容器了

重新添加iptables策略


發現外網又可以訪問到容器

四、跨主機容器網路
1.跨主機同網段容器通信
跨主機網路解決方案:docker原生的overlay和macvlan,第三方的flannel、weave、calico,眾多網路方案是如何與docker集成在一起的,
libnetwork:docker容器網路庫
CNM (Container Network Model):這個模型對容器網路進行了抽象;
CNM分三類組件
Sandbox:容器網路堆疊,包含容器介面、dns、路由表,(namespace)
Endpoint:作用是將sandbox接入network (veth pair)
Network:包含一組endpoint,同一network的endpoint可以通信
ip link set eth1 promisc on:網卡監聽模式設為混雜模式;
打開之后,ip addr的eth0出現了promisc模式!!

將之前實驗的網路橋接都洗掉掉

同樣的打開server2的網卡混雜模式

創建macvlan1網路,并使用macvlan1網路運行busybox鏡像容器

server2匯入鏡像

同樣的server2也創建macvlan1網路
并使用macvlan1網路運行busybox鏡像容器,測驗可以相互ping通


2.跨主機不同網段容器通信
1、macvlan網路方案實作:Linux kernel提供的一種網卡虛擬化技術,無需Linux bridge,直接使用物理介面,性能極好,macvlan網路結構分析:沒有新建linux bridge,容器的介面直接與主機網卡連接,無需NAT或埠映射,
2、macvlan會獨占主機網卡,但可以使用vlan子介面實作多macvlan網路,vlan可以將物理二層網路劃分為4094個邏輯網路,彼此隔離,vlan id取值為1~4094,
3、macvlan網路間的隔離和連通:
macvlan網路在二層上是隔離的,所以不同macvlan網路的容器是不能通信的,可以在三層上通過網關將macvlan網路連通起來,docker本身不做任何限制,像傳統vlan網路那樣管理即可,
在兩臺docker主機上各添加一塊網卡


添加網卡之后,查看eth1可以看到沒有ip只是一個網卡;
ip link set up eth1讓它啟用

編輯網卡的組態檔

重新激活網卡;
發現已經激活但是promisc模式還沒有打開

開啟eth1的網卡混雜模式

server2也做相同的操作

server1和server2創建macvlan2網路


server1和server2使用macvlan2網路運行busybox鏡像容器

可以看到相互都可以ping通


server1以macvlan2的網路模式運行demo容器,如何使兩個不同網橋的容器通信呢;
使用 docker network connect命令為demo添加一塊macvlan1 的網卡

可以看到demo的資訊中會自動生成和 macvlan1同網段的ip:172.20.0.2

此時server2以macvlan1網路模式運行busybox鏡像容器,可以ping通server1以macvlan2的網路模式運行demo容器;
即不同網段的ip是無法互通的,但是兩個處于不同網段的容器可以通過docker network connect macvlan1 demo的方式來生成同一網段IP地址的方式來實作容器間的通信

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/293281.html
標籤:其他


