当 Docker 容器无法从外部访问时,通常涉及网络配置、端口映射或防火墙等问题。以下是逐步排查和解决方案:
docker ps
Up
状态。若未运行,先启动容器:
bash
docker start <容器名/ID>
检查容器端口映射:
docker port <容器名/ID>
# 或查看详细配置
docker inspect <容器名/ID> | grep -i "ports"
0.0.0.0:8080->80/tcp
的条目,表示主机 8080 端口映射到容器的 80 端口。启动时未映射端口?
重新运行容器并显式映射端口:
docker run -d -p <主机端口>:<容器端口> <镜像名>
(例如:docker run -d -p 8080:80 nginx
)
主机防火墙(如 ufw
或 firewalld
):
sudo ufw status # Ubuntu
sudo firewall-cmd --list-ports # CentOS
sudo ufw allow 8080/tcp
# 或
sudo firewall-cmd --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
云服务商安全组(AWS/Azure/阿里云等):
确保安全组规则允许入站流量访问目标端口。
默认桥接网络(bridge):
确保使用 -p
参数发布端口。若未指定,容器仅在内部网络可达。
主机模式(host):
容器直接使用主机网络,无需端口映射,但需确认应用监听端口未被占用:
netstat -tuln | grep <端口>
自定义网络:
检查容器是否加入正确的网络:
docker network inspect <网络名>
0.0.0.0
(所有接口)而非 127.0.0.1
:
bash
docker exec -it <容器名> netstat -tuln
# 或
docker exec -it <容器名> ss -tuln
127.0.0.1
,需修改其配置文件并重启容器。从主机内部测试:
curl http://localhost:<主机端口>
从外部测试:
telnet <主机IP> <主机端口>
SELinux 限制(仅限 Linux):
临时禁用 SELinux 测试:
sudo setenforce 0
-v
挂载时添加 :z
标志。Docker 代理配置:
若使用代理,检查 ~/.docker/config.json
或 Docker 服务配置。
容器是否运行? → 否 → 启动容器
→ 是 → 端口映射是否正确? → 否 → 重新运行并映射端口
→ 是 → 防火墙是否放行? → 否 → 配置防火墙
→ 是 → 应用是否监听 0.0.0.0? → 否 → 修改应用配置
→ 是 → 检查网络模式/SELinux
通过以上步骤,90% 的外部访问问题可被解决。若仍存在问题,提供更多上下文(如 docker-compose.yml
或错误日志)可进一步诊断。