POST

飞牛 Docker 网络:端口冲突、host 模式和容器互访

容器起不来、端口被占、容器之间连不上——Docker 的网络问题比想象中集中。

在飞牛上跑 Docker,应用装不上、启动就退出,八成的报错最后都指向网络配置。这篇把常见的几类说清楚。

端口冲突

最常见的报错:port is already allocated。

意思是宿主机上这个端口已经被占了。占用的可能是:

  • 飞牛自己的服务(比如 Web 管理界面占了 80/443/5666 这类端口);
  • 另一个容器;
  • 之前没删干净的容器。

排查:

ss -lntp | grep 端口号

看看是谁在用。确认之后,要么改容器的映射端口,要么停掉占用的服务。

注意:容器内端口改不改都行,改的是「宿主机端口:容器端口」里的前面那个。

网络模式怎么选

Docker 常见的几种:

  • bridge(默认):容器有自己的内网 IP,通过端口映射对外,最安全也最常用;
  • host:容器直接用宿主机的网络,没有端口映射,性能略好,但端口不能和其他服务冲突;
  • macvlan/ipvlan:给容器分配局域网 IP,像一台独立设备,适合需要被局域网直接发现的场景(比如某些发现协议)。

选 host 的典型场景:应用依赖广播/组播发现,bridge 模式下收不到;或者对延迟敏感。

代价是:host 模式下的端口就是宿主机的端口,冲突了没得商量。

容器之间怎么互访

同一套 compose 里的容器,默认在同一个自定义网络里,可以直接用服务名互相访问。

比如 compose 里有两个服务 app 和 db,app 里连数据库写 db:5432 就行,不用写 IP。

前提是它们在一个网络里。手动 docker run 起的容器默认在 bridge 网络,只能用 IP 互访,而且容器重启 IP 会变——所以尽量用自定义网络或者 compose。

容器连不上外网

  • 检查宿主机本身能不能上网;
  • 检查 Docker 的 DNS 配置,容器里解析不到域名时,可以显式指定 DNS;
  • 如果宿主机走了代理,容器默认不走,需要单独配环境变量。

局域网访问不到容器

  • 端口映射写成了 127.0.0.1:8080:80,只有本机能访问;
  • 飞牛防火墙没放行这个端口;
  • 容器监听在 127.0.0.1 而不是 0.0.0.0(容器内部的监听地址问题)。

常见的坑

改端口只改了一边:映射前后两个端口搞混。

容器名重复:同名的旧容器还在,新容器起不来。

bridge 网络里用 localhost 连别的容器:localhost 永远指容器自己。

host 模式还想端口映射:host 模式下映射参数是无效的。

小结

Docker 网络问题按三步走:谁占了端口 → 用哪种网络模式 → 容器之间怎么寻址。

大部分问题用 ss -lntp、docker ps、docker logs 三个命令就能定位。

👁 - 次浏览

留言

← 返回首页