docker中文文档-设置网络

设置网络-docker相关网络设置

Docker 使用linux桥接来提供网络连接到容器. 在docker启动一个容器的时候,会先启动一个docker0的桥接端口 :

  • 如果不存在端口,创建docker0端口
  • 为路由搜索一个可用的ip范围
  • 在可以用的ip范围内选择一个ip来使用
  • 将选则的ip和docker0端口绑定

下面的命令展示具体设置:

# List host bridges$ sudo brctl show

bridge name bridge id STP enabled interfaces
docker0 8000.000000000000 no

# Show docker0 IP address$ sudo ifconfig docker0
docker0 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运行时会为每个容器提供一个虚拟设备用于 docker0 桥接端口. 每个容器也就可以使用ip来连接这个 docker0. docker0的ip也就被当作docker的默认路由网关.

# Run a container$ sudo docker run -t -i -d base /bin/bash

52f811c5d3d69edddefc75aff5a4525fc8ba8bcfa1818132f9dc7d4f7c7e78b4

$ sudo brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.fef213db5a66 no vethQCDY1N

上面展示的就是 docker0 作为 这个端口vethQCDY1N 的桥接且属于一个叫fef213db5a66的容器

如何是特殊的ip段

Docker会经常选择没有被使用的ip段。由于这种情况经常发生,而又没有必要重复执行,就可以手动指定IP。

Docker 允许使用 -b=<bridgename> 这个设置项来指定一个桥接网络

原理:

  • 确认docker 是停止运行的
  • 创建一个属于自己的桥接网络(bridge0 for example)
  • 指定一个IP到这个桥接端口
  • 使用带有 -b 字段的命令启动docker
# Stop Docker$ sudo service docker stop


# Clean docker0 bridge and# add your very own bridge0$ sudo ifconfig docker0 down
$ sudo brctl addbr bridge0
$ sudo ifconfig bridge0 192.168.227.1 netmask 255.255.255.0

# Edit your Docker startup file$ echo "DOCKER_OPTS=\"-b=bridge0\"" >> /etc/default/docker

# Start Docker$ sudo service docker start

# Ensure bridge0 IP is not changed by Docker$ 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

# Run a container$ docker run -i -t base /bin/bash

# Container IP in the 192.168.227/24 range
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

# Display bridge info$ sudo brctl show
bridge name bridge id STP enabled interfaces
bridge0 8000.fe7c2e0faebd no vethAQI2QT

容器的内部信息交换

Containers 可以通过icc 字段值与 Docker daemon进行相互信息交流

  • 默认 -icc=true 将运行各个容器进行信息交换
  • -icc=false 阻止容器进行信息交换

Under the hood,  Docker 使用 iptables 来接受和断开2个容器直接的连接s.

关于vethXXXX 设备

 

vethXXXX设备是主机内部用于主机和相应的容器进行点对点连接的设备。在容器内部对应有一个物化的端口eth0。主机的vethXXX和容器的eth0就像链接的管道。将连同内外的所有东西。 

 

 ps:docker 端口转发命令