1、本地容器之間私有網絡互聯
Docker 默認的橋接網卡是 docker0。它只會在本機橋接所有的容器網卡,舉例來說容器的虛擬網卡在主機 上看一般叫做 veth* 而 Docker 只是把所有這些網卡橋接在一起,如下:
# brctl show
查看IP地址:
# ip add
# ifconfig
這樣的網絡看成是一個私有的網絡,通過 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、拓撲圖
2.3、配置如下
1、網橋方式需要安裝網橋管理工具
# yum install bridge-utils
2、修改主機的/etc/network/interfaces文件
# vim /etc/sysconfig/docker
DOCKER_OPTS="-b=br0"
3、修改本機網卡
# vim /etc/sysconfig/network-scripts/ifcfg-ens33
BRIDGE="br0"
ZONE=public
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"
5、關閉NetworkManager管理套件
#systemctl stop NetworkManager
# systemctl disable NetworkManager、
6、重啓網卡,查看
# systemctl restart network
7、下載pipework
# git clone https://github.com/jpetazzo/pipework
# cp pipework/pipework /usr/local/bin/
2.4、啓動容器測試
# docker run -dti --name br01 --privileged centos:7.4.1708 /bin/bash
登錄容器查看(默認還是採用地方nat模式)
# docker exec -ti e79ed4d70fe1 /bin/bash
使用pipework更改網絡模式
# pipework br0 br01 192.168.56.140/[email protected]
或
# pipework br0 br01 dhcp //前提保證有DHCP服務
再次查看
局域網已可以正常訪問
補充:
若想完全拋棄自帶的網絡設置,在啓動容器的時候可以指定--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]
重啓系統後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]
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、不適合數量多的容器,分配配置麻煩