Docker網絡詳解

Docker網絡詳解

轉載請註明來自:http://blog.csdn.net/wsscy2004linux

網絡基礎

Docker使用linux橋接,在主機虛擬一個docker0網絡接口,在主機中運行命令查看:git

# List host bridges
$ sudo brctl showbridge      name    bridge id               STP enabled     interfacesdocker0             8000.000000000000       no

# Show docker0 IP address
$ sudo ifconfig docker0docker0   Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
     inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0

docker啓動一個container時會會根據docker0的網段劃分container的IP,docker0是每一個container的網關。github

自定義網絡範圍

儘管docker在使用linux brigde會找最合適的。可是有時候咱們仍是須要本身規劃。
使用-b=<bridgename>參數設置web

# 先關閉docker
$ sudo service docker stop

# 關閉網橋docker0# 添加本身的網橋bridge0
$ sudo ifconfig docker0 down
$ sudo brctl addbr bridge0
$ sudo ifconfig bridge0 192.168.227.1 netmask 255.255.255.0

# 向Docker startup file中添加啓動自定義網橋參數
$ echo "DOCKER_OPTS=\"-b=bridge0\"" >> /etc/default/docker

# 啓動Docker
$ sudo service docker start

# 查看自定義網橋是否啓動成功,ip等配置是否正確
$ sudo ifconfig bridge0
bridge0   Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
          inet addr:192.168.227.1  Bcast:192.168.227.255  Mask:255.255.255.0

# 啓動container
docker run -i -t base /bin/bash

# 能夠看到Container IP  在網段192.168.227/24內
root@261c272cd7d5:/# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
          inet addr:192.168.227.5  Bcast:192.168.227.255  Mask:255.255.255.0

# bridge0 IP as the default gateway# 查看路由信息
root@261c272cd7d5:/# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.227.1   0.0.0.0         UG    0      0        0 eth0
192.168.227.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0

# hits CTRL+P then CTRL+Q to detach

# 查看網橋信息
$ sudo brctl show
bridge      name    bridge id               STP enabled     interfaces
bridge0             8000.fe7c2e0faebd       no              vethAQI2QT

container互通

docker默認是容許container互通,經過-icc=false關閉互通。
一旦關閉了互通,只能經過-link name:alias命令鏈接指定container.redis

container互相隔離的狀況下,假設咱們有一個webapp container,一個redis contianer須要互通。
先啓動redis container:docker

sudo docker run -d --name redis crosbymichael/redis

再啓動webapp並聯通到redisubuntu

#將redis取別名爲dbsudo docker run -t -i --link redis:db --name webapp ubuntu bash

在webapp中能夠看到db的網絡信息:bash

$ root@4c01db0b339c:/# env

HOSTNAME=4c01db0b339c
DB_NAME=/webapp/db
TERM=xterm
DB_PORT=tcp://172.17.0.8:6379
DB_PORT_6379_TCP=tcp://172.17.0.8:6379
DB_PORT_6379_TCP_PROTO=tcp
DB_PORT_6379_TCP_ADDR=172.17.0.8
DB_PORT_6379_TCP_PORT=6379
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
SHLVL=1
HOME=/
container=lxc
_=/usr/bin/env
root@4c01db0b339c:/#

0.11版本之後,-- link redis:db的別名,會在/etc/hosts中生成對應的ip映射:網絡

root@6541a75d44a0:/# cat /etc/hosts172.17.0.3  6541a75d44a0172.17.0.2  db

什麼是vethxxxx

# 查看網橋信息
$ sudo brctl show
bridge      name    bridge id               STP enabled     interfaces
docker0             8000.fe7c2e0faebd       no              vethAQI2QT

vethxxx是主機與container內部eth0相連的管道。詳見ip linknamespaces infrastructureapp

更多

pipework能夠建立各類複雜的containers互通的場景。詳見here

相關文章
相關標籤/搜索