余子越的博客
Toggle navigation
余子越的博客
主页
计算机网络
大数据分析
系统与工具
编程之路
容器引擎
作者
归档
标签
Docker容器网络配置
2020-06-19 09:36:56
138
0
0
yuziyue
[TOC] > docker安装完成后默认有3个网络:`bridge host none`。 # 一. host模式 与宿主机共享网络,host模式时宿主机和容器共用同一个网络,所以如果在容器内和宿主机要启动监听端口时需要考虑端口冲突问题。 ``` $ docker run -it --rm --name alpine1 --network host alpine sh ``` ``` +-----------------------------------------------------------------------------+ | HOST | | +--------------------------------+ +----------------------------------+ | | | container1 | | container2 | | | | 10.10.10.220/24 | | 10.10.10.220/24 | | | +--------------------------------+ +----------------------------------+ | | share the same network | | +-----------------------+ | | | 10.10.10.220/24 | | | | eth0 | | +-------------------------+-----------------------+---------------------------+ ``` <br> # 二. container模式 `joined container`联合挂载式网络模式,即现有容器共享网络,这个模式指定新创建的容器和已经存在的一个容器共享一个`Network Namespace`,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的`IP`,而是和一个指定的容器共享`IP`、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。 ``` +-------------------------------------------------------------------------------+ | HOST | | +-----------------------------+ +------------------------------+ | | | container1 | | container2 | | | | +---+---------+---+ | | | | | 172.17.0.2/16 | | | | | | eth0 | | | | +-------------------------+-------+---------+--------------------------+ | | | | | +----------------------+----+--------+-------------------+ | | | | eth0a3aa53 | | | | | +-------------+ | | | | | | | | +-----------------+ | | | | | 172.17.0.1/16 | | | | | | docker0 | | | | +--------------------+---+-------------+-----------------+ | | | IP Forwarding | | +------+----------------+ | | | 10.10.10.220/24 | | | | eth0 | | +--------------------------+-----------------------+----------------------------+ ``` ``` # 启动容器1使用默认的bridge网络 docker run -it --rm --name alpine1 --network bridge alpine sh # 启动容器2直接使用容器1的网络 docker run -it --rm --name alpine2 --network container:alpine1 alpine sh # 然后查看两个容器的IP配置为相同的 $ ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 490: eth0@if491: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP link/ether 02:42:ac:11:00:06 brd ff:ff:ff:ff:ff:ff inet 172.17.0.6/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever ``` <br> # 三. bridge模式 `bridge`是创建容器是的默认网络。`docker`程序在宿主机上创建一个虚拟网桥`docker0`,容器内的网卡eth0使用桥接的方式和宿主机上的`docker0`连接,然后`docker0`使用宿主机的`NAT`网络和外部网络连接。启动容器时,从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关,Docker在主机上创建一对虚拟网卡`veth pair`设备,veth pair设备的一端在新创建的容器中,命名为eth0(容器内的网卡),另一端放在主机中,以`vethxxx`这样类似的名字命名,并将这个网络设备加入到`docker0`网桥中。可以通过`brctl show`命令查看。 ``` # docker 使用默认的bridge启动容器 docker run -it --rm --name alpine1 --network bridge alpine sh # 使用自定义的bridge启动容器(自定义的bridge会在宿主机上创建虚拟网卡br-xxxxxx) docker network create --driver bridge test_bridge docker run -it --rm --name alpine1 --network test_bridge alpine sh # 查看网桥veth pair设备(相当于网口或者光纤模块) $ brctl show bridge name bridge id STP enabled interfaces docker0 8000.024282b644ed no veth0a3aa53 vethc5bdb47 ``` ``` +------------------------------------------------------------------------------+ | HOST | | +--------------------------------+ +----------------------------------+ | | | container1 | | container2 | | | | +-----------------+ | | +-----------------+ | | | | | 172.17.0.2/16 | | | | 172.17.0.3/16 | | | | | | eth0 | | | | eth0 | | | | +--------+---+-------------+-----+ +----------+---+-------------+-----+ | | | | | | +------+-------+-----------------------+-----+-----------+ | | | veth0a3aa53 | | vethc5bdb47 | | | +--------------+ +-----------------+ | | | +---------------+ | | | | | 172.17.0.1/16 | | | | | | docker0 | | | | +--------------------+---+-----------+-------------------+ | | | IP Forwarding | | +------+----------------+ | | | 10.10.10.220/24 | | | | eth0 | | +--------------------------+-----------------------+---------------------------+ ``` <br> # 四. none模式 使用`none`模式,`Docker`容器拥有自己的`Network Namespace`,但是,并不为Docker容器进行任何网络配置。也就是说,这个`Docker`容器没有网卡、IP、路由等信息,只有`lo`网络接口。需要我们自己为`Docker`容器添加网卡、配置`IP`等。 <pre> +-----------------------------------------------------------------------------+ | HOST | | +--------------------------------+ +----------------------------------+ | | | container1 | | container2 | | | | | | | | | +--------------------------------+ +----------------------------------+ | | | | +-----------------------+ | | | 10.10.10.220/24 | | | | eth0 | | +-------------------------+-----------------------+---------------------------+ </pre> <br> # 五. overlay模式 host bridge模式的网络都只能在一个节点内通信,如果有个宿主机,宿主机之间的容器需要通信,那么此时就要用到overlay了。overlay是docker自带集群swarm的功能,必须在管理节点才能创建网络。 说明: - overlay只能在管理节点创建、删除、管理。 - 在主节点上创建好了overlay网络以后:从节点不会立即创建,从节点只有使用到了该网络时才会创建,从节点的容器stop以后该网络也会立即删除该网络。 - 创建一个集群。 ``` # 创建集群(如下命令会返回其他节点加入集群的命令) docker swarm init --advertise-addr x.x.x.x # 其他宿主机加入该集群 docker swarm join --advertise-addr x.x.x.x --token xxxxxxx x.x.x.x:2377 # 在管理节点上查看集群内所有节点 docker node ls ``` - 使用overlay网络,overlay也可以指定网段,但是宿主机的网段时不能访问overlay网段的。 ``` # 创建overlay网络,无需在其他节点上创建overlay网络,因为当其中一个节点开始运行需要该overlay网络的服务任务时,overlay网络会自动创建。 docker network create --driver overlay --attachable test_overlay # 在管理节点运行容器alpine1 docker run -it --rm --name alpine1 --network test_overlay alpine sh # 在从节点运行容器alpine2 docker run -it --rm --name alpine2 --network test_overlay alpine sh # 然后在从节点查看test_overlay已经自动创建,在alpine2里面ping alpine1 / # ping alpine1 PING alpine1 (10.0.4.2): 56 data bytes 64 bytes from 10.0.4.2: seq=0 ttl=64 time=0.776 ms 64 bytes from 10.0.4.2: seq=1 ttl=64 time=0.477 ms 64 bytes from 10.0.4.2: seq=2 ttl=64 time=0.502 ms ``` <br> Overlay网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式。这样不但能够充分利用成熟的IP路由协议进程数据分发;而且在Overlay技术中采用扩展的隔离标识位数,能够突破VLAN的4000数量限制支持高达16M的用户,并在必要时可将广播流量转化为组播流量,避免广播数据泛滥。 <br> # 六. macvlan模式 `macvlan`本身是 `linxu kernel` 模块,其功能是允许在同一个物理网卡上配置多个 MAC 地址,即多个 `interface`,每个 `interface` 可以配置自己的 `IP`。`macvlan` 本质上是一种网卡虚拟化技术. `macvlan` 的最大优点是性能极好,相比其他实现.macvlan 不需要创建 `Linux bridge`,而是直接通过以太 interface 连接到物理网络。下面做两个测试。 <br> **注意**:一张网卡只能创建一个macvlan网络。 <br> - 和宿主机相同网段: 让容器成为宿主机同局域网的一台主机,局域网的其他主机能直接和容器通信。假设宿主机的网段为:`172.16.0.0/16`,宿主机的ip为:`172.16.0.2`,配置时改成具体网段即可。 ``` # 创建macvlan网络,启动容器并连接到mac1网络 docker network create --driver macvlan --subnet=172.16.0.0/16 --gateway=172.16.0.1 -o parent=eth0 mac1 docker run -it --rm --name alpine1 --ip=172.16.0.2 --network mac1 alpine sh # 然后在其他同网段ping该容器的IP ``` <br> - 和宿主机不同网段: 如果宿主机同局域网不需要和容器通信,则可以随便配置网段,配置时改成具体网段即可。 ``` # 创建macvlan网络,启动容器并连接到mac1网络 docker network create --driver macvlan --subnet=172.172.0.0/16 --gateway=172.172.0.1 -o parent=eth0 mac1 docker run -it --rm --name alpine1 --ip=172.172.0.2 --network mac1 alpine sh # 另外一个节点创建macvlan网络,启动容器并连接到mac1网络 docker network create --driver macvlan --subnet=172.172.0.0/16 --gateway=172.172.0.1 -o parent=eth0 mac1 docker run -it --rm --name alpine2 --ip=172.172.0.3 --network mac1 alpine sh # 在后在这两个容器内部互相ping配置的IP ``` <br> # 七. 常用命令 ``` # 查看所有网络 $ docker network ls NETWORK ID NAME DRIVER SCOPE d63c6102bced bridge bridge local c9f24dad2cf7 host host local c73186766364 none null local # 创建自定义网络指定子网(注意:只有自定义网络且自定网段,容器重启后才能保留之前分配的IP地址) $ docker network create --driver=bridge --subnet=172.100.0.0/16 custom_net # 创建自定义网络指定标签 $ docker network create --label project=pangball --label desc="This is for pangball" custom_net # 查看网络详情 $ docker network inspect custom_net # 容器alpine1连接到网络custom_net(给容器新增加了一个IP) $ docker network connect custom_net alpine1 # 容器alpine1关联到网络custom_net,并指定IP(注意:必须自定义子网才能指定IP) $ docker network connect custom_net --ip 172.100.0.10 alpine1 # 容器alpine1和网络custom_net取消关联 $ docker network disconnect custom_net alpine1 # 启动容器时指定IP $ docker run -it --rm --name alpine1 --network custom_net --ip=172.100.0.10 alpine sh # 删除一个网络 $ docker network rm custom_net ``` <br><br><br>
上一篇:
网卡开启混杂模式
下一篇:
Docker Volume总结
0
赞
138 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
文档导航