文章列表
1 分钟阅读

Docker 网络与端口映射:容器之间怎么通信


系列:容器部署基础

第 5 / 10 篇

  1. Docker 安装与使用教程:从零部署第一个容器服务
  2. Dockerfile 入门:构建自己的应用镜像
  3. Docker Compose 使用指南:管理多容器服务
  4. Docker 数据卷与备份:数据库容器怎么保护数据
  5. Docker 网络与端口映射:容器之间怎么通信
  6. Docker 日志和排障:logs、exec、inspect、stats
  7. 用 Docker 部署一个 Python Web 项目
  8. Nginx 反向代理入门:静态文件、HTTPS 和 Web 服务转发
  9. HTTPS 和证书部署指南:Let’s Encrypt、Cloudflare、Nginx 怎么配
  10. Docker 生产环境部署注意事项:镜像、日志、数据卷和健康检查

Docker 网络最容易混淆的是:容器内部端口、宿主机端口、服务名访问不是一回事。

ports

ports:
- "127.0.0.1:8000:8000"

左边是宿主机,右边是容器。绑定 127.0.0.1 表示只允许本机访问,通常再交给 Nginx 反代。

expose

expose:
- "8000"

expose 只给 Compose 内部服务看,不发布到宿主机。

服务名通信

Compose 里服务可以用服务名互相访问:

postgresql://db:5432/app
redis://redis:6379/0

不要在容器里写 127.0.0.1 连接另一个容器。那指的是当前容器自己。

排查

Terminal window
docker compose ps
docker compose exec web sh
curl http://db:5432

端口问题也可以结合 Linux 网络排查命令:ss、curl、dig、ping、traceroute

常见问题

服务在容器里监听 127.0.0.1,外部访问不到。容器内应用一般要监听 0.0.0.0

总结

Docker 网络先记住三句话:容器之间用服务名,发布到宿主机用 ports,只内部暴露用 expose。理解这三点,大部分端口问题都能定位。