目录
- 一、利用宿主机 IP + 外部端口实现容器互访
- 1.思路
- 2.示例操作
- 3.访问测试
- 4.工作原理
- 5.总结
- 二、Docker 容器之间的网络通信(docker0 与自定义桥接网络)
- 1. docker0 简介
- 2. 通过容器 IP 访问
- 3. 自定义桥接网络(推荐方式)
- 创建自定义网络
- 启动容器并加入网络
- 容器间通过名字访问
- 4. 总结
一、利用宿主机 IP + 外部端口实现容器互访
借助 宿主机 IP + 端口映射 的方式,让不同容器之间互相访问。这种方法相对简单直观,但中间多了一次“绕行”宿主机的过程。
1.思路
- 启动容器时,将容器的服务端口映射到宿主机的某个端口。
- 其他容器通过 宿主机 IP + 映射端口 的形式访问目标容器的服务。
2.示例操作
假设我们创建两个容器:
app1
→ 宿主机端口 88 对应容器端口 80app2
→ 宿主机端口 99 对应容器端口 80
启动命令如下:
# 启动 app1
docker run -d -p 88:80 --name app1 nginx:stable-perl# 启动 app2
docker run -d -p 99:80 --name app2 nginx:stable-perl
3.访问测试
在宿主机或容器内部均可使用 curl
进行访问:
# 访问 app1
curl http://192.168.121.140:88# 访问 app2
curl http://192.168.121.140:99
其中 192.168.121.140
是宿主机的 IP 地址。
4.工作原理
当执行:
curl http://192.168.121.140:99
时,实际过程如下:
- 请求先到达宿主机 IP
192.168.121.140
的端口99
; - Docker 端口映射规则将请求转发到
app2
容器内部的80
端口; - 容器返回响应,再由宿主机转发给请求方。
⚠️ 这种方式相比容器直接通信会多经过一次宿主机转发,因此性能上略有开销。
5.总结
- 优点:简单直观,不需要配置额外的 Docker 网络。
- 缺点:容器间通信要绕过宿主机,效率较低,不如自定义网络灵活。
二、Docker 容器之间的网络通信(docker0 与自定义桥接网络)
在使用 Docker 的过程中,容器之间往往需要进行网络通信。Docker 默认会在宿主机上创建一个名为 docker0 的虚拟网桥,它在容器网络中扮演着重要角色。
1. docker0 简介
当你在宿主机上安装 Docker 后,系统会自动生成一个虚拟网卡:
ifconfig
你会看到类似 docker0
的网桥接口:
它的作用是:
- 容器与宿主机通信:每个容器都会通过 veth pair 接入
docker0
,因此容器可以直接与宿主机通信。 - 容器与容器通信:在同一
bridge
网络下,容器之间可以通过 IP 地址互通。
2. 通过容器 IP 访问
我们可以使用 docker container inspect
命令来查看容器的分配 IP 地址:
docker container inspect app1
然后在另一容器中,通过 curl
就能访问这个容器的服务:
curl http://容器IP:端口
不过这种方式存在一个问题:容器 IP 可能会变化(例如容器重启后)。因此,直接使用 IP 不是一个可靠的解决方案。
3. 自定义桥接网络(推荐方式)
Docker 默认的 bridge
网络不支持容器名解析(即不能直接通过容器名访问另一个容器),我们可以通过创建自定义网络来解决这一问题。
创建自定义网络
docker network create mynet
启动容器并加入网络
docker run -d -p 88:80 --name app1 --network mynet nginx:stable-perl
docker run -d -p 99:80 --name app2 --network mynet nginx:stable-perl
容器间通过名字访问
此时,在 mynet
网络下,容器之间不仅可以通过 IP 互通,还可以通过 容器名 来访问:
curl http://app2:80
相比直接使用 IP,这种方式更稳定,不会受到容器 IP 变化的影响。
4. 总结
docker0
是 Docker 默认创建的虚拟网桥,用于实现容器与宿主机、容器与容器之间的通信。- 直接使用容器 IP 虽然可行,但不够稳定。
- 推荐使用自定义桥接网络,这样容器可以通过 容器名 互相访问,更加直观与可靠。