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就像链接的管道。将连同内外的所有东西。