Docker容器互聯的幾個基本方法
(1)容器掛載主機目錄:-v –volumns-from
(2)容器之間互聯: –link
(3)外部存取容器:-p
(4)直接使用宿主機網路
docker run --rm=true --net=host --name=mydb -e MYSQL_ROOT_PASSWORD=123456 mysql # 使用以下命令查看容器IP與主機完全一致 docker exec -it mydb ip addr
(5)容器共用一個IP網路
docker run --rm=true --name=mydb -e MYSQL_ROOT_PASSWORD=123456 mysql# 建立新容器,指定與已有容器共用IP docker run --rm=true --net=container:mydb java ip addr# 共用IP的兩個容器,相互怎麼訪問。(使用localhost)
# 用ubuntu內建工具ifconifg查看網路設定(橋接器、介面等)【注意:是ifconfig不是ipconfig!^_^】 ifconifg # 使用ip addr查看網路資訊 ip addr
一、自訂橋接器
docker安裝時會自動建立docker0虛擬橋接器。現在建立自己橋接器
# 安裝橋接器工具brctlsudo apt-get install bridge-utils#查看橋接器裝置sudo brctl show# 添加橋接器sudo brctl addr br0# 設定橋接器IPsudo ipconfig br0 192.168.100.1 netmask 255.255.255.0# docker應用指定的橋接器: (1)編輯配置:DOCKER_OPTS="-b=br0"sudo vim /etc/default/docker# docker應用指定的橋接器: (2)重啟docker服務sudo service docker restart# 查看docker設定是否應用ps -ef | grep docker# 查看docker網路設定是否生效ipconfig
二、Docker容器互聯
docker預設允許容器間互聯
重啟容器時,ip地址變化,但是如果使用–link串連容器,對應容器IP分配時會更新本容器host引用它的IP(解決容器間互聯出現的ip問題時,運行容器指定link)
【目標】
1、允許容器間的互聯
2、阻止容器間的互聯
3、允許部分容器互聯
準備用於測試的Dockerfile
FROM ubuntu:14.04RUN apt-get install -y pingRUN apt-get updateRUN apt-get install -y nginxRUN apt-get install -y curlEXPOSE 80CMD /bin/bash
構建鏡像
# 構建鏡像docker build -t "ubuntu14:nginx" .# 建立容器 cct1docker run -it --name cct1 ubuntu14:nginx# 啟動nginxnginx
1、使用link指定連結容器的引用別名(好處是:重啟容器IP變化時,別名正常使用)
# 建立容器時指定連結容器別名docker run --name cct2 -it --link cct1:webtest ubuntu14 "/bin/bash"# 容器中訪問另外一個容器時,直接使用連結別名ping webtest# 查看使用link的改變:(1)用env查看環境變數中增加的“WEBTEST_開頭”的幾個環境變數env# 查看使用link的改變:(2)hosts檔案中增加了webtest對應的ip映射vi /etc/hosts# 測試:重啟docker服務,啟動cc1、cct2容器,容器的IP發生變化,在cc2中仍可ping連結別名sudo service docker restartsudo docker start cct1 cct2sudo docker attach cct2ping webtest
2、拒絕容器互聯(–link –icc –iptables)
(即使–icc=false也會阻斷使用–link建立互聯的容器間的訪問)
# 編輯docker預設設定檔: DOCKER_OPTS="--icc=false"sudo vi /etc/default/docker# 重啟docker服務sudo service docker restart# 檢查配置已修改ps -ef | grep docker# 啟動兩個容器sudo docker start cct1 cct2# 在cct1容器中ping容器cct2的IP(不可ping通)sudo ping <cct2-ip># 在cct2容器中根據對cct1連結來ping容器cct1(可以ping通)sudo ping webtest
3、只允許部分容器互聯
# 編輯docker預設配置:DOCKER_OPTS="--icc=false --iptables=true "sudo vim /etc/default/docker# 重啟docker服務sudo service docker restart--link
有時iptables會出現問題時,需要清空iptables
# 清空iptablessudo iptables -F# 重啟docker服務sudo service docker restart# 查看路由表sudo iptables -L -n
4、Docker容器與外部網格的串連
(1)Docker的參數–ip-forward可設定是否訪問外網(ip-forward預設true,轉寄流量)
# 編輯docker預設配置:DOCKER_OPTS="--ip-forward=true --iptables=true"sudo vim /etc/default/docker# 使用系統命令查看設定sysctl net.ipv4.conifg.all.forwarding
(2)使用iptables管理網路訪問
# 使用filter表查看網路訪問規則sudo iptables -t filter -L -n或sudo iptables -L -n
(3)使用-p參數指定容器的開放連接埠
# 指定容器開放的連接埠docker run -it -p 80 --name cct3 ubuntu14# 查看容器映射主機的連接埠docker port cct3# 使用iptables查看規則變化sudo iptables -L -n
(4)阻止外部對容器的訪問(其它規則查看iptables命令的文檔)
sudo iptables -I DOCKER -s <src-ip> -d <dest-ip> -p TCP --dport 80 -j DROP
5、使用橋接器實現跨主機的容器串連
原理:Docker橋接器使用與宿主機器相同網段的IP,實現跨主機容器的互聯
環境:
Mac OSX + Parallels
兩台Ubuntu 14.04虛擬機器
安裝橋接器管理工具:apt-get install bridge-utils
IP地址:
host1: 10.211.55.3
host2: 10.211.55.5
注意事項:使用parallels虛擬機器,而不是vmware或virtual box的原因在於自動分配IP上不適合或不方便實現 (1)建立橋接器並配置Docker使用新橋接器
修改host1設定檔(host2類同,只修改address後面的ip地址)
auto br0iface br0 inet staticaddress 10.211.55.3netmask 255.255.255.0gateway 10.211.55.1bridge_ports eth0
使用ifconfig檢查配置
修改Docker配置/etc/default/docker
host2: -b=br0 --fixed-cidr=10.211.55.64/26host2: -b=br0 --fixed-cidr=10.211.55.128/26
檢查配置
# 檢查配置ps -ef | grep docker
(2)容器訪問其它主機
在host2的Docker中
# 啟動容器 docker run -it ubuntu /bin/bash # ping host1主機 ping 10.211.55.3
(3)跨主機的容器間訪問
在host1的Docker中
# 啟動容器 docker run -it ubuntu /bin/bash # ping host2的容器IP(ifconfig查看ip) ping 10.211.55.129
【優點】
配置簡單,不依賴第三方軟體
【缺點】
與主機在相同網段,小心劃分IP地址
需要網段控制權,在生產環境中不易實現
不容易管理,相容性差 6、使用Open vSwitch實現跨主機容器串連(跨網段)
【環境】 主機軟體:mac OSX + virtualbox + 兩台Ubuntu14.04虛擬機器 雙網卡: Host-Only & NAT 安裝Open vSwitch: apt-get install openvswitch-switch 安裝橋接器管理工具:apt-get install bridge-utils IP地址: host1: 192.168.59.103 host2: 192.168.59.104
(1)建立ovs橋接器,並添加gre串連(以下以host1設定為例)
# 在建立橋接器前後分別查看ovs資訊變化 sudo ovs-vsctl show # 建立ovs橋接器obr0 sudo ovs-vsctl add-br obr0 sudo ovs-vsctl add-port obr0 gre0 sudo ovs-vsctl set interface gre0 type=gre options:remote_ip=192.168.59.104
(2)為虛擬橋接器添加ovs介面
# 建立橋接器br0並建立與obr0串連 sudo brctl addbr br0 sudo ifconfig br0 192.168.1.1 netmask 255.255.255.0 sudo brctl addif br0 obr0 # 查看橋接器資訊 sudo brctl show
(3)配置docker容器虛擬橋接器
# 編輯設定檔/etc/default/docker -b=br0 # 重啟docker服務 sudo service docker restart
【測試1】測試host1中Docker容器對host2的訪問(跨網段)
# host1運行容器 docker run -it ubuntu /bin/bash # 查看容器ip(一般為192.16.1.2) ipconfig # ping host2主機 ping 192.168.59.104
【測試2】按同樣方式設定host2主機上的Docker橋接器br0、虛擬橋接器obr0,注意host2上br0為不同的網段192.168.2.1(區別於host1上的192.168.1.1),虛擬橋接器obr0遠程ip指向host1地址192.168.59.103
# 在host2中啟動容器,並查看ip地址192.168.2.4(假設) # 在host1中ping主機host2中的容器(結果ping不通:原因不同網段無法訪問) ping 192.168.2.4
(5)添加不同Docker容器網段路由
# 查看host1路由資訊(在添加路由資訊前後查看變化) route # 向host1添加192.168.2.0/24網段的路由 sudo ip route add 192.168.2.0/24 via 192.168.59.104 dev eth0
【測試3】
# 在host1容器(192.168.1.2)中再次ping主機host2的容器(192.168.2.4):訪問成功 ping 192.168.2.4 # 反過來,在host2容器(192.168.2.4)中ping主機host1的容器(192.168.1.2),也是成功的 ping 192.168.1.2
7、使用Weave實現跨主機的容器串連
Weave是基於的Docker的一項容器互聯技術。
http://weave.works
https://github.com/weaveworks/weave#readme
【環境準備】
主機軟體:mac OSX + virtualbox + 兩台Ubuntu14.04虛擬機器 雙網卡: Host-Only & NAT IP地址: host1: 192.168.59.103 host2: 192.168.59.104
【軟體安裝】在兩台機器上安裝weave
# 下載安裝weave sudo wget -O /usr/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave# 更改weave檔案夾模式使其可執行 sudo chmod a+x /usr/bin/weave# 啟動weave(運行一個weave的容器,使用docker ps -l查看正在啟動並執行weave容器) weave launch
【串連】
# 在host2串連host1(192.168.59.103) weave launch 192.168.59.103# 在host2使用weave建立容器(容器id給c2) c2=$(weave run 192.168.1.2/24 -it ubuntu /bin/bash)# 進入容器 docker attach $c2# 查看容器中增加了ethwe網路裝置(ip是192.168.1.2) ifconfig# 在host1中使用weave啟動一個容器wc1(容器的IP是192.168.1.10) weave run 192.168.1.10/24 -it --name wc1 ubuntu /bin/bash# 進入容器wc1 docker attach wc1# 在容器wc1可以直接pinghost2上的容器 ping 192.168.1.2
8、跨主機容器訪問
環境:centoshost1: 192.168.18.130 docker0 172.17.42.1/16host2: 192.168.18.128 docker0 172.18.42.1/16
(1)修改Docker0網路地址(滿足上面地址要求)
# 編輯配置 vi /usr/lib/systemd/system/docker.serviceExecStart=/usr/bin/docker daemon --bip=172.18.42.1/16 -H fd:// -H=unix:///var/run/docker.sock# 重啟dockersystemctl daemon-reload# 查看dockerIPip addr
(2)在主機添加一條串連另一主機的路由
# 在host1上添加 route add -net 172.18.0.0/16 gw 192.168.18.128 # 在host2上添加 route add -net 172.17.0.0/16 gw 192.168.18.130 # 查看本機路由,檢查路由是否添加正確 ip route
(3)在主機上啟動容器ping另一台主機
# 從host1啟動容器(保持運行狀態) docker run --rm=true -it java /bin/bash# 擷取ip地址(假如擷取ip是172.17.0.1) ip addr
(4)在另一主機上ping本地容器ip
# 在host2上ping一下host1的容器地址 ping 172.17.0.1 # 顯示結果是:目標主機host1禁止,原因是172.17.0.1不屬於host2物理網卡上,防火牆規則導致ping禁止。 # 解決辦法是清空路由表 iptables -F 或 iptables -t nat -F # 再ping 172.17.0.1