⑴ 如何進行Docker網路配置
在你的宿主機啟動docker的時候會多出一個 docker0 的虛擬網卡,然後容器都通過這個和外面通信。容器和docker宿主機之間是NAT的方式共享網路的,也就是說宿主機可以訪問的資源,容器也是可以直接訪問,你要使用apt-get,你就要保證你的宿主機可以上外網,否則免談。
⑵ 如何在 docker 容器之間設置網路
在使用weave之前,你需要在所有宿主機上安裝Docker環境,參考這些教程,在Ubuntu或CentOS/Fedora發行版中安裝Docker。Docker環境部署完成後,使用下面的命令安裝weave:$wget/zettio/weave/releases/download/latest_release/weave$chmoda+xweave$sudocpweave/usr/local/bin注意你的PATH環境變數要包含/usr/local/bin這個路徑,請在/etc/profile文件中加入一行(LCTT譯註:要使環境變數生效,你需要執行這個命令:source/etc/profile):exportPATH="$PATH:/usr/local/bin"在每台宿主機上重復上面的操作。Weave在TCP和UDP上都使用6783埠,如果你的系統開啟了防火牆,請確保這兩個埠不會被防火牆擋住。在每台宿主機上啟動Weave路由器當你想要讓處於在不同宿主機上的容器能夠互相通信,第一步要做的就是在每台宿主機上啟動weave路由器。第一台宿主機,運行下面的命令,就會創建並開啟一個weave路由器容器(LCTT譯註:前面說過了,weave路由器也是一個容器):$sudoweavelaunch第一次運行這個命令的時候,它會下載一個weave鏡像,這會花一些時間。下載完成後就會自動運行這個鏡像。成功啟動後,終端會輸出這個weave路由器的ID號。下面的命令用於查看路由器狀態:$sudoweavestatus第一個weave路由器就緒了,目前為止整個peer對等網路中只有一個peer成員。你也可以使用docker的命令來查看weave路由器的狀態:$dockerps第二台宿主機部署步驟稍微有點不同,我們需要為這台宿主機的weave路由器指定第一台宿主機的IP地址,命令如下:$sudoweavelaunch當你查看路由器狀態,你會看到兩個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:~$sudoweaverun10.0.0.1/24-t-iubuntu成功運行後,終端會顯示出容器的ID號。你可以使用這個ID來訪問這個容器:hostA:~$dockerattach在宿主機hostB上,也創建一個Ubuntu容器,IP地址為10.0.0.2:hostB:~$sudoweaverun10.0.0.2/24-t-iubuntu訪問下這個容器的控制台:hostB:~$dockerattach這兩個容器能夠互相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網路上:$sudoweaverun10.0.0.2/24-t-iubuntu然後讓它脫離這個網路:$sudoweavedetach10.0.0.2/24最後將它加入到10.10.0.0/24網路中:$sudoweaveattach10.10.0.2/24現在這個容器可以與10.10.0.0/24網路上的其它容器進行通信了。這在當你創建一個容器而網路信息還不確定時就很有幫助了。將weave網路與宿主機網路整合起來有時候你想讓虛擬網路中的容器能訪問物理主機的網路。或者相反,宿主機需要訪問容器。為滿足這個功能,weave允許虛擬網路與宿主機網路整合。舉個例子,在宿主機hostA上一個容器運行在10.0.0.0/24中,運行使用下面的命令:hostA:~$sudoweaveexpose10.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個贊
⑶ docker 容器的網路設為host, 其他容器怎麼訪問
容器設置為host網路模式,是復用了主機網路來運行容器,直接訪問主機 IP 就可以了。
⑷ docker網路問題 怎麼解決
網路基礎 Docker 現有的網路模型主要是通過使用 Network namespace、Linux Bridge、iptables、veth pair 等技術實現的。(出處8) Network namespace:它主要提供了網路資源的隔離,包括網路設備、IPv4/IPv6 協議棧、IP 路由表、防火牆、/proc/net 目錄、/sys/class/net 目錄、埠(socket)等。 Linux Bridge:功能相當於物理交換機,為連在其上的設備(容器)轉發數據幀,如 docker0 網橋。 Iptables:主要為容器提供 NAT 以及容器網路安全。 veth pair:兩個虛擬網卡組成的數據通道。在 Docker 中,用於連接 Docker 容器和 Linux Bridge。一端在容器中作為 eth0 網卡,另一端在 Linux Bridge 中作為網橋的一個埠。 容器的網路模式 用來設置網路介面的 docker run --net 命令,它的可用參數有四個: none:關閉了 container 內的網路連接。容器有獨立的 Network namespace,但並沒有對其進行任何網路設置,如分配 veth pair 和網橋連接,配置 IP 等。 bridge:通過 veth 介面來連接其他 container。這是 docker 的默認選項。 host:允許 container 使用 host 的網路堆棧信息。容器和宿主機共享 Network namespace。 container:使用另外一個 container 的網路堆棧信息。kubernetes 中的 pod 就是多個容器共享一個 Network namespace。 我們需要從中選一個作為我們的網路方案,實際上只有 bridge 和 host 兩種模式可選。(想了解這四個參數,請翻到附錄B之 Network settings。) 在 docker 默認的網路環境下,單台主機上的容器可以通過 docker0 網橋直接通信,如下圖(圖作者馮明振)所示:
⑸ 怎麼設置Docker容器網路不能外網
在你的宿主機啟動docker的時候會多出一個 docker0 的虛擬網卡,然後容器都通過這個和外面通信。
⑹ 如何在 Docker 容器之間設置網路
在使用 weave 之前,你需要在所有宿主機上安裝 Docker 環境,參考這些教程,在 Ubuntu 或 CentOS/Fedora 發行版中安裝 Docker。
Docker 環境部署完成後,使用下面的命令安裝 weave:
$ wget https://github.com/zettio/weave/releases/download/latest_release/weave$ 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 個贊!
⑺ docker哪種網路模式比較好
Docker的4種網路模式
我們在使用docker run創建Docker容器時,可以用--net選項指定容器的網路模式,Docker有以下4種網路模式:
host模式,使用--net=host指定。
container模式,使用--net=container:NAME_or_ID指定。
none模式,使用--net=none指定。
bridge模式,使用--net=bridge指定,默認設置。
下面分別介紹一下Docker的各個網路模式。
1、host模式
眾所周知,Docker使用了Linux的Namespaces技術來進行資源隔離,如PID Namespace隔離進程,Mount Namespace隔離文件系統,Network Namespace隔離網路等。一個Network Namespace提供了一份獨立的網路環境,包括網卡、路由、Iptable規則等都與其他的Network Namespace隔離。一個Docker容器一般會分配一個獨立的Network Namespace。但如果啟動容器的時候使用host模式,那麼這個容器將不會獲得一個獨立的Network Namespace,而是和宿主機共用一個Network Namespace。容器將不會虛擬出自己的網卡,配置自己的IP等,而是使用宿主機的IP和埠。
例如,我們在10.10.101.105/24的機器上用host模式啟動一個含有web應用的Docker容器,監聽tcp80埠。當我們在容器中執行任何類似ifconfig命令查看網路環境時,看到的都是宿主機上的信息。而外界訪問容器中的應用,則直接使用10.10.101.105:80即可,不用任何NAT轉換,就如直接跑在宿主機中一樣。但是,容器的其他方面,如文件系統、進程列表等還是和宿主機隔離的。
2、 container模式
在理解了host模式後,這個模式也就好理解了。這個模式指定新創建的容器和已經存在的一個容器共享一個Network Namespace,而不是和宿主機共享。新創建的容器不會創建自己的網卡,配置自己的IP,而是和一個指定的容器共享IP、埠范圍等。同樣,兩個容器除了網路方面,其他的如文件系統、進程列表等還是隔離的。兩個容器的進程可以通過lo網卡設備通信。
3、none模式
這個模式和前兩個不同。在這種模式下,Docker容器擁有自己的Network Namespace,但是,並不為Docker容器進行任何網路配置。也就是說,這個Docker容器沒有網卡、IP、路由等信息。需要我們自己為Docker容器添加網卡、配置IP等。
4、bridge模式
bridge模式是Docker默認的網路設置,此模式會為每一個容器分配Network Namespace、設置IP等,並將一個主機上的Docker容器連接到一個虛擬網橋上。
棧是一種常見的數據結構,它雖然有棧頂和棧底之分,但它只能從一端操作(插入或刪除),從而是一種「先進後出」的操作模式。向棧內進數據稱為壓棧(Push),從棧里取出數據叫出棧(POp)。例如壓棧順序為1、2、3、4、5,著出棧的順序為5、4、3、2、1(只考慮一次性出棧的情況)。
棧按照存儲的方式,又分為順序棧和鏈表棧。順序棧基於數組實現,所以順序棧存儲數據的內存是連續的,在創建棧時規定好棧的大小,這樣對內存的使用效率並不高。而鏈式棧則是採用了鏈表來實現,其元素的存儲地址是不連續的,而且是動態分配內存。順序棧在使用的過程中可能出現 棧滿、棧空的情況,由於鏈式棧基於鏈表設計,因此不會有棧滿的情況(也會棧空)。
⑻ docker desktop中的容器與宿主機的區域網絡通信
兩台docker容器做datanode,當時配置Docker網路時,使用了Bridge模式,docker0網段(172.0.1.x),宿主機網段(192.1.1.x),使用外部客戶端請求下載HDFS文件,去指定的datanode上拉去數據時,外部客戶端無法連接到內部的docker容器,拋出的等待超時異常,並重試下載,更換請求的下載地址為可連接的宿主機datanode後, 才成功下載數據。
於是,想要對docker的網路配置進行修改,將docker容器的IP地址設置成與宿主機同網段,並且相互連通。
這里先要來說一下docker網路的四種方式:
1.Host模式:
Host 模式並沒有為容器創建一個隔離的網路環境。
該模式下的Docker 容器會和Host宿主機共享同一個網路namespace, Docker Container可以和宿主機一樣,使用宿主機的eth0,實現和外界的通信。
Host模式特點包括:
容器沒有隔離的 network namespace
容器的 IP 地址同 Docker host 的 IP 地址
注意:容器中服務埠號不能與Host宿主機上已經使用的埠號相沖突
host 模式能夠和其它模式共存
2.Container模式
Container網路模式是 Docker 中一種較為特別的網路的模式。處於這個模式下的 Docker 容器會共享其他容器的網路環境,因此,至少這兩個容器之間不存在網路隔離,而這兩個容器又與宿主機以及除此之外其他的容器存在網路隔離。
3.None模式
None 網路就是什麼都沒有的網路。掛在這個網路下的容器除了 lo,沒有其他任何網卡。需要我們自行去配置。
⑼ 如何用Docker 管理 Linux Container 容器與網路設置
當前Ubuntu 系統下的 Docker 的安裝包只提供64位。如果你想運行32位的 Docker,你需要。
安裝 Docker
通過 apt-get 安裝 Docker 簡直是小菜一碟。
$ sudo apt-get install docker.io
如果你不是 root 組的用戶,你可以把自己加入到 docker 用戶組。下面的命令可以讓沒有 root 許可權的用戶使用 Docker:
$ sudo usermod -a -G docker $USER
重新登錄,以便讓你的用戶組許可權生效。
下一步是編輯 Docker 配置文件,確定 Docker 可執行文件的路徑:
$ sudo vi /etc/default/docker.io
DOCKER= /usr/bin/docker.io
重啟 Docker 服務:
$ sudo service docker.io restart
管理 Docker Container 容器
如果你想在新的 Docker 容器下創建一個新的 Ubuntu 操作系統,你首先需要 pull 一個 的 Docker 鏡像。下面的命令可以通過網路下載 Docker 鏡像:
$ docker pull ubuntu
你可以使用下面的命令啟動 Docker 裡面的 Ubuntu 系統。最後的參數 /bin/bash 表示一旦容器啟動,首先會執行簡單的 bash。
$ docker run -i -t ubuntu /bin/bash
上面的命令會立即啟動 Ubuntu container 容器(這是一個完美的容器!),然後它會提供一個 shell 提示符運行環境給你。現在開始你可以通過這個沙箱環境訪問一個完整的 Ubuntu 系統了。輸入 exit 命令退出 Docker 容器。
你也可以用下面的命令進入不同的系統。比如 Fedora:
$ docker.io run -i -t fedora /bin/bash
如果系統中還不存在 Fedora Docker 鏡像,這個命令會自動下載它,然後啟動這個 Fedora 的 Docker 容器。如果你想要開啟指定版本的系統,比如 Ubuntu 13.04,你可以使用下面的命令:
$ docker.io run -i -t ubuntu:13.04 /bin/bash
Container 容器網路設置
Docker 使用 Linux 橋接技術與其他容器通信,以及連通外網。安裝完 Docker 後你應該可以看到 docker0 這個網橋,這是 Docker 默認創建的。你創建的每個容器都會通過這個網橋連接到網路。自定義 Linux 網橋
如果你想自定義網橋,你可以執行以下步驟。你可以在這個網橋後面分配一個子網,並為這個子網分配地址。下面的命令會為 Docker 子網分配 10.0.0.0/24 地址段:
$ sudo apt-get install bridge-utils
$ sudo brctl addbr br0
$ sudo ifconfig br0 10.0.0.1 netmask 255.255.255.0
然後在 /etc/default/docker.io 文件的 DOCKER_OPTS 變數里添加 -b=br0 選項,並重啟 Docker 服務:
$ sudo service docker.io restart
到目前為止,任何創建的容器都會連上 br0 網橋,它們的 IP 地址會從 10.0.0.0/24 中自動分配(譯註:在10.0.0.2到10.0.0.254之間隨機分配)。
其他自定義設置
你可以通過 /etc/default/docker.io 文件的 DOCKER_OPTS 變數設置其他一些屬性:
-dns 8.8.8.8 -dns 8.8.4.4 : 為容器指定 DNS 伺服器。
-icc=false : 將容器與其他容器隔離出來
疑難解答
1、當你運行 docker.io 命令時,你可能會遇到以下問題:
dial unix /var/run/docker.sock: no such file or directory
這個錯誤可能是由於 Docker 後台進程沒有啟動。檢查下 Docker 後台進程的狀態,確認它已經處於啟動狀態:
$ sudo service docker.io status$ sudo service docker.io start