详解Docker使用Linux iptables 和 Interfaces管理容器网络

论坛 期权论坛 脚本     
niminba   2021-5-23 02:59   2013   0

我使用docker至今已有一段时间了,与绝大部分的人一样,我被docker强大的功能和易用性深深的折服。简单方便是docker的核心之一,它强大的功能被抽象成了非常简单的命令。当我在使用和学习docker的时候,我很想知道docker在后台都做了一些什么事情,特别是在网络这一块(我最感兴趣的一块)

我找到了很多关于创建和操作容器网络的文档,但是关于docker如何使网络工作的却没有那么多。 Docker广泛使用linux iptables和网桥接口,这篇文章是我如何用于创建容器网络的总结,大部分信息来自github上的讨论,演示文稿,以及我自己的测试。文章结尾我会给出我认为非常有用的资料链接。

我写这篇文章使用的是docker 1.12.3,但这不是作为对docker网络的全面描述,也不作为docker网络的介绍。我只希望这篇文章能给大家开拓视野,也非常感谢所有对文章错误,缺失的反馈和批评。

Docker网络概览

Docker的网络建立在允许任何一方编写自己的网络驱动程序的容器网络模型(CNM)之上。这允许不同的网络类型可用于在docker引擎上运行的容器,并且容器可以同时连接到多个网络。除了各种第三方网络驱动程序可用,docker自带四个内置网络

驱动程序:

Bridge: 这是启动容器的默认网络。通过docker主机上的网桥接口实现连接。 使用相同网桥的容器有自己的子网,并且可以相互通信(默认情况下)。

Host:这个驱动程序允许容器访问docker主机自己的网络空间(容器将看到和使用与docker主机相同的接口)。

Macvlan:此驱动程序允许容器直接访问主机的接口或子接口(vlan)。 它还允许中继链接。

Overlay:此驱动程序允许在运行docker的多个主机(通常是docker群集群)上构建网络。 容器还具有自己的子网和网络地址,并且可以直接相互通信,即使它们在不同的物理主机上运行。

Bridge和Overlay可能是最常用的网络驱动程序,在本文和下一篇文章中我将主要关注这两个驱动程序。

Docker Bridge 网络

在docker主机上运行的容器的默认网络是。 Docker在首次安装时创建一个名为“bridge”的默认网络。 我们可以列出所有docker网络来查看此网络 docker network ls:

$ docker network ls
NETWORK ID     NAME        DRIVER       SCOPE
3e8110efa04a    bridge       bridge       local
bb3cd79b9236    docker_gwbridge   bridge       local
22849c4d1c3a    host        host        local
3kuba8yq3c27    ingress       overlay       swarm
ecbd1c6c193a    none        null        local

要检查其属性,运行docker network inspect bridge 

$ docker network inspect bridge
[
  {
    "Name": "bridge",
    "Id": "3e8110efa04a1eb0923d863af719abf5eac871dbac4ae74f133894b8df4b9f5f",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "IPAM": {
      "Driver": "default",
      "Options": null,
      "Config": [
        {
          "Subnet": "172.18.0.0/16",
          "Gateway": "172.18.0.1"
        }
      ]
    },
    "Internal": false,
    "Containers": {},
    "Options": {
      "com.docker.network.bridge.default_bridge": "true",
      "com.docker.network.bridge.enable_icc": "true",
      "com.docker.network.bridge.enable_ip_masquerade": "true",
      "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
      "com.docker.network.bridge.name": "docker0",
      "com.docker.network.driver.mtu": "1500"
    },
    "Labels": {}
  }
]

你还可以使用docker network create命令并指定选项--driver bridge创建自己的网络,例如

docker network create --driver bridge --subnet 192.168.100.0/24 --ip-range 192.168.100.0/ 24 my-bridge-network创建另一个网桥网络,名称为“my-bridge-network”,子网为192.168.100.0/24。

Linux 网桥接口

docker创建的每个网桥网络由docker主机上的网桥接口呈现。、 默认桥网络“bridge”通常具有与其相关联的接口docker0,并且使用docker network create命令创建的每个后续网桥网络将具有与其相关联的新接口。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP