目录
[1. Docke服务未启动前(宿主机网卡信息)](#1. Docke服务未启动前(宿主机网卡信息))
[2. Docker 服务启动(新增网卡)](#2. Docker 服务启动(新增网卡))
[3. 作用](#3. 作用)
[4. 网络隔离实现](#4. 网络隔离实现)
[5. 总结](#5. 总结)
[1. 查看 Docker 网络模式](#1. 查看 Docker 网络模式)
[2. 创建新的 Docker 网络](#2. 创建新的 Docker 网络)
[3. 删除 Docker 网络](#3. 删除 Docker 网络)
[4. 查看网络元数据](#4. 查看网络元数据)
[5. 删除所有无效的网络](#5. 删除所有无效的网络)
[1. 四种默认网络模式](#1. 四种默认网络模式)
[2. 查看容器的网络模式](#2. 查看容器的网络模式)
[1. 默认创建的 docker0 网桥](#1. 默认创建的 docker0 网桥)
[2. docker0 网桥的内部接口](#2. docker0 网桥的内部接口)
[3. 桥接网络的默认设置](#3. 桥接网络的默认设置)
[4. 查看桥接网络详细信息并获取名称](#4. 查看桥接网络详细信息并获取名称)
[1. Linux 桥接原理](#1. Linux 桥接原理)
[2. 桥接模式基本流程](#2. 桥接模式基本流程)
[3. veth pair](#3. veth pair)
[4. 容器内部网卡 eth0](#4. 容器内部网卡 eth0)
[5. veth pair 和容器内 eth0 的匹配](#5. veth pair 和容器内 eth0 的匹配)
[1. 简介](#1. 简介)
[2. 特点](#2. 特点)
[3. 使用示例](#3. 使用示例)
[4. 注意事项](#4. 注意事项)
[5. 最佳实践](#5. 最佳实践)
[七、None 模式](#七、None 模式)
[1. 模式简介](#1. 模式简介)
[2. 特点](#2. 特点)
[3. 使用方式](#3. 使用方式)
[4. 应用场景](#4. 应用场景)
[5. 注意事项](#5. 注意事项)
[1. 模式简介](#1. 模式简介)
[2. 特点](#2. 特点)
[3. 使用方式](#3. 使用方式)
[4. 应用场景](#4. 应用场景)
[5. 注意事项](#5. 注意事项)
[1. 概述](#1. 概述)
[2. 创建自定义网络](#2. 创建自定义网络)
[3. 连接容器到自定义网络](#3. 连接容器到自定义网络)
[4. 自定义网络特点](#4. 自定义网络特点)
[5. 查看自定义网络信息](#5. 查看自定义网络信息)
[6. 删除自定义网络](#6. 删除自定义网络)
[7. 应用场景](#7. 应用场景)
[8. Docker 自定义网络通信测试](#8. Docker 自定义网络通信测试)
[1. 创建容器时,指定加入自定义网络](#1. 创建容器时,指定加入自定义网络)
[2. 进入 tomcat1 容器进行网络连接测试](#2. 进入 tomcat1 容器进行网络连接测试)
[十、Link 连接](#十、Link 连接)
[1. Link 连接的创建](#1. Link 连接的创建)
[2. 环境变量设置](#2. 环境变量设置)
[3. 使用 Link 连接](#3. 使用 Link 连接)
[4. 不建议使用 Link 连接](#4. 不建议使用 Link 连接)
一、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 网络模式
bash
docker network ls
默认网络模式:
- bridge: 桥接网络
- host: 主机网络
- none: 无网络
2. 创建新的 Docker 网络
bash
docker network create 【网络名称】
3. 删除 Docker 网络
bash
docker network rm 【网络名称】
4. 查看网络元数据
bash
docker network inspect 【网络名称】
5. 删除所有无效的网络
bash
docker network prune
ps:删除所有未被使用的 Docker 网络
三、Docker网络模式
1. 四种默认网络模式
|---------------|----------------------------------------------------------------------------------------------------------------|
| bridg | * 为每个容器分配并设置独立的 IP 地址,连接到名为 docker0
的虚拟网桥。 * 默认的网络模式。 * 使用方式: --network bridge
|
| host | * 容器共享主机的网络命名空间,使用主机的 IP 地址和端口。 * 不会虚拟出自己的网卡,直接使用宿主机的网络。 * 使用方式: --network host
|
| none | * 容器有独立的网络命名空间,但不进行任何网络设置,如不分配 veth pair 和虚拟网桥连接等。 * 完全隔离的网络环境。 * 使用方式: --network none
|
| container | * 新创建的容器不会创建自己的网卡和配置自己的 IP,而是与指定容器共享 IP、端口范围等。 * 使用方式: --network container:NAME
或 --network container:容器ID
|
2. 查看容器的网络模式
bash
# 通过inspect获取容器信息,最后20行即为容器的网络模式信息
docker inspect 【容器ID】 | tail -n 20
这些网络模式提供了不同层次的网络隔离和连接方式,允许根据应用程序的要求选择最合适的模式。选择正确的网络模式有助于实现容器之间的通信和访问外部网络。
四、docker0网桥
1. 默认创建的 docker0 网桥
Docker 服务默认创建一个名为 docker0
的桥接网络,它在内核层连接了其他物理或虚拟网卡,将所有容器和本地主机置于同一个物理网络中。
2. docker0 网桥的内部接口
docker0
网桥上有一个内部接口,用于在桥接网络中连通其他网卡。
3. 桥接网络的默认设置
Docker 服务默认指定了 docker0
接口的 IP 地址和子网掩码,以确保主机和容器可以通过该网桥相互通信。
4. 查看桥接网络详细信息并获取名称
bash
# 通过 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
。
bash
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
参数:
bash
docker run --network host tomcat
容器内部直接使用宿主机的网络配置,无需映射端口或额外配置网络。
4. 注意事项
若同时使用了 --network host
和 -p
端口映射,会收到警告:
bash
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 参数:
bash
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
bash
docker run --network container:existing_container my_container
新容器将与 existing_container 共享网络配置。
4. 应用场景
- 适用于需要新容器与已有容器共享网络配置,共享同一网络命名空间的场景。
- 可用于简化网络配置,使新容器与已有容器直接通信,而不需要通过 docker0 等桥接网络。
5. 注意事项
- Container 模式下,新容器的网络配置将与指定容器完全相同。
- 如果指定容器的网络配置发生变化,新容器的网络配置也会受到影响。
Container 模式提供了一种简化网络配置的方式,适用于需要新容器与已有容器共享相同网络配置的场景。这种模式下,两个容器将在同一个网络命名空间中运行,直接共享网络设置,使得它们可以直接通信,无需通过桥接网络。
九、自定义网络
1. 概述
Docker 允许用户创建自定义网络,以满足特定应用场景的网络需求。
自定义网络提供更灵活的网络配置选项,允许容器在自定义网络中进行通信。
2. 创建自定义网络
使用 docker network create 命令创建自定义网络
bash
docker network create my_network
3. 连接容器到自定义网络
在启动容器时,通过 --network 参数指定连接到的网络,例如:
bash
docker run --network my_network my_container
4. 自定义网络特点
- 隔离性: 自定义网络提供容器间的网络隔离,每个自定义网络有独立的网络命名空间。
- DNS 解析: Docker 提供内置 DNS 服务器,容器可以使用容器名称进行 DNS 解析。
5. 查看自定义网络信息
使用 docker network inspect 命令查看自定义网络的详细信息,例如:
bash
docker network inspect my_network
6. 删除自定义网络
使用 docker network rm 命令删除不再需要的自定义网络,例如:
bash
docker network rm my_network
7. 应用场景
- 适用于需要灵活网络配置的场景,允许容器在自定义网络中进行通信。
- 方便管理多个应用的网络设置,提供更细粒度的网络控制。
通过自定义网络,Docker 提供了一种强大的方式来管理容器的网络配置。用户可以创建多个自定义网络,实现不同应用之间的隔离,同时通过连接容器到特定网络,方便实现容器之间的通信。
8. Docker 自定义网络通信测试
1. 创建容器时,指定加入自定义网络
bash
# 通过 --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 容器进行网络连接测试
bash
# 直接 ping 容器名,不需要指定 IP 地址
ping tomcat2
十、Link 连接
Docker Link 连接是一种早期用于容器间通信的方式,它提供了简单的容器连接机制。然而,Docker Link 已被后来的网络模型所取代,因此推荐使用自定义网络等更现代的方式进行容器通信。
1. Link 连接的创建
bash
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 连接
在应用程序中,可以使用这些环境变量来确定如何连接到另一个容器。
bash
echo $alias_container1_PORT_80_TCP_ADDR
4. 不建议使用 Link 连接
- Docker Link 连接已被官方不推荐使用,因为它是一个过时的方法。
- 推荐使用自定义网络等现代网络模型来进行容器通信,以提高可维护性和灵活性。
尽管 Docker Link 连接仍然可以工作,但是出于可维护性和现代化的考虑,建议使用更先进的网络模型,如自定义网络,以满足容器之间通信的需求。