docker pipework 實現跨宿主主機容器互聯

1、本地容器之間私有網絡互聯

Docker 默認的橋接網卡是 docker0。它只會在本機橋接所有的容器網卡,舉例來說容器的虛擬網卡在主機 上看一般叫做 veth* 而 Docker 只是把所有這些網卡橋接在一起,如下:

# brctl show

1.png

查看IP地址:

# ip add

2.png

# ifconfig

3.png

這樣的網絡看成是一個私有的網絡,通過 nat 連接外網,如果要讓外網連接到容器中,就需要 做端口映射,即 -p 參數。

缺點:

(1)需要配套服務註冊/發現,否則宿主上端口分配困難,容易衝突。

(2)由於每個容器暴露的端口都不一致,造成前端路由層nginx配置(proxy_pass)裏無法使用dns的方式。

(3)端口映射要在容器啓動時就指定好,後期無法變更。

(4)測試發現nat不支持websocket。

2、物理主機之間的容器網絡互聯

2.1、自建橋接網絡

優點:

(1)每個容器都有獨立ip,對外提供服務,如nginx+php,nginx+resin,都可以使用默認的80端口

(2)由於容器暴露端口都可以使用80端口,因此前端路由層nginx配置(proxy_pass)裏可以使用dns的方式。

(3)無需爲了後期端口映射添加而煩惱

(4)橋接支持websocket

2.2、拓撲圖

4.png

2.3、配置如下

1、網橋方式需要安裝網橋管理工具

# yum install bridge-utils

2、修改主機的/etc/network/interfaces文件

# vim /etc/sysconfig/docker

DOCKER_OPTS="-b=br0"

5.png

3、修改本機網卡

# vim /etc/sysconfig/network-scripts/ifcfg-ens33

BRIDGE="br0"

ZONE=public

6.png

4、添加bro橋接網卡

# vim /etc/sysconfig/network-scripts/ifcfg-br0

DEVICE="br0"

ONBOOT="yes"

NM_CONTROLLED="no"

BOOTPROTO="static"

TYPE="Bridge"

IPADDR="192.168.56.130"

PREFIX="24"

GATEWAY="192.168.56.2"

DNS1="8.8.8.8"

DNS2="114.114.114.114"

7.png

5、關閉NetworkManager管理套件

#systemctl stop NetworkManager

# systemctl disable NetworkManager、

6、重啓網卡,查看

# systemctl restart network

8.png

7、下載pipework

# git clone https://github.com/jpetazzo/pipework

# cp pipework/pipework /usr/local/bin/

10.png

2.4、啓動容器測試

11.png

# docker run -dti --name br01 --privileged centos:7.4.1708 /bin/bash

12.png

登錄容器查看(默認還是採用地方nat模式)

# docker exec -ti e79ed4d70fe1 /bin/bash

13.png

使用pipework更改網絡模式

# pipework br0 br01 192.168.56.140/[email protected]

# pipework br0 br01 dhcp      //前提保證有DHCP服務

再次查看

14.png

局域網已可以正常訪問

15.png

補充:

若想完全拋棄自帶的網絡設置,在啓動容器的時候可以指定--net=none

# docker run -dti --name br02 --network=none --privileged centos:7.4.1708 /bin/bash

# pipework br0 br02 192.168.56.141/[email protected]

16.png

重啓系統後pipework網卡配置無效解決方法(持久性)

在宿主配置開機啓動pipework配置

1、開機啓動docker

# systemctl enable docker

2、開機啓動容器(docker服務)

# docker update --restart=always bf1b95631b60

3、配置開啓啓動pipework相關配置

# vim /etc/rc.local

#添加如下參數

pipework br0 br02 192.168.56.141/[email protected]

17.png

4、授權

# chmod +x /etc/rc.local

5、重啓系統後無法分配IP地址

報錯如下:

Object "netns" is unknown, try "ip help".

該錯誤是由於系統版本暫時不支持namespaces, 可通過更新內核或者iproute的方法獲取對namespaces的支持.更新方法如下:

[openstack-kilo]

name=OpenStack Kilo Repository

baseurl=https://repos.fedorapeople.org/repos/openstack/EOL/openstack-icehouse/epel-6/

skip_if_unavailable=0

enabled=1

gpgcheck=0

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-RDO-kilo

更新:

yum update iproute -y

pipework的缺點:

1.此方法配置的時候有時容器之間不能訪問,容器內無法ping通外網(宿主機可以ping通)。但重啓服務器後,同樣操作,竟然就是可以了。。。。

2.使用pipework綁定的ip物理機,虛擬機,docker容器的ip都在同一網段,重啓後將失效,這在實際生產環境中是很難實現的。

3、不適合數量多的容器,分配配置麻煩


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章