Docker 容器网络互联及网络别名
以下是 Docker 容器网络互联及网络别名 的详细解析和实验指导:
1. 什么是 Docker 容器的网络互联?
1.1 简介
- Docker 容器在运行时,默认通过 虚拟网桥(如
docker0
) 实现网络通信。 - 每个容器会自动分配一个独立的 IP 地址,容器之间可以通过 IP 地址进行通信。
- 但如果一个容器的 IP 地址发生变化(例如容器重启或删除后重新创建),其他容器可能会无法访问。
1.2 四种网络模式
-
桥接模式(Bridge,默认模式):
- 容器通过虚拟网桥(
docker0
)与宿主机和其他容器通信。 - 容器会分配独立的 IP 地址,默认隔离。
命令:
docker run --net=bridge [OPTIONS] - 容器通过虚拟网桥(
-
主机模式(Host):
- 容器与宿主机共享网络栈,容器不分配独立 IP 地址。
- 容器使用宿主机的 IP 和端口,性能较高,但不隔离。
命令:
docker run --net=host [OPTIONS] -
容器模式(Container):
- 新的容器共享另一个已存在容器的网络栈。
- 两个容器共享同一个 IP 地址和端口。
命令:
docker run --net=container:<container_name_or_id> [OPTIONS] -
无网络模式(None):
- 容器完全隔离,没有网络连接。
命令:
docker run --net=none [OPTIONS]
2. Docker 网络基础
2.1 Docker 默认网络(桥接模式)
- 安装 Docker 后,会自动创建一个虚拟网桥
docker0
。 docker0
网桥的典型特点:- 默认 IP 地址:
172.17.0.1
。 - 子网掩码:
/16
。 - 每个运行的容器会通过 虚拟网卡设备对(
veth
) 与docker0
网桥连接。- 一个接口在容器中,另一个接口在宿主机上。
- 容器之间可以通过
172.17.x.x
的 IP 地址通信。
- 默认 IP 地址:
2.2 查看 Docker 网络
-
检查
docker0
网桥:ip addr show docker0 -
安装网桥管理工具:
yum install -y bridge-utils -
使用
brctl
查看网桥配置:brctl show 输出示例:
bridge name bridge id STP enabled interfaces docker0 8000.0242ac110001 no veth1c2b4c0 veth2d3f4e1 docker0
是虚拟网桥。- 每个
veth
接口对应一个正在运行的容器。
3. 容器互联实验
以下是演示 Docker 容器间的网络通信及设置网络别名的实验过程:
3.1 创建两个容器
-
创建第一个容器(
test1
):docker run -itd --name test1 centos -
创建第二个容器(
test2
):docker run -itd --name test2 centos -
查看所有运行中的容器:
docker ps
3.2 检查容器 IP 地址
-
进入
test1
容器,查看其 IP:docker exec -it test1 bash ip addr 示例输出:
3: eth0@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 test1
的 IP 地址是:172.17.0.2
。
-
进入
test2
容器,查看其 IP:docker exec -it test2 bash ip addr test2
的 IP 地址是:172.17.0.3
。
3.3 测试容器间的通信
-
进入
test2
容器,Pingtest1
容器的 IP 地址:ping 172.17.0.2 - 如果成功,说明容器间通过默认桥接网络可以通信。
3.4 容器重启后 IP 变化问题
-
删除并重新启动
test1
容器:docker rm -f test1 docker run -itd --name test1 centos -
再次查看
test1
的 IP 地址:docker exec -it test1 bash ip addr -
新 IP 地址可能发生变化(例如:
172.17.0.4
)。- 如果
test2
容器尝试访问旧 IP 将失败。
- 如果
4. 设置 Docker 网络别名
4.1 什么是网络别名?
- 网络别名是为容器创建的一个友好名称,容器间可以通过这个别名直接访问,而无需关心 IP 地址变化。
- 类似于域名的作用。
4.2 实验:使用网络别名
-
删除旧容器:
docker rm -f test1 test2 -
创建一个自定义网络:
docker network create my_network -
运行容器
test1
并设置网络别名:docker run -itd --name test1 --net=my_network --network-alias=webserver centos -
运行容器
test2
并加入同一个网络:docker run -itd --name test2 --net=my_network centos -
测试别名通信:
-
进入
test2
容器:docker exec -it test2 bash -
Ping
test1
容器的网络别名:ping webserver - 成功说明:通过别名可以直接访问容器。
-
-
即使
test1
的 IP 变化,test2
仍然可以通过webserver
访问。
5. 总结
-
默认网络:
- Docker 默认使用桥接模式,容器间通过 IP 地址通信。
- 容器重启或删除后重新启动,IP 地址可能发生变化。
-
网络别名解决方案:
- 使用 网络别名,避免因 IP 地址变化导致通信失败。
- 配置步骤:
- 创建自定义网络。
- 运行容器时指定
--network-alias
参数。
-
场景推荐:
- 测试环境: 使用默认桥接模式(
docker0
)。 - 生产环境: 使用自定义网络,并设置网络别名。
- 测试环境: 使用默认桥接模式(
迷茫的人生,需要不断努力,才能看清远方模糊的志向!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?