目录
一、Docke服务启动前和启动后区别
1. Docke服务未启动前(宿主机网卡信息)
- ens33 或 eth0:本机网卡
- lo:本机回环网络网卡
- 可能存在 virbr0:虚拟化服务创建的网桥,用于连接虚拟网卡提供 NAT 访问外网功能(可移除)
2. Docker 服务启动(新增网卡)
- docker0:Docker 守护进程创建的桥接网络
- 用于容器间通信和与宿主机的通信
- 允许容器通过容器名称或 IP 地址直接进行通信
- 内置 DNS 服务器,容器名称解析成容器的 IP 地址
3. 作用
- 容器间通信: 实现容器之间的互联和通信,不需要暴露主机端口
- 服务名解析: Docker 内置 DNS 服务器支持通过服务名解析容器 IP 地址
- 网络隔离: 使用 Linux 内核的 namespace 和 cgroup 特性实现容器的网络隔离
4. 网络隔离实现
- Docker 使用 Linux 内核的 namespace 和 cgroup 特性
- 每个容器拥有独立的网络命名空间,实现容器之间的隔离
5. 总结
- Docker 的网络特性为容器提供了灵活的部署和管理环境,通过网络隔离确保容器之间的通信是可控的。
- Docker0 网卡是关键的桥接网络,促进了容器间的通信和与外部网络的连接。
二、Docker网络相关命令
1. 查看 Docker 网络模式
docker network ls
默认网络模式:
- bridge: 桥接网络
- host: 主机网络
- none: 无网络
2. 创建新的 Docker 网络
docker network create 【网络名称】
3. 删除 Docker 网络
docker network rm 【网络名称】
4. 查看网络元数据
docker network inspect 【网络名称】
5. 删除所有无效的网络
docker network prune
ps:删除所有未被使用的 Docker 网络
三、Docker网络模式
1. 四种默认网络模式
bridg |
|
host |
|
none |
|
container |
|
2. 查看容器的网络模式
# 通过inspect获取容器信息,最后20行即为容器的网络模式信息
docker inspect 【容器ID】 | tail -n 20
这些网络模式提供了不同层次的网络隔离和连接方式,允许根据应用程序的要求选择最合适的模式。选择正确的网络模式有助于实现容器之间的通信和访问外部网络。
四、docker0网桥
1. 默认创建的 docker0 网桥
Docker 服务默认创建一个名为 docker0
的桥接网络,它在内核层连接了其他物理或虚拟网卡,将所有容器和本地主机置于同一个物理网络中。
2. docker0 网桥的内部接口
docker0
网桥上有一个内部接口,用于在桥接网络中连通其他网卡。
3. 桥接网络的默认设置
Docker 服务默认指定了 docker0
接口的 IP 地址和子网掩码,以确保主机和容器可以通过该网桥相互通信。
4. 查看桥接网络详细信息并获取名称
# 通过 docker network inspect 命令查看桥接网络的详细信息,并使用 grep 获取网络的名称。
docker network inspect bridge | grep name
通过这些信息,可以了解 Docker 桥接网络的默认设置和配置,以及确保主机和容器在同一个网络中能够互相通信。docker0
网桥在 Docker 中扮演了关键的角色,促进了容器和主机之间的网络连接。
五、bridge模式(桥接模式)
1. Linux 桥接原理
- Docker 使用 Linux 桥接,在宿主机上虚拟一个 Docker 容器网桥(通常为
docker0
)。 - 当启动一个容器时,Docker 根据 Docker 网桥的网段为容器分配一个 IP 地址(称为 Container-IP),并将 Docker 网桥设置为容器的默认网关。
2. 桥接模式基本流程
- 在使用
docker run
启动容器时,如果没有指定--network
参数,默认使用的是桥接模式(bridge),即使用docker0
网桥。 - 在宿主机上使用
ifconfig
可以看到docker0
和通过docker network create
命令创建的网络。
3. veth pair
- Docker 在
docker0
网桥上创建一对对等虚拟设备接口,分别是veth
和eth0
。 - 每对
veth
和eth0
配对,其中veth
位于宿主机,而eth0
位于容器内。这对接口称为 veth pair。
4. 容器内部网卡 eth0
- 容器内部也有一块网卡,通常命名为
eth0
。 - 当进入容器执行
ip addr
命令时,可以看到容器内的网卡信息,包括eth0
。
ip addr
5. veth pair 和容器内 eth0 的匹配
- Docker 将每个容器内部的
eth0
与宿主机上veth
成对匹配。 - 在宿主机执行
ip addr
命令时,可以看到对应的veth
编号,而在容器内执行同样的命令,可以看到匹配的eth0
编号。
桥接模式通过创建 veth pair,将容器的内部网卡 eth0
与宿主机的 veth
进行匹配,使得容器内部和宿主机之间可以通过桥接网络 docker0
直接通信。
这种网络模式使得容器的网络配置和通信变得简便且高效。
六、host模式
1. 简介
- 使用 Host 模式时,容器与宿主机共享同一个 Network Namespace,直接使用宿主机的 IP 地址与外界通信,无需额外的 NAT 转换。
- 容器不再虚拟出自己的网卡,而是直接使用宿主机的 IP 和端口。
2. 特点
- 容器与宿主机共享相同的网络命名空间,消除了网络隔离。
- 直接使用宿主机网络配置,使容器与外界通信更为直接高效。
3. 使用示例
在 docker run
命令中使用 --network host
参数:
docker run --network host tomcat
容器内部直接使用宿主机的网络配置,无需映射端口或额外配置网络。
4. 注意事项
若同时使用了 --network host
和 -p
端口映射,会收到警告:
WARNING: Published ports are discarded when using host network mode
因为 Host 模式下容器直接使用宿主机的端口,导致 -p
端口映射被丢弃。
5. 最佳实践
避免同时使用 --network host
和 -p
端口映射,以充分发挥 Host 模式的优势。
如不需要直接使用宿主机网络,可考虑使用其他网络模式,如桥接模式(bridge)。
Host 模式适用于需要容器与宿主机之间进行高性能通信的场景,但需注意网络隔离方面的潜在挑战。在选择网络模式时,根据具体需求权衡网络性能和隔离性。
七、None 模式
1. 模式简介
None 模式下,每个容器都拥有独立的 Network Namespace,但不进行任何网络设置,不分配 veth pair 和虚拟网桥连接,也不配置 IP 地址。
2. 特点
- 容器在完全隔离的网络环境中运行,不与宿主机或其他容器直接连接。
- 不分配虚拟网桥和 veth pair,容器无法直接访问外部网络。
3. 使用方式
在 docker run 命令中使用 --network none 参数:
docker run --network none my_container
容器启动后将没有任何网络配置,需手动进行网络设置。
4. 应用场景
- 适用于特殊场景,需要完全隔离容器与外部网络,且容器间无需直接通信的情况。
- 通常需要手动配置容器的网络设置,包括 IP 地址 等。
5. 注意事项
- 在 None 模式下,容器无法自动获得网络连接,需要手动进行网络配置。
- 不适用于需要与其他容器或外部网络进行通信的场景。
None 模式提供了一种极端的网络隔离,适用于特殊场景,例如需要容器运行在一个与宿主机完全隔离的网络环境中,且容器间不需要直接通信的情况。在使用 None 模式时,需要谨慎手动配置容器的网络设置。
八、container模式
1. 模式简介
在 Container 模式下,新创建的容器将不会创建自己的网卡和配置自己的 IP 地址,而是与一个指定的容器共享 IP、端口范围等网络配置。
2. 特点
- 新容器与指定容器共享相同的网络命名空间,即它们使用相同的网络配置。
- 不再创建独立的 veth pair,而是与指定容器的网络配置进行匹配。
3. 使用方式
在 docker run 命令中使用 --network container:NAME 或 --network container:容器ID
docker run --network container:existing_container my_container
新容器将与 existing_container 共享网络配置。
4. 应用场景
- 适用于需要新容器与已有容器共享网络配置,共享同一网络命名空间的场景。
- 可用于简化网络配置,使新容器与已有容器直接通信,而不需要通过 docker0 等桥接网络。
5. 注意事项
- Container 模式下,新容器的网络配置将与指定容器完全相同。
- 如果指定容器的网络配置发生变化,新容器的网络配置也会受到影响。
Container 模式提供了一种简化网络配置的方式,适用于需要新容器与已有容器共享相同网络配置的场景。这种模式下,两个容器将在同一个网络命名空间中运行,直接共享网络设置,使得它们可以直接通信,无需通过桥接网络。
九、自定义网络
1. 概述
Docker 允许用户创建自定义网络,以满足特定应用场景的网络需求。
自定义网络提供更灵活的网络配置选项,允许容器在自定义网络中进行通信。
2. 创建自定义网络
使用 docker network create 命令创建自定义网络
docker network create my_network
3. 连接容器到自定义网络
在启动容器时,通过 --network 参数指定连接到的网络,例如:
docker run --network my_network my_container
4. 自定义网络特点
- 隔离性: 自定义网络提供容器间的网络隔离,每个自定义网络有独立的网络命名空间。
- DNS 解析: Docker 提供内置 DNS 服务器,容器可以使用容器名称进行 DNS 解析。
5. 查看自定义网络信息
使用 docker network inspect 命令查看自定义网络的详细信息,例如:
docker network inspect my_network
6. 删除自定义网络
使用 docker network rm 命令删除不再需要的自定义网络,例如:
docker network rm my_network
7. 应用场景
- 适用于需要灵活网络配置的场景,允许容器在自定义网络中进行通信。
- 方便管理多个应用的网络设置,提供更细粒度的网络控制。
通过自定义网络,Docker 提供了一种强大的方式来管理容器的网络配置。用户可以创建多个自定义网络,实现不同应用之间的隔离,同时通过连接容器到特定网络,方便实现容器之间的通信。
8. Docker 自定义网络通信测试
1. 创建容器时,指定加入自定义网络
# 通过 --network 参数将两个 Tomcat 容器连接到名为 tomcat_network 的自定义网络中。
docker run -d -p 8081:8080 --network tomcat_network --name tomcat1 tomcat:8.5-jdk8-corretto
docker run -d -p 8082:8080 --network tomcat_network --name tomcat2 tomcat:8.5-jdk8-corretto
2. 进入 tomcat1 容器进行网络连接测试
# 直接 ping 容器名,不需要指定 IP 地址
ping tomcat2
十、Link 连接
Docker Link 连接是一种早期用于容器间通信的方式,它提供了简单的容器连接机制。然而,Docker Link 已被后来的网络模型所取代,因此推荐使用自定义网络等更现代的方式进行容器通信。
1. Link 连接的创建
docker run -d --name container1 nginx docker run -d --name container2 --link container1:alias_container1 nginx
当容器使用 --link
参数连接到其他容器时,Docker 将在两个容器之间创建一个连接,同时设置了一些环境变量,使得两个容器能够相互访问。
在上述例子中,container2
连接到了 container1
,并设置了别名为 alias_container1
。
2. 环境变量设置
Docker Link 会在被链接容器中设置一些环境变量,以便简化通信。
alias_container1_PORT_80_TCP_ADDR
:container1
容器的 IP 地址alias_container1_PORT_80_TCP_PORT
:container1
容器的端口alias_container1_PORT_80_TCP
: 完整的连接信息
3. 使用 Link 连接
在应用程序中,可以使用这些环境变量来确定如何连接到另一个容器。
echo $alias_container1_PORT_80_TCP_ADDR
4. 不建议使用 Link 连接
- Docker Link 连接已被官方不推荐使用,因为它是一个过时的方法。
- 推荐使用自定义网络等现代网络模型来进行容器通信,以提高可维护性和灵活性。
尽管 Docker Link 连接仍然可以工作,但是出于可维护性和现代化的考虑,建议使用更先进的网络模型,如自定义网络,以满足容器之间通信的需求。