A. 如何在 Docker 容器之間設置網路
在你的宿主機啟動docker的時候會多出一個docker0的虛擬網卡,然後容器都通過這個和外面通信。容器和docker宿主機之間是NAT的方式共享網路的,也就是說宿主機可以訪問的資源,容器也是可以直接訪問,你要使用apt-get,你就要保證你的宿主機可以上外網,否則免談。
B. 請教docker有什麼好方法,給容器映射一個外部可以獨立訪問的ip
綁定公網IP有多種方法:
1、把埠用 --publish forward 進容器里,或者說把埠發布出來。如 docker run -p 80:80 nginx
2、把某個虛擬或物理 interface bridge 進容器里,可以用一個叫 pipework 的工具:
3、直接不對容器網路做虛擬化/隔離,用 --net=host
浮動IP
浮動IP目前沒有成熟的方案,在我看來,一個是自己寫agent來通過iptables自動完成漂移,另一個是寄希望於官方的libnetwork
C. vmware下的linux伺服器怎樣才能讓外網訪問
1、明確LINUX伺服器內網訪問地址埠,確保LINUX伺服器正常開啟SSH服務,在內網SSH可以正常訪問連接。
D. 請教docker有什麼好方法,給容器映射一個外部可以獨立訪問的ip
要重新再獲得被分配IP地址,可以在客戶端主機的DOC下(在[開始]-[運行]里輸入「cmd」或點擊附件里的[命令提示符]就可以進入)
輸入命令 ipconfig/release (釋放掉你獲得的IP)
然後 ipconfig/renew(重新到DHCP伺服器那裡獲得IP)
A類是第1段1-126,B類第1段是128-191,C類第1段就是192-223
A、B類被作為外網地址,C類被用做區域網地址。
你要連通外網後A、B類的都是網路經營商擁有的,你得花錢租的。
DHCP有一定的記憶性,如果只連一台計算機,肯定經常出現總分配同1個地址,或差不多的地址,以求網路的穩定,並節省消耗。
E. centos下docker容器外網怎麼訪問
當前Ubuntu 系統下的 Docker 的安裝包只提供64位。如果你想運行32位的 Docker,你需要。 安裝 Docker 通過 apt-get 安裝 Docker 簡直是小菜一碟。 $ sudo apt-get install docker.io 如果你不是 root 組的用戶,你可以把自己加入到 docker 用戶...
F. 如何在 Docker 容器之間設置網路
在使用 weave 之前,你需要在所有宿主機上安裝 Docker 環境,參考這些教程,在 Ubuntu 或 CentOS/Fedora 發行版中安裝 Docker。
Docker 環境部署完成後,使用下面的命令安裝 weave:
$ wget chmod a+x weave$ sudo cp weave /usr/local/bin
注意你的 PATH 環境變數要包含 /usr/local/bin 這個路徑,請在 /etc/profile 文件中加入一行(LCTT 譯註:要使環境變數生效,你需要執行這個命令: source /etc/profile):
export PATH="$PATH:/usr/local/bin"
在每台宿主機上重復上面的操作。
Weave 在 TCP 和 UDP 上都使用 6783 埠,如果你的系統開啟了防火牆,請確保這兩個埠不會被防火牆擋住。
在每台宿主機上啟動 Weave 路由器
當你想要讓處於在不同宿主機上的容器能夠互相通信,第一步要做的就是在每台宿主機上啟動 weave 路由器。
第一台宿主機,運行下面的命令,就會創建並開啟一個 weave 路由器容器(LCTT 譯註:前面說過了,weave 路由器也是一個容器):
$ sudo weave launch
第一次運行這個命令的時候,它會下載一個 weave 鏡像,這會花一些時間。下載完成後就會自動運行這個鏡像。成功啟動後,終端會輸出這個 weave 路由器的 ID 號。
下面的命令用於查看路由器狀態:
$ sudo weave status
第一個 weave 路由器就緒了,目前為止整個 peer 對等網路中只有一個 peer 成員。
你也可以使用 docker 的命令來查看 weave 路由器的狀態:
$ docker ps
第二台宿主機部署步驟稍微有點不同,我們需要為這台宿主機的 weave 路由器指定第一台宿主機的 IP 地址,命令如下:
$ sudo weave launch <first-host-IP-address>
當你查看路由器狀態,你會看到兩個 peer 成員:當前宿主機和第一個宿主機。
當你開啟更多路由器,這個 peer 成員列表會更長。當你新開一個路由器時,要指定前一個宿主機的 IP 地址,請注意不是第一個宿主機的 IP 地址(LCTT 譯註:鏈狀結構)。
現在你已經有了一個 weave 網路了,它由位於不同宿主機的 weave 路由器組成。
把不同宿主機上的容器互聯起來
接下來要做的就是在不同宿主機上開啟 Docker 容器,並使用虛擬網路將它們互聯起來。
假設我們創建一個私有網路 10.0.0.0/24 來互聯 Docker 容器,並為這些容器隨機分配 IP 地址。
如果你想新建一個能加入 weave 網路的容器,你就需要使用 weave 命令來創建,而不是 docker 命令。原因是 weave 命令內部會調用 docker 命令來新建容器然後為它設置網路。
下面的命令是在宿主機 hostA 上建立一個 Ubuntu 容器,然後將它放到 10.0.0.0/24 網路中,分配的 IP 地址為 10.0.0.1:
hostA:~$ sudo weave run 10.0.0.1/24 -t -i ubuntu
成功運行後,終端會顯示出容器的 ID 號。你可以使用這個 ID 來訪問這個容器:
hostA:~$ docker attach <container-id>
在宿主機 hostB 上,也創建一個 Ubuntu 容器,IP 地址為 10.0.0.2:
hostB:~$ sudo weave run 10.0.0.2/24 -t -i ubuntu
訪問下這個容器的控制台:
hostB:~$ docker attach <container-id>
這兩個容器能夠互相 ping 通,你可以通過容器的控制台檢查一下。
如果你檢查一下每個容器的網路配置,你會發現有一塊名為「ethwe」的網卡,你分配給容器的 IP 地址出現在它們那裡(比如這里分別是 10.0.0.1 和 10.0.0.2)。
Weave 的其他高級用法
weave 提供了一些非常巧妙的特性,我在這里作下簡單的介紹。
應用分離
使用 weave,你可以創建多個虛擬網路,並為每個網路設置不同的應用。比如你可以為一群容器創建 10.0.0.0/24 網路,為另一群容器創建 10.10.0.0/24 網路,weave 會自動幫你維護這些網路,並將這兩個網路互相隔離。另外,你可以靈活地將一個容器從一個網路移到另一個網路而不需要重啟容器。舉個例子:
首先開啟一個容器,運行在 10.0.0.0/24 網路上:
$ sudo weave run 10.0.0.2/24 -t -i ubuntu
然後讓它脫離這個網路:
$ sudo weave detach 10.0.0.2/24 <container-id>
最後將它加入到 10.10.0.0/24 網路中:
$ sudo weave attach 10.10.0.2/24 <container-id>
現在這個容器可以與 10.10.0.0/24 網路上的其它容器進行通信了。這在當你創建一個容器而網路信息還不確定時就很有幫助了。
將 weave 網路與宿主機網路整合起來
有時候你想讓虛擬網路中的容器能訪問物理主機的網路。或者相反,宿主機需要訪問容器。為滿足這個功能,weave 允許虛擬網路與宿主機網路整合。
舉個例子,在宿主機 hostA 上一個容器運行在 10.0.0.0/24 中,運行使用下面的命令:
hostA:~$ sudo weave expose 10.0.0.100/24
這個命令把 IP 地址 10.0.0.100 分配給宿主機 hostA,這樣一來宿主機 hostA 也連到了 10.0.0.0/24 網路上了。顯然,你在為宿主機選擇 IP 地址的時候,需要選一個沒有被其他容器使用的地址。
現在 hostA 就可以訪問 10.0.0.0/24 上的所有容器了,不管這些容器是否位於 hostA 上。好巧妙的設定啊,32 個贊!
G. docker 容器的網路設為host, 其他容器怎麼訪問
容器設置為host網路模式,是復用了主機網路來運行容器,直接訪問主機 IP 就可以了。
H. k8s 網路基礎
author:sufei
說明:本文主要記錄在學習k8s網路方面的相關知識
Linux在內核網路棧中引入網路命名空間,將 獨立的網路協議棧隔離 到不同的命令空間中,彼此間無法通信;
1、Linux操作系統,解析和封裝網路包是通過一個網路協議棧完成,下層為上層服務,這個 協議棧中即包括如軟體也包括硬體網路設 備。網路命名空間就是以軟體方式隔離出單獨的網路棧信息;
2、不同network namespace的軟硬體資源相互不可見,好像處在物理隔離的不同物理機上一樣,彼此隔離;
3、不同的網路命名空間會有自己獨立的網卡、路由表、ARP 表、iptables 等和網路相關的資源
4、實驗:可以藉助 ip netns 命令來完成對 Network Namespace 的各種操作,如:
問題 :什麼是轉移設備?
可以在不同的 Network Namespace 之間轉移設備(如veth)。由於一個設備只能屬於一個 Network Namespace ,所以轉移後在這個 Network Namespace 內就看不到這個設備了。 veth設備屬於可轉移設備 ,而很多其它設備(如lo、bridge等)是不可以轉移的。
veth pair 全稱是 Virtual Ethernet Pair,是一個成對的埠,所有從這對埠一 端進入的數據包都將從另一端出來,反之也是一樣。而veth pair就是為了在不同的 Network Namespace 直接進行通信,利用它可以直接將兩個 Network Namespace 連接起來。
實驗
veth pair打破了 Network Namespace 的限制,實現了不同 Network Namespace 之間的通信。但veth pair有一個明顯的缺陷,就是只能實現兩個網路介面之間的通信。如果我們想實現多個網路介面之間的通信,就可以使用下面介紹的網橋(Bridge)技術( 類似於物理交換機 )。
簡單來說,網橋就是把一台機器上的若干個網路介面「連接」起來。其結果是,其中一個網口收到的報文會被復制給其他網口並發送出去。以使得網口之間的報文能夠互相轉發。
網橋是一個二層網路設備,通過網橋可以將linux支持的不同的埠連接起來,並實現類似交換機那樣的多對多的通信。
實驗:
Netfilter負責在內核中執行各種掛接的規則(過濾、修改、丟棄等),運行在內核 模式中;Iptables模式是在用戶模式下運行的進程,負責協助維護內核中Netfilter的各種規則表;通過二者的配合來實現整個Linux網路協議棧中靈活的數據包處理機制。
iptables/netfilter(簡稱iptables)組成了Linux平台下的包過濾防火牆,可以完成封包過濾、封包重定向和網路地址轉換(NAT)等功能。這部分主要了解兩部分知識:
應用層不管是要發送還是接收網路消息,都需要通過linux內核提供的一系列關卡。每個」關卡「擔負著不同的工作。這里的」關卡「被稱為」鏈「。如下圖:
Docker啟動一個容器時會根據Docker網橋的網段分配給容器一個IP地址,稱為Container-IP,同時Docker網橋是每個容器的默認網關(如上面的172.17.0.1)。因為在同一宿主機內的容器都接入同一個網橋,這樣容器之間就能夠通過容器的Container-IP直接通信。
Docker網橋是宿主機虛擬出來的,並不是真實存在的網路設備,外部網路是無法定址到的,這也意味著外部網路無法通過直接Container-IP訪問到容器。如果容器希望外部訪問能夠訪問到,可以通過映射容器埠到宿主主機(埠映射),即docker run創建容器時候通過 -p 或 -P 參數來啟用,訪問容器的時候就通過[宿主機IP]:[容器埠]訪問容器。
下面具體來說說docker容器的幾種網路模式,以便後續學習k8s網路。
在host模式下( –net=host),容器不會去建立新的網路命名空間,而直接使用宿主機的網路設備以及網路協議棧。這樣自然不會虛擬出自己的網卡,配置自己的IP等。其特點如下:
這個模式就是在創建容器時,指定網路(–net=container:NAME_or_ID)與之前容器在同一個網路命名空間中,而不是和宿主機共享(這也就是k8s中pod內各容器的一種網路模式)。下面說明幾點:
none模式(–net=none)Docker容器擁有自己的Network Namespace,但是,並不為Docker容器進行任何網路配置。也就是說,這個Docker容器沒有網卡、IP、路由等信息。需要我們自己為Docker容器添加網卡、配置IP等。
bridge模式是docker容器的默認模式,當Docker進程啟動時,會在主機上創建一個名為docker0的虛擬網橋,此主機上啟動的Docker容器在bridge模式下會連接到這個虛擬網橋上,並由網橋自動分配ip。虛擬網橋的工作方式和物理交換機類似,這樣主機上的所有容器就通過交換機連在了一個二層網路中。
下面說明這個模式下的工作方式:
首先我們來看看k8s想要一個什麼樣的網路,也就是k8s網路設計的要求,具體如下:
下面簡單從幾中不同的通信要求來看看k8s網路實現。
在 Kubernetes 的世界裡,IP 是以 Pod 為單位進行分配的。一個 Pod 內部的所有容器共享一個網路堆棧。實際上就是docker container網路模式。可以直接通過本地localhost進行網路訪問。這個模式在mysql容器化中就是agent容器與mysql容器的網路通信方式。
Pod1和Pod2都是通信veth pair連接到同一個docker0網橋上,它們的IP地址都是從docker0網段上動態獲取的,它們和網橋本身的IP是同一個網段的。可以通過docker0作為交換機進行通信,也就是採用的docker bridge網路模式進行通信。
由於在同一個網橋docker0上即可以保證分配的pod IP不會沖突,且可以相互通信,而如果需要跨Node物理節點,則無法通過docker網路直接滿足要求了,那這些要求具體有哪些呢?
解決方案
方法一:k8s中通過在etcd中記錄正在運行中pod的IP分配信息,這樣我們就可以滿足Pod IP與Node IP之間映射關系的記錄;
方法二:可以在etcd中規劃配置好所有主機docker0網橋的子網范圍,從而滿足Pod IP不沖突的要求;如:
方法三:要實現Pod跨Node通信,以k8s默認網路Flannel為例,就是採用overlay(覆蓋網路)實現。具體下面說明:
問題:什麼是覆蓋網路?
覆蓋網路就是應用層網路,是指建立在另一個網路上的網路。怎麼理解呢?簡單理解就是將TCP數據包裝在另一種網路包裡面進行路由轉發和通信,另一種網路包目前可以是UDP、VxLAN、AWS VPC和GCE路由等數據轉發方式。默認以UDP為例來說明flannel工作方式。
下面看看具體實現
問題 :為保證各node內docker容器分配的ip地址不沖突,每個節點上的Docker會使用不同的IP地址段?如何實現的呢?
問題 :為什麼在發送節點上的數據會從docker0路由到flannel0虛擬網卡,在目的節點會從flannel0路由到docker0虛擬網卡?