Appearance
Docker Network
1. 基本概念
Docker 网络的核心功能是为容器提供隔离性和可连接性:
隔离性:确保容器之间的网络流量互不干扰,保证安全性。
可连接性:允许容器之间、容器与宿主机之间,以及容器与外部网络之间进行通信。
Docker 使用 Linux 的网络命名空间(Namespace)和虚拟网络接口(veth pair)来实现其网络功能。
Docker 默认提供内置的 DNS 服务,容器可以通过服务名称互相解析。
2. 网络模式
Docker 提供了以下几种网络模式:
2.1. Bridge 网络(默认网络)
描述:Bridge 网络是 Docker 默认创建的网络模式。每个容器连接到一个虚拟网桥(如
docker0),容器之间可以通过这个网桥通信。特点:
- 容器通过虚拟网卡(veth pair)连接到网桥;
- 具有自己的子网和网关;
- 使用 NAT 将流量转发到外部网络;
应用场景:容器间需要通信,但不需要直接暴露给外部网络。
2.2. Host 网络
描述:Host 网络模式下,容器与宿主机共享网络栈,容器直接使用宿主机的网络接口。
特点:
- 没有网络隔离,性能最高;
- 容器的端口直接暴露到宿主机;
应用场景:需要极高的网络性能或需要访问宿主机的网络资源。
2.3. None 网络
描述:容器没有分配网络接口。
特点:
- 完全隔离的网络环境;
- 没有网络功能;
应用场景:需要完全自定义网络或进行安全隔离的场景。
2.4. Overlay 网络
描述:Overlay 网络主要用于跨宿主机的容器通信,适用于 Swarm 或 Kubernetes 集群环境。
特点:
- 容器在不同宿主机之间通信;
- 通过 VXLAN 实现跨主机网络;
应用场景:分布式应用程序和微服务架构。
2.5. Macvlan 网络
描述:Macvlan 网络为每个容器分配一个物理网络接口的 MAC 地址,使其看起来像是独立的物理设备。
特点:
- 容器与外部网络直接通信,绕过宿主机的网络堆栈;
- 与传统网络设备兼容性好;
应用场景:需要容器直接暴露到物理网络的场景,例如高性能网络需求或与现有网络架构集成。
3. 网络管理命令
3.1. 查看网络
Bash
docker network ls3.2. 创建网络
Bash
docker network create [OPTIONS] NETWORK
# example
docker network create \
-d bridge \
--subnet 192.168.0.0/16 \
--gateway 192.168.0.1
mynetwork常用选项说明:
-d:管理网络的驱动程序(默认bridge);--subnet:表示网段的 CIDR 格式的子网;--gateway:主子网的 IPv4 或 IPv6 网关;
3.3. 查看网络详情
Bash
docker network inspect <network-name>3.4. 删除网络
Bash
docker network rm <network-name>3.5. 运行容器时指定网络
Bash
docker run --network <network-name> <image-name>3.6. 将容器连接到网络
Bash
docker network connect <network> <container>4. 容器互联
在默认情况下,docker0 网桥下的容器不支持通过容器名称直接互相访问,因为它们没有默认启用基于容器名称的 DNS 解析。这是因为 docker0 网桥只是一个虚拟网桥,默认情况下没有附带 DNS 服务支持。
如果需要容器通过名称互相访问,可以通过以下方法实现:
4.1. 使用容器的 --link 参数(不推荐)
--link 参数可以在默认 docker0 网桥上实现名称解析,但这种方法已被标记为过时,不建议在新项目中使用。
实现步骤:
运行第一个容器:
Bashdocker run -d --name container1 alpine sleep 3600运行第二个容器,并通过
--link关联第一个容器:Bashdocker run -d --name container2 --link container1 alpine sleep 3600测试访问:
Bashdocker exec container2 ping container1
4.2. 使用自定义 Bridge 网络
Docker 自定义创建的 Bridge 网络支持 DNS 服务,容器可以通过名称互相解析和访问。
实现步骤:
创建自定义网络:
Bashdocker network create my_bridge_network启动容器并加入自定义网络:
Bashdocker run -d --name container1 --network my_bridge_network alpine sleep 3600 docker run -d --name container2 --network my_bridge_network alpine sleep 3600测试容器间的名称访问:
Bashdocker exec container1 ping container2在自定义网络中,Docker 提供了内置的 DNS 服务,允许容器通过名称互相解析。
4.3. 使用 Docker Compose 管理容器
使用 Docker Compose 可以简化网络管理,容器默认会加入同一个自定义网络,并且支持通过服务名称(容器名称)互相解析。
示例 Compose 配置文件:
docker-compose.ymlyaml
version: '3.8'
services:
app1:
image: alpine
container_name: container1
command: sleep 3600
app2:
image: alpine
container_name: container2
command: sleep 3600启动服务:
Bash
docker compose up -d测试名称访问:
Bash
docker exec container1 ping container2