不暴漏端口号,如何使用 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
经验文字,请点击:


