Docker網路設定__Docker

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.