飞牛 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 三个命令就能定位。
留言