Docker 學習(四)—— 網絡配置

操做系統CentOS7.0下docker 網絡配置(root用戶下操做)linux

Dokcer 經過使用 Linux 橋接提供容器之間的通訊,默認會建立一個名爲docker0的虛擬網橋,docker0 橋接接口的目的就是方便 Docker 管理。當 Docker daemon 啓動時須要作如下操做:git

  • creates the docker0 bridge if not present
    • # 若是 docker0 不存在則建立
  • searches for an IP address range which doesn’t overlap with an existing route
    • # 搜索一個與當前路由不衝突的 ip 段
  • picks an IP in the selected range
    • # 在肯定的範圍中選擇 ip
  • assigns this IP to the docker0 bridge
    • # 綁定 ip 到 docker0

1、Docker 網絡模式github

Docker 網絡模式有4種方式:web

  • host 模式,使用 --net=host 指定。
  • container 模式,使用 --net=container:NAMEorID 指定。
  • none 模式,使用 --net=none 指定。
  • bridge 模式,使用 --net=bridge 指定,默認設置。

 

一、host 模式
若是啓動容器的時候使用 host 模式,那麼這個容器將不會得到一個獨立的 Network Namespace,而是和宿主機共用一個 Network Namespace。容器將不會虛擬出本身的網卡,配置本身的 IP 等,而是使用宿主機的 IP 和端口。docker

例如,咱們在 10.10.101.105/24 的機器上用 host 模式啓動一個含有 web 應用的 Docker 容器,監聽 tcp 80 端口。當咱們在容器中執行任何相似 ifconfig 命令查看網絡環境時,看到的都是宿主機上的信息。而外界訪問容器中的應用,則直接使用 10.10.101.105:80 便可,不用任何 NAT 轉換,就如直接跑在宿主機中同樣。可是,容器的其餘方面,如文件系統、進程列表等仍是和宿主機隔離的。centos

二、container 模式
這個模式指定新建立的容器和已經存在的一個容器共享一個 Network Namespace,而不是和宿主機共享。新建立的容器不會建立本身的網卡,配置本身的 IP,而是和一個指定的容器共享 IP、端口範圍等。一樣,兩個容器除了網絡方面,其餘的如文件系統、進程列表等仍是隔離的。兩個容器的進程能夠經過 lo 網卡設備通訊。bash

三、none模式
這個模式和前兩個不一樣。在這種模式下,Docker 容器擁有本身的 Network Namespace,可是,並不爲 Docker容器進行任何網絡配置。也就是說,這個 Docker 容器沒有網卡、IP、路由等信息。須要咱們本身爲 Docker 容器添加網卡、配置 IP 等。網絡

四、bridge模式tcp

bridge網絡鏈接模式

bridge 模式是 Docker 默認的網絡設置,此模式會爲每個容器分配 Network Namespace、設置 IP 等,並將一個主機上的 Docker 容器鏈接到一個虛擬網橋上。當 Docker server 啓動時,會在主機上建立一個名爲 docker0 的虛擬網橋,此主機上啓動的 Docker 容器會鏈接到這個虛擬網橋上。虛擬網橋的工做方式和物理交換機相似,這樣主機上的全部容器就經過交換機連在了一個二層網絡中。接下來就要爲容器分配 IP 了,Docker 會從 RFC1918 所定義的私有 IP 網段中,選擇一個和宿主機不一樣的IP地址和子網分配給 docker0,鏈接到 docker0 的容器就從這個子網中選擇一個未佔用的 IP 使用。如通常 Docker 會使用 172.17.0.0/16 這個網段,並將 172.17.42.1/16 分配給 docker0 網橋(在主機上使用 ifconfig 命令是能夠看到 docker0 的,能夠認爲它是網橋的管理接口,在宿主機上做爲一塊虛擬網卡使用)ide

2、bridge模式單個容器網絡配置

一、docker run 建立 Docker 容器時,能夠用 --net 選項指定容器的網絡模式。

如:#docker run  -t -i --net=host  centos /bin/bash

二、查看當前docker0 IP

#ifconfig docker0

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::42:5ff:fe41:f224  prefixlen 64  scopeid 0x20<link>
        ether 02:42:05:41:f2:24  txqueuelen 0  (Ethernet)
        ...

三、運行容器,顯示docker bridge信息

#  docker run -t -i -d centos /bin/bash
df4c9a3bc46a213c3748040f5c153616ab887249679f0f561a5e72e10c64e232

# brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.02420541f224       no              veth7b9fa72
(brctl工具須要安裝,安裝bridge-utils軟件包,#yum install bridge-utils)

3、bridge模式多容器網絡配置

# docker network inspect bridge 查看bridge配置的容器

...
"Containers": {}

...

# docker run -itd --name=container1 ImageName/ID //建一個新的container1 (容器名稱)附加到bridge模塊鏈接例表

...
"Containers": {          
"15cba058b1f69b5dabbdfbc46a20220129498cd98cd6dd4bce518261efcd795a": {           
"Name": "container1",            
"EndpointID": "2b0e71701ed7c22418095640d07aba52496bda8fe0045508e1d689bbb333c63c",  
"MacAddress": "02:42:ac:11:00:03",              
"IPv4Address": "172.17.0.3/16",            
"IPv6Address": ""        
},
 "841dd6e9bb53b74f69989b8e3ab37236fd30105723f2e077c2842520549ded05": {
  "Name": "kickass_jennings",
 "EndpointID": "9f7019a0acf476ed4a758bbc63081bd71a11a6183760c7c4e6fd64d6e3dea8f0",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
}
...

# docker attach container1 //進入container1容器
[root@15cba058b1f6 /]# ls /sbin |grep ifconfig
[root@15cba058b1f6 /]# yum search ifconfig
[root@15cba058b1f6 /]# yum install net-tools.x86_64
[root@15cba058b1f6 /]# ifconfig
[root@15cba058b1f6 /]# ping -w3 172.17.0.2 //不一樣容器之間網絡是否通

...
ff02::2 ip6-allrouters
172.17.0.2      841dd6e9bb53

3、使用特定範圍的 IP

一、新建bridge網橋

# docker network create --driver bridge isolated_nw //建立一個新bridge
# docker network inspect isolated_nw //查詢新bridge配置
# docker network ls  //查詢有幾個bridge
# docker run --network=isolated_nw -itd --name=container3 ImageName/ID //建立新的容器放入到新的bridge,啓動新的容器
# docker network inspect isolated_nw //查詢新bridge配置


Docker 會嘗試尋找沒有被主機使用的 ip 段,儘管它適用於大多數狀況下,可是它不是萬能的,有時候咱們仍是須要對 ip 進一步規劃。Docker 容許你管理 docker0 橋接或者經過-b選項自定義橋接網卡,須要安裝bridge-utils軟件包。

基本步驟以下:
一、確保 docker 的進程是中止的 (ensure Docker is stopped)
二、 建立自定義網橋(create your own bridge (bridge0 for example))
三、給網橋分配特定的 ip(assign a specific IP to this bridge)
四、 以 -b 的方式指定網橋(start Docker with the -b=bridge0 parameter)

//中止Docker 並刪除 docker0
# service docker stop (systemctl stop docker.service)
# ip link set dev docker0 down 
# brctl delbr docker0            // Create our own bridge 
# brctl addbr bridge0 
# ip addr add 192.168.5.1/24 dev bridge0 
# ip link set dev bridge0 up     // Confirming that our bridge is up and running 
# ip addr show bridge0
bridge0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state UP group default
    link/ether 66:38:d0:0d:76:18 brd ff:ff:ff:ff:ff:ff
    inet 192.168.5.1/24 scope global bridge0
    valid_lft forever preferred_lft forever 
//Tell Docker about it and restart (on Ubuntu) 
# 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker 
# service docker start (systemctl start docker.service)

5、不一樣主機間容器通訊


不一樣容器之間的通訊能夠藉助於 pipework 這個工具:

第一步:
# yum -y install git
第二步:
# git clone https://github.com/jpetazzo/pipework.git
第三步:
# cp -rp pipework/pipework /usr/local/bin/
第四步:查看images
# docker images
# systemctl stop docker
# ip link set dev docker0 down
# brctl delbr docker0
# cat /etc/sysconfig/docker | grep 'OPTIONS='OPTIONS=--selinux-enabled -b=br0 -H fd://
第五步:配置bridge
# brctl addbr br0
# ip link set dev br0 up
# ip addr add 192.168.115.1/24 dev br0
# ORACLE=$(docker run -d -p 22 -p 1521:1521 2c4372b5fb84)
# pipework br0 $ORACLE 192.168.115.2/24

參考:https://docs.docker.com/engine/userguide/networking/#user-defined-networks

相關文章
相關標籤/搜索