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 veth2d3f4e1docker0是虚拟网桥。- 每个
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 eth0test1的 IP 地址是:172.17.0.2。
-
进入
test2容器,查看其 IP:docker exec -it test2 bash ip addrtest2的 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访问。
测试验证过程
宿主机使用到的命令:
docker run -itd --name test1 --net=cntf_network --network-alias=webtest ubuntu:latest
docker run -itd --name test2 --net=cntf_network ubuntu:22.04
docker exec -it test1 bash
docker exec -it test2 bash
docker ps -a
docker exec -it test2 bash`






5. 总结
-
默认网络:
- Docker 默认使用桥接模式,容器间通过 IP 地址通信。
- 容器重启或删除后重新启动,IP 地址可能发生变化。
-
网络别名解决方案:
- 使用 网络别名,避免因 IP 地址变化导致通信失败。
- 配置步骤:
- 创建自定义网络。
- 运行容器时指定
--network-alias参数。
-
场景推荐:
- 测试环境: 使用默认桥接模式(
docker0)。 - 生产环境: 使用自定义网络,并设置网络别名。
- 测试环境: 使用默认桥接模式(
迷茫的人生,需要不断努力,才能看清远方模糊的志向!

浙公网安备 33010602011771号