1. 程式人生 > >Docker容器間的網路通訊

Docker容器間的網路通訊

Docker Network

簡單記錄下容器間的網路通訊。

網路驅動

  1. network drivers是docker提供容器間網路通訊的基礎。docker預設提供了兩中驅動:bridge和overlay
  2. docker network ls指令會列出當前存在的網路
  3. docker在安裝完成後會自動建立三個網路
    這裡寫圖片描述

BRIDGE

  1. 宿主機中使用ip addr show檢視網絡卡狀況
    這裡寫圖片描述

  2. docker0為宿主機中的虛擬網橋即為docker自動建立的bridge網路

  3. bridge為docker執行容器(docker run)預設使用的網路

容器與外部的網路通訊前提

  1. 保證宿主機開啟了ip_forward功能
  2. 保證iptables的相關策略的設定,如地址偽裝,NAT等

宿主機與容器的埠對映

  1. docker run -itd -P --name mongoService mongo,-P表示:容器暴露的埠將會對映到宿主機中的隨機埠號,隨機範圍見:/proc/sys/net/ipv4/ip_local_port_range

  2. 每當啟動容器與外部網路的通訊,docker都會建立響應的iptables規則。iptables -L -n -t nat檢視規則

容器間的網路通訊

容器間可以通過IP或容器名進行網路通訊

使用自己建立的NETWORK

  1. 建立my_bridge網路: docker network create -d bridge --subnet=10.0.0.0/24 my_bridge

  2. 執行使用my_bridge網路的容器 docker run -itd --network=my_bridge --ip=10.0.0.254 --name db busybox

不同NETWORK間的容器通訊

  1. docker run -itd --name=web busybox,使用預設的bridge network
  2. 將當前容器加入到需要與之通訊的網路 docker network connect my_bridge web
  3. 網路結構
    這裡寫圖片描述

容器DNS

容器間如何通過別名進行網路通訊?

預設bridge網路

   -- 建立測試容器
   docker run -itd --name c1 busybox
   docker run -itd --name c2 busybox

   -- 進入容器c1內部
   docker attach c1
   / # ping c2
   ping: bad address 'c2'

   -- 建立容器時指定link容器
   docker run -itd  --link c2:c2_alias --name c3 busybox

   -- 進入容器c3內部
   docker attach c3
   / # ping -w1 c2
   PING c2 (172.17.0.4): 56 data bytes
   64 bytes from 172.17.0.4: seq=0 ttl=64 time=0.083 ms
   / # ping -w1 c2_alias
   PING c2_alias (172.17.0.4): 56 data bytes
   64 bytes from 172.17.0.4: seq=0 ttl=64 time=0.096 ms
   / # cat /etc/hosts #(容器別名相互耦合)
   127.0.0.1  localhost
   ::1    localhost ip6-localhost ip6-loopback
   fe00::0    ip6-localnet
   ff00::0    ip6-mcastprefix
   ff02::1    ip6-allnodes
   ff02::2    ip6-allrouters
   172.17.0.4 c2_alias 7e4850ad6320 c2  #通訊原因
   172.17.0.6 fe51353cb1e3

   -- 進入容器c2內部
   docker attach c2
   / # ping c3
   ping: bad address 'c3'

使用者建立的bridge網路

   -- 建立測試容器
   docker run -itd --name c4 --net=my_bridge busybox
   docker run -itd --name c5 --net=my_bridge busybox

   -- 進入容器c4內部
   docker attach c4
   / # ping -w1 c5  #(自動建立DNS服務)
   PING c5 (10.0.0.3): 56 data bytes
   64 bytes from 10.0.0.3: seq=0 ttl=64 time=0.066 ms

網路層可見別名

  -- 建立測試容器
  docker run -itd --name c7 --net=my_bridge --network-alias c7_net_alias busybox
  -- 進入容器c4內部
  docker attach c4
  / # ping -w1 c7_net_alias
  PING c7_net_alias (10.0.0.5): 56 data bytes
  64 bytes from 10.0.0.5: seq=0 ttl=64 time=0.205 ms

參考