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