不暴漏端口号,如何使用 Docker Network 实现容器间互联?
发布于 作者:苏南大叔 来源:程序如此灵动~
在使用Docker部署应用的时候,通常需要多个容器之间进行端口通信。常规的做法就是:设置容器的端口及目录映射,然后利用主机做媒介,把容器的各个功能有效的组织起来。然而,更好的解决方案是:把这些容器放置到同一个network里面来,这样就不用做端口映射了。值得说明的是:docker network解决的是端口通信问题,而不是目录共享的类似问题。

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10,docker@28.0.4。本文将介绍如何使用docker network命令创建自定义网络,并配置容器间的通信。
传统方案:端口映射
默认情况下,Docker会为每个容器分配一个独立的网络命名空间。如果需要容器之间通信,通常会通过暴露端口的方式实现。然而,这种方式可能会带来以下问题:
- 安全性问题:暴露端口可能会让外部用户访问容器服务,增加攻击面。
- 复杂性:需要手动管理端口映射,容易造成宿主机的端口冲突。

新方案:docker network
通过Docker网络,我们可以将多个容器加入同一个自定义网络中,使它们能够通过容器名称直接通信,而无需暴露端口。
Docker提供了以下几种网络模式:
- bridge(默认模式):容器通过虚拟网桥通信,适合单机部署。
- host:容器共享主机网络,适合需要高性能的场景。
- none:容器没有网络,适合完全隔离的场景。
- overlay:用于跨主机的容器通信,适合
Swarm或Kubernetes。 - macvlan:容器直接获取主机网络的 MAC 地址,适合需要直接访问物理网络的场景。
最常用的就是bridge 模式了,自定义网络实现容器间通信。
创建自定义网络
可以通过下面的命令,要创建一个自定义的 bridge 网络sunan_network:
docker network create sunan_network此命令会创建一个名为 sunan_network 的网络,Docker 会自动为其分配一个子网和网关。

在没有容器
查看所有网络
可以通过下面的命令,查看所有可用的network。
docker network list启动容器,加入网络
在启动容器时,可以通过 --network 参数将容器加入自定义网络。例如:
docker run -d --name php-fpm --network sunan_network php:8.4.6-fpm
docker run -d --name nginx-1 --network sunan_network nginx:latest此时,php-fpm 和 nginx-1 都加入了 sunan_network,它们可以通过容器名称直接通信,并不需要配置端口了。

容器间通信
在 nginx-1 中,可以通过容器名称访问 php-fpm 提供的服务php-fpm:9000了,例如:
location ~ \.php$ {
fastcgi_pass php-fpm:9000;
#...
}
验证网络配置
可以使用以下命令查看网络中的容器:
docker network inspect sunan_network此命令会显示网络的详细信息,包括已连接的容器列表和 IP 地址分配。

已经添加到当前网络的容器,都有哪些。也可以使用这个命令。

动态添加容器到网络
例如,现在有个mysql:5.7的容器,已经启动,但是没有设置network:
docker run --name mysql57 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7如果容器已经启动,但未加入网络,可以使用以下命令将其动态添加到网络中:
docker network connect sunan_network mysql57同样,可以使用以下命令将容器从网络中移除:
docker network disconnect sunan_network mysql57
Docker Compose 的网络配置
如果使用Docker Compose,也可以通过 networks 配置实现容器间通信。例如docker-compose.yaml:
version: '3.8'
services:
nginx-1:
image: nginx:latest
networks:
- sunan_network
php-fpm:
image: php:8.4.6-fpm
networks:
- sunan_network
mysql57:
image: mysql:5.7
networks:
- sunan_network
networks:
sunan_network:
driver: bridge运行 docker-compose up 后,nginx-1 、 php-fpm、mysql57 会自动加入 sunan_network,并可以通过服务名称互相访问。
总结
通过Docker网络功能,我们可以轻松实现容器间的安全互联,而无需暴露端口。这种方式不仅提高了安全性,还简化了端口管理。无论是通过命令行还是 Docker Compose,都可以快速配置自定义网络,满足不同场景的需求。
更多苏南大叔的docker经验文字,请点击: