容器网络与端口映射
约 1331 字大约 4 分钟
Docker网络端口Docker Compose
2026-03-20
1. 先分清两个概念
Docker 里最容易混淆的是网络连通和端口映射,它们解决的不是同一个问题。
- 容器网络解决的是容器和容器之间怎么通信。
- 端口映射解决的是宿主机或外部访问者怎么进入容器。
如果两个容器在同一个 Docker 网络里,它们通常可以直接通过容器名互相访问;但如果宿主机没有做端口映射,浏览器或外部程序仍然无法直接访问容器里的服务。
2. Docker 常见网络模式
bridge
这是最常见的默认模式。容器会加入一个桥接网络,适合大多数单机部署场景。
特点是:
- 容器之间可以通过同一网络互通。
- 容器和宿主机之间是隔离的。
- 对外访问通常还需要配合端口映射。
host
容器直接复用宿主机网络栈,不再经过 Docker 自己的桥接层。
特点是:
- 不需要做额外的端口映射。
- 网络性能和排障路径更直接。
- 隔离性更弱,容易和宿主机已有端口冲突。
在 Linux 主机上这类模式更直接;如果是在 Docker Desktop 环境里使用,行为和预期可能与原生 Linux 不完全一致。
none
容器没有网络能力,适合极少数不需要联网的隔离场景。
3. 为什么推荐自定义网络
如果多个服务要协同工作,推荐自己创建网络,而不是全部塞进默认网络里。
docker network create app-net然后把容器加入同一个网络:
docker run -d --name mysql --network app-net mysql:8.4
docker run -d --name web --network app-net nginx:1.27.4这样做的好处是:
- 容器之间可以直接通过名字访问,例如
mysql:3306。 - 服务边界更清晰,不同系统可以拆到不同网络。
- 后面接入反向代理或其他中间件时更容易组织。
4. 端口映射的基本写法
Docker 最常见的端口映射写法如下:
docker run -d -p 8080:80 nginx:1.27.4它表示:
- 宿主机监听 8080 端口。
- 收到的请求转发到容器的 80 端口。
所以外部访问地址是 http://宿主机IP:8080,而不是容器内的 80 端口直接暴露出去。
5. 常见映射方式
宿主机端口到容器端口
docker run -d -p 3000:3000 gitea/gitea:1.24.6指定监听地址
如果只想本机访问,可以把端口绑定到回环地址:
docker run -d -p 127.0.0.1:8080:80 nginx:1.27.4这样外部机器不能直接访问,只能由宿主机本地程序访问。
UDP 端口
如果服务使用 UDP,可以显式指定协议:
docker run -d -p 53:53/udp some-dns-image6. compose 写法
在 Compose 里通常这样写:
services:
web:
image: nginx:1.27.4
ports:
- "8080:80"
networks:
- app-net
api:
image: node:22
command: npm run start
networks:
- app-net
networks:
app-net:
driver: bridge这里的含义是:
web对宿主机暴露 8080。api没有对外暴露端口,但在app-net内可以被其他容器访问。
如果只是想让同网络内其他服务知道容器内部会监听哪个端口,也可以使用 expose。它不会把端口发布到宿主机。
7. 容器之间怎么访问
在同一个自定义网络下,容器之间一般直接用服务名访问即可。
例如在 web 容器里访问 api:
http://api:3000这里不需要写宿主机 IP,也不需要用宿主机映射端口。
一个常见误区是:容器访问另一个容器时仍然去连 localhost。对于容器来说,localhost 指向的是它自己,而不是宿主机,也不是其他容器。
8. 什么时候不该随便暴露端口
并不是每个容器都应该映射端口到宿主机。
以下服务通常更适合只放在内部网络:
- 数据库。
- Redis。
- 仅供反向代理转发的内部 API。
- 中间处理服务或队列消费者。
如果这些服务只被同网络内的其他容器调用,就没必要额外暴露到宿主机,能减少攻击面,也更不容易产生端口冲突。
9. 排查网络与端口问题的顺序
遇到访问问题时,可以按这个顺序排查:
docker ps确认容器是否在运行,端口是否真的映射出来。docker inspect <container>查看网络和端口配置。- 在宿主机上确认端口是否被监听。
- 在容器内部确认服务进程是否真的监听了目标端口。
- 检查防火墙、反向代理和安全组规则。
10. 一个实用建议
单机服务编排时,建议采用这条简单原则:
- 容器间通信用自定义网络和服务名。
- 对外入口尽量只暴露一个反向代理或网关。
- 数据库和内部服务默认不暴露宿主机端口。
这样后续做迁移、扩容和排障都会更清晰。