# Introduce

Docker 网络中的三个概念,

# 沙盒(sandbox)

提供容器的虚拟网络栈,也就是端口套接字、IP路由表、防火墙等内容。形成完全独立的容器网络环境,实现容器网络与宿主机网络的隔离。

# 网络(network)

Docker 内部的虚拟子网,网络内的参与者相互可见并能够进行通讯。 这种虚拟网络与宿主机网络存在隔离关系,其目的主要是形成容器间的安全通讯环境。

# 端点(Endpoint)

位于容器或网络隔离墙上的端点,是一个内外网络通讯的出入口。通过配对容器端点和网络端点,构建桥梁完成网络通讯。

这三者形成了 Docker 网络的核心模型,也就是容器网络模型(Container Network Model)

# Docker 网络实现

容器网络模型为容器引擎提供了一条标准的网络对接范式,在 Docker 中封装的 libnetwork 模块实现了该范式。

Docker 提供了五种 Docker 网络驱动

# Bridge Driver

Docker 默认的网络驱动。

# Host Driver

# Overlay Driver

借助Docker集群模块 Docker Swarm 来搭建的跨 Docker Daemon 网络。

# MacLan Driver

# None Driver

# 管理网络

容器能够相互连接的前提是两者处于一个网络中(这里的网络是指容器网络模型中的网络)。这里的网络指的是 Docker 所虚拟的子网。 将容器网络沙盒(sanbox)看做虚拟主机,只有当多个主机在同一子网中,才嫩能够相互进行网络数据交换。

在 Docker 中,启动的 Docker 服务默认 bridge 网络,在不专门指定网络的情况下,所有容器连接到同一个子网中。

# 验证

docker 启动一个简易的 mysql 容器和 redis 容器,通过 docker inspect 验证观点

# 查看 mysql 容器信息

# docker inspect mysql_1
--------------
"Networks": {
    "bridge": {
        "IPAMConfig": null,
        "Links": null,
        "Aliases": null,
        "NetworkID": "74a076c2xxxxxx",
        "EndpointID": "d4b49c95fdb95edxxxx",
        "Gateway": "172.17.0.1",
        "IPAddress": "172.17.0.2",
        "IPPrefixLen": 16,
        "IPv6Gateway": "",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "MacAddress": "02:42:ac:11:00:02",
         "DriverOpts": null
    }
}
--------------

# 查看 redis 容器信息

# docker inspect redis1
----------------
"Networks": {
    "bridge": {
        "IPAMConfig": null,
        "Links": null,
        "Aliases": null,
        "NetworkID": "74a076c2xxx",
        "EndpointID": "cc3e0e70395f58e363c16xxx",
        "Gateway": "172.17.0.1",
        "IPAddress": "172.17.0.3",
        "IPPrefixLen": 16,
        "IPv6Gateway": "",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "MacAddress": "02:42:ac:11:00:03",
        "DriverOpts": null
    }
}
----------------

# 结论

默认都是 bridge 网络,且在同一个 Docker 所虚拟的子网中。

精彩内容推送,请关注公众号!
最近更新时间: 4/14/2020, 8:23:49 PM