前言:Docker的5種網絡模式
Bridge
此時docker引擎會創建一個veth對,一端連接到容器實例並命名爲eth0,另一端連接到指定的網橋中(比如docker0),因此同在一個主機的容器實例由於連接在同一個網橋中,它們能夠互相通信。容器創建時還會自動創建一條SNAT規則,用於容器與外部通信時,類似家裏上網用的ISP提供給我們的動態IP。如果用戶使用了-p或者-P端口,還會創建對應的端口映射規則,使得外部請求能夠訪問容器的服務,但是你不能通過IP直接訪問,本文提供了3種方式實現容器的跨主機訪問。
Host
與宿主機共享網絡,此時容器沒有使用網絡的namespace,宿主機的所有設備,會暴露到容器中,因此存在安全隱患。
None
不設置網絡,相當於容器內沒有配置網卡,用戶可以手動配置。
Container
指定與某個容器實例共享網絡
Network
使用自定義網絡,可以使用docker network create創建,並且默認支持多種網絡驅動,用戶可以自由創建橋接網絡或者overlay網絡。
Prework:
- 安裝Docker
- 安裝OVS(非編譯)
apt-get install openvswitch-switch
- 編譯安裝OVS:
apt-get install git
apt-get install autoconf automake libtool
apt-get install openssl
apt-get install libssl-dev
apt-get install make
apt-get install make-guile
apt-get install python-six
獲取代碼:
git clone https://github.com/openvswitch/ovs.git
編譯操作:
cd ovs
./boot.sh
./configure
make
make install
加載模塊
/sbin/modprobe openvswitch
查看安裝是否成功:
/sbin/lsmod | grep openvswitch
修改環境變量:
export PATH=$PATH:/usr/local/share/openvswitch/scripts
1. 直接路由方式
這種方式最簡單,只需一步:在左側本機增加一個靜態路由。
ip route add 172.17.42.0/24 via 172.31.4.143
在右側主機新增一條靜態路由:
ip route add 172.17.43.0/24 via 172.31.15.168
當然前提是,docker0 網橋的網段改掉,參照下圖的方式,同時需要提醒的是,需要把本機的路由轉發打開。
- ubuntu的話:
修改 /etc/sysctl.conf,把ip_forward = 1 的註釋去掉即可 - centos的話:
修改 /etc/sysctl.d/99-sysctl.conf
添加net.ipv4.ip_forward = 1,然後試試sysctl -p
很簡單的方式,其實很像flannel網絡的Host-Gateway的原理
2. 基於OVS+GRE的大二層通信
示意圖如下:
-
修改Docker0的網絡地址
- 編輯主機1上的 /etc/docker/daemon.json 文件,添加內容:
{ "bip": "172.17.43.1/24" }
- 編輯主機2上的 /etc/docker/daemon.json 文件,添加內容:
{ "bip":"172.17.42.1/24" }
- 編輯主機1上的 /etc/docker/daemon.json 文件,添加內容:
-
重啓docker服務
主機1和主機2上均執行如下命令重啓docker服務以使修改後的docker0網段生效
systemctl restart docker
-
創建ovs bridge
ovs-vsctl add-br br0 ifconfig
通過ifconfig命令,我們發現多了一個br0網橋。
-
設置gre端口 (主機2上面也一樣,只是remote_ip爲172.31.15.168)
ovs-vsctl add-port br0 gre0 – set Interface gre0 type=gre option:remote_ip=172.31.4.143 brctl addif docker0 br0 ip link set dev br0 up ip link set dev docker0 up ip route add 172.17.0.0/16 dev docker0
-
啓動容器測試下
docker run -it nginx /bin/bash
顯示兩個跨主機容器能互相ping通。