1使用網橋實現跨主機容器連接。
2使用open vswitch虛禮的交換機實現跨主機容器連接。
3使用weave開源項目工具實現跨主機連接。
使用網橋實現跨主機容器連接:在同一個docker的主機中docker容器使用默認的docker0網橋來進行網絡的通信,如果將連接容器的網橋也橋接到docker主機的網卡上,並且將網橋分配的ip地址與docker主機分配的ip地址設置為同一ip段,就相當於將容器與docker主機的網咯連接在了一起,就實現了跨主機的容器間的通信。
在不同的docker主機中分別創建網橋,並使用這個網橋來連接docker主機的物理網卡和docker容器,就意味着將不同docker主機中的容器都分配在了同一網段下。 環境准備:2台ubuntu虛擬機,在2個虛擬機中分別安裝網橋管理工具(apt-get install bridge-utils),2台機器的ip地址分別是10.211.55.3,10.211.55.5 在虛擬機中配置網橋的連接:修改網絡配置文件/etc/network/interfaces來實現網橋的配置和添加。這些命令指定了要建立網橋的名稱,ip分配的方式,子網掩碼,默認的網關,以及指明了將本地的物理網卡連接到新建的網橋上: auto br0 iface br0 inet static address 10.211.55.3 netmask 255.255.255.0 gateway 10.211.55.1 bridge_ports eth0 在docker端需要為docker的守護進程指定2個啟動配置選項: 修改/etc/default/docker文件(這是docker守護進程啟動配置文件) -b指定自定義網橋的名字:-b=br0 --fixed-cidr指定的是自定義網橋為容器分配ip地址時使用的ip段,為了避免在2台主機中的容器的ip地址產生沖突, HOST1 : 10.211.54.64/26 地址范圍:10.211.55.65 ~ 10.211.55.126 HOST2 : 192.168.59.128/26 地址范圍:10.211.55.129 ~ 10.211.55.190 $ ifconfig : 可以看到當前主機的ip地址分配情況,默認情況下在docker啟動時會在主機中添加docker0的網橋,此次的配置中不在使用docker0網橋使用我們自定義的網橋,
$sudo vim /etc/network/interfaces auto br0 iface br0 inet static address 10.211.55.3 netmask 255.255.255.0 gateway 10.211.55.1 bridge_ports eth0 $sudo vim /etc/default/docker DOCKER_OPTS=“-b=br0 --fixed-cidr=10.211.54.64/26” $sudo reboot : 重啟系統 $ifconfig : bro : 不在是docker0了,因為在docker中已經指定自定義的網橋,系統中就不再有docker0網橋,由於為網橋設置了原來物理網卡的ip地址,並且將物理網卡連接到網橋上,eth0(物理網卡)也不在有ip地址被指定給了br0(自定義網橋) $ps -ef | grep docker(docker啟動選項) Root 1321 1 0 15:32 ? 00:00:00 /usr/bin/docker -d -b=br0 --fixed-cidr=’10.211.55.128/26’ : docker守護進程啟動的時候已經使用了我們指定的選項。
$docker run -it ubuntu /bin/bash #ifconfig : 容器的ip地址已經在定義的ip地址范圍內了 #ping 10.211.55.3 : ping同一網絡中的另一台虛擬機,可以ping通,pin外網ip也可以 另一台虛擬機也這樣配置。2台機器的不同在於為容器ip地址做出的限定不一樣,為2台不同的主機划分了相同的ip地址段,但是限定了不同的ip地址分配范圍。 使用網橋實現跨主機容器連接總結: 優點:配置簡單,不依賴第三方軟件。缺點:與主機在同網段,需要小心划分ip地址。需要有網段控制權,在生產環境中不易實現。由於將物理機與容器在同一網段,不容易管理。兼容性不佳。 使用Open vSwitch實現跨主機容器連接 : Open vSwitch是一個虛禮的交換機軟件,開源的,使用可移植的C語言開發。
藍色部分是虛禮網橋,容器通過虛禮網橋來實現同主機之間的連接,虛禮網橋的上一層黃色部分就是使用Open vSwitch創建的OVS網橋,OVS網橋通過gre隧道協議接口實現跨主機的網絡連接, Gre : 通用路由協議封裝,使用了一種隧道技術,隧道技術:使用隧道傳遞的數據可以是不同協議的數據幀或包,隧道協議將其他協議的數據幀或包重新封裝然后通過隧道發送。新的楨頭提供路由信息。隧道協議提供的是一種點對點的再封裝技術。 利用隧道技術可以使不同主機的不同網段的ip地址的容器間的通信。 實驗環境: 1.2台ubuntu虛擬機。 2.網絡連接使用的是雙網卡,一塊是Host-Only模式提供虛擬機之間的連接,另一塊是NAT模式,提供的是外部網絡的連接。 3. 2台虛擬機上分別安裝openvswitch和網橋管理工具:apt-get install openvswitch-switch apt-get install bridge-utils 4.2台虛擬機的ip地址分別是192.168.59.103 192.168.59.104 使用open vswitch實現跨主機容器連接操作: 1.建立ovs網橋 2.為新建的ovs網橋添加gre連接 3.配置docker容器的虛禮網橋 4.將ovs網橋連接到虛擬網橋上 5.為docke容器的網段添加路由表
$ ifconfig:有docker0網橋,eth0是使用內網連接的網卡(需要操作的網卡),eth1不用管,因為這時用來做NAT轉發的。 $ sudo ovs-vsctl show : 查看ovs的版本 $ 建立ovs網橋:sudo ovs-vsctl add-br obr0 : 建立obr0的網橋 $ 添加gre接口 sudo ovs-vsctl add-port obr0 gre0 $ 設置gre0接口 sudo ovs-vsctl set interface gre0 type=gre options:remote_ip=192.168.59.104 另一台ubuntu虛擬機的地址192.168.59.104 $ sudo ovs-vsctl show : 查看ovs的狀態 配置docker容器的虛禮網橋: $sudo brctl addbr bro 新建虛禮網橋叫br0 $ 為br0設置網絡地址 sudo ifconfig br0 192.168.1.1 netmask 255.255.255.0 $ 為br0網橋添加ovs網橋的連接 sudo brctl addif br0 obr0 $ sudo brctl show : 查看當前網橋的連接狀態,可以看到br0已經連接到ovs網橋上了 配置docker,用新建的網橋代替docker0 $ sudo vim /etc/default/docker DOCKER_OPTS = “obr0 ” $sudo service docker restart : 重啟docker服務 $docker run -it ubuntu /bin/bash : 建立一個容器 #ifcinfig : 已經使用了剛剛確定的網絡地址 #ping 另一台主機的ip(不使用gre協議是ping不通的) 以同樣的方式設置另一台機器。 $route : 查看當前的路由表 $ 添加路由表信息 sudo ip route add 192.168.2.0/24 via 192.168.59.104 dev eth0 $ route 再次查看路由信息 $啟動一個交互式容器 docker run -it ubuntu /bin/bash #ping 192.168.2.4 : 可以ping通了,成功連接上了主機2上的容器。 open vswitch配置過程復雜,可以使用shell腳本或者現成的工具簡化過程。 Weave:建立一個虛禮網絡,將不同主機的docker容器連接起來。Weave是github上的一個開源項目,通過weave可以忽略容器的所在位置,直接通過配置的網絡進行連接。
環境准備: 2台ubuntu虛擬機,雙網卡:host-only 和 NAT,IP地址:Host1:192.168.59.103 和 192.168.59.104 操作: 1.安裝weave 2.在安裝weave的docker主機上啟動weave,$weave launch 3.通過weave連接不同的主機 4.通過weave指定ip地址從而啟動容器 $下載weave,並且保存在user/bin/weave文件夾下, sudo wget -0 /usr/bin/weave http://raw.githubsercontent.com/zetttto/weave/master/weave(host1上) $更改weave文件夾的格式,是他可以執行,sudo chmod a+x /usr/bin/weave(host1上) $weave launch 啟動weave,會在docker中運行一個docker的容器,(host1上) $docker ps -l 可以看到剛剛運行的docker容器(host1上) 以同樣的方式,在另一台機器上操作。不過啟動weave時使用host1的ip地址,$weave launch 192.168.59.104,這是為了使2個host正確的連在一起。(host2上) $(host2上)啟動一個容器 c2=$(weave run 192.168.1.2/24 -it ubuntu /bin/bash),192.168.1.2/24這個ip地址是我們在啟動的容器中分配的ip地址,這個ip地址由weave來維護。將weave這條命令的返回值賦值給了c2這個變量,c2實際上就是啟動容器的容器id, $echo $c2 返回的就是運行的容器id $docker attach $c2 進入這個容器,也可以在run命令里面指定name選項,后面根據這個name來進入容器 # ifconfig 現在已經進入容器中了,查看容器的網絡設置,容器中多了一個網絡設備ethwe,這個設備的ip地址就是運行weave中指定的ip地址,原有的docker0網橋分配的ip地址依然在容器中 $(host1上)啟動一個容器,$ weave run 192.168.1.10/24 -it --name wc1 ubuntu /bin/bash,以name方式,192.168.10/24是與host2中運行的容器相同網段的ip地址, $ docker attach wc1 進入容器 #ifconfig #ping 192.168.1.2,可以ping通 使用weave工具可以非常容易的給docker容器指定一個任意希望分配的ip地址。並且非常方便的划分ip地址段,從而將不同主機的容器划分在不同的網段中。