第五篇:Docker 网络——容器之间到底怎么通信?

举报
yd_220371319 发表于 2026/09/13 10:47:49 2026/09/13
【摘要】 一个容器的时候,网络问题可能还不明显。但项目一旦变成:WebRedisMySQLNginx网络马上就成了问题。最简单的端口映射运行:docker run -d \ --name web \ -p 8080:80 \ nginx这里:宿主机 8080 ↓容器 80所以访问:服务器IP:8080就可以访问 Nginx。容器端口和宿主机端口不是一回事例如:-p 8080:80并不是...


一个容器的时候,网络问题可能还不明显。

但项目一旦变成:


Web
Redis
MySQL
Nginx

网络马上就成了问题。

最简单的端口映射

运行:


docker run -d \
  --name web \
  -p 8080:80 \
  nginx

这里:


宿主机 8080
      ↓
容器 80

所以访问:


服务器IP:8080

就可以访问 Nginx。

容器端口和宿主机端口不是一回事

例如:


-p 8080:80

并不是把 Nginx 的端口“修改成 8080”。

而是:


Host:8080
    ↓
Container:80

容器之间怎么通信?

创建一个 Docker 网络:


docker network create app-net

然后:


docker run -d \
  --name web \
  --network app-net \
  nginx

再创建 Redis:


docker run -d \
  --name redis \
  --network app-net \
  redis

现在两个容器就在同一个 Docker 网络中。

为什么不建议直接写 IP?

因为容器 IP 可能发生变化。

如果 Web 程序配置:


192.168.100.12:6379

Redis 容器重建之后,IP 可能就变了。

Docker 自定义网络可以让容器通过名称进行访问。

例如:


redis:6379

比写死 IP 更合理。

Compose 为什么这么方便?

Compose 中:


services:
  web:
    image: nginx

  redis:
    image: redis

两个服务默认就可以处在同一个 Compose 网络里。

因此应用通常可以直接:


redis:6379

访问 Redis。

一个很重要的原则

不是所有容器端口都需要暴露给宿主机。

比如:


用户
 ↓
Nginx
 ↓
Web
 ↓
Redis

通常只有 Nginx 需要暴露公网端口。

Redis 根本没有必要:


-p 6379:6379

直接暴露到公网。

小结

Docker 网络先记住三个东西:


-p
端口发布

network
容器网络

容器名称
服务发现

下一篇正式进入 Dockerfile。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。