2014年06月06日

Docker之网络模式


本文介绍docker容器的四种网络模式

1、背景

本文中涉及的源码基于docker 0.11.1版本系统。 本文中涉及的测试环境基于redhat6.5、ubuntu14.04。

2、概述

在docker run命令中可以通过--net=参数来设置docker容器的网络模式。

目前支持4中网络模式,分别为bridge、host、container、none。

运行中docker容器的网络模式可以在/var/lib/docker/container/容器id/hostconfig.json文件中看到。

3 bridge

bridge是docker容器默认的网络模式。

使用这种模式启动docker容器,docker容器中会有eth0、lo两个网络设备,eth0实际上是一对veth设备中的一个,另一个被挂载在主机的docker0网桥上。

3.1 容器中的网络设备

8: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 3a:a8:2b:1f:e5:f6 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 scope global eth0
    inet6 fe80::38a8:2bff:fe1f:e5f6/64 scope link tentative
       valid_lft forever preferred_lft forever
10: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever

3.2 主机的网络设备

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:50:56:8f:2f:3e brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.72/24 brd 192.168.0.255 scope global eth0
    inet6 fe80::250:56ff:fe8f:2f3e/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
    link/ether fe:70:1f:f4:10:79 brd ff:ff:ff:ff:ff:ff
    inet 172.17.42.1/16 scope global docker0
    inet6 fe80::b4af:6dff:fe20:d545/64 scope link
       valid_lft forever preferred_lft forever
12: vethUqvN45: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether fe:70:1f:f4:10:79 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fc70:1fff:fef4:1079/64 scope link
       valid_lft forever preferred_lft forever

4 host

使用以下命令表示容器的网络模式为host模式。

docker run --net=host <Image ID> <cmd>

使用host模式时,容器中的使用主机的网络栈。

5 container

使用以下命令表示容器的网络模式为container模式。

docker run --net=container:<Container ID> <Image ID> <cmd>

使用container模式时,容器中的网络设备情况与指定的容器的网络设备一致。

6 none

使用以下命令表示容器的网络模式为none模式。

docker run --net=none <Image ID> <cmd>

使用none模式时,容器中只有一个lo设备。

存在的问题

使用container模式时,在ubuntu系统上,结果与预期的一样,但是在redhat系统上,容器中只有lo设备,与none模式一样。