Ubuntu 18.04下主机无法访问LXC容器3000端口及容器互通问题问询
故障排查与配置步骤
1. 确认容器内应用的监听地址
绝大多数3000端口外部访问被拒的场景,都是应用默认仅绑定了容器本地环回地址127.0.0.1,该地址仅支持容器内部访问,外部网络无法连通。
在容器内部执行以下命令检查端口监听状态:
ss -tulpn | grep :3000
如果返回结果中监听地址为127.0.0.1:3000,修改应用的启动配置,将监听地址改为0.0.0.0即可,不同应用的修改方式不同,例如Node.js应用修改监听参数为app.listen(3000, '0.0.0.0')。
2. 配置容器内防火墙规则
测试已确认容器内启用ufw会拦截外部访问,若需要保留容器内防火墙,执行以下命令放通所需端口:
- 放通3000端口:
ufw allow 3000/tcp - 放通Apache默认80端口:
ufw allow 80/tcp - 放通SSH 22端口避免远程连接中断:
ufw allow 22/tcp - 配置生效:
ufw reload
如果不需要容器内单独做访问控制,直接禁用ufw即可:ufw disable,LXC网络的访问管控可统一在宿主机层面配置。
3. 修复systemd服务权限报错
日志中Failed to reset devices.list: Operation not permitted是LXC容器默认未给systemd开放足够权限导致的,严重时会导致应用服务启动异常、端口监听失败,可通过修改宿主机上的容器配置修复:
- 先停止目标容器:
lxc stop <你的容器名称> - 打开容器配置文件(默认路径为
/var/lib/lxc/<你的容器名称>/config),在文件末尾添加以下配置:
lxc.apparmor.profile = unconfined lxc.cgroup.devices.allow = a lxc.cap.drop =
- 重启容器生效:
lxc start <你的容器名称>
4. 验证通信能力
所有配置完成后,在宿主机执行端口检测命令验证连通性:
nc -zv <容器IP> 3000
返回succeeded即表示配置正常,可直接通过浏览器访问https://<容器IP>:3000打开应用UI。
默认LXC容器都在同一个虚拟网桥下,所有容器按照上述步骤配置完成后,即可直接通过IP+端口实现容器与宿主机、容器与容器之间的互相访问。
内容的提问来源于stack exchange,提问作者Mnemosyne
相关产品推荐
相关产品推荐

