Docker容器跨主機通訊的幾種方式


前言:Docker的5種網絡模式

Bridge

此時docker引擎會創建一個veth對,一端連接到容器實例並命名爲eth0,另一端連接到指定的網橋中(比如docker0),因此同在一個主機的容器實例由於連接在同一個網橋中,它們能夠互相通信。容器創建時還會自動創建一條SNAT規則,用於容器與外部通信時,類似家裏上網用的ISP提供給我們的動態IP。如果用戶使用了-p或者-P端口,還會創建對應的端口映射規則,使得外部請求能夠訪問容器的服務,但是你不能通過IP直接訪問,本文提供了3種方式實現容器的跨主機訪問。

Host

與宿主機共享網絡,此時容器沒有使用網絡的namespace,宿主機的所有設備,會暴露到容器中,因此存在安全隱患。

None

不設置網絡,相當於容器內沒有配置網卡,用戶可以手動配置。

Container

指定與某個容器實例共享網絡

Network

使用自定義網絡,可以使用docker network create創建,並且默認支持多種網絡驅動,用戶可以自由創建橋接網絡或者overlay網絡。

Prework:

  1. 安裝Docker
  2. 安裝OVS(非編譯)
    apt-get install openvswitch-switch
  3. 編譯安裝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. 編輯主機1上的 /etc/docker/daemon.json 文件,添加內容:
      { "bip": "172.17.43.1/24" }
    2. 編輯主機2上的 /etc/docker/daemon.json 文件,添加內容:
      { "bip":"172.17.42.1/24" }
  • 重啓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通。

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