记Anolis OS 8中如何盘podman
客户最近要换Anolis 8,只能用podman,而且断网,于是一顿操作:
- 把docker镜像save出来;
- 拷贝tar到目标环境;
- 安装podman;
- 导入tar镜像,并设置新tag,不然都是;
- 启动镜像 podman run nginx;
- 开通防火墙端口;
- 检查启动日志都正常;
- 客户机无法访问应用,curl也不通;
例子: docker tag dd34e67e3371 nginx:latest
最终方案,适配rootless 模式:
结果在 Podman 容器中部署的 Web 应用无法从外部访问,通常与 容器网络配置、防火墙规则、端口映射 或 应用程序监听配置 有关。
以下是逐步排查和解决方法:
以下是重新排版后的内容,特别优化了源码部分的格式,使其更清晰易读:
1. 检查容器端口映射是否正确
- 关键点:确保容器启动时正确映射了端口(
-p 主机端口:容器端口
)。 - 示例命令:
podman run -d -p 8080:80 --name myweb nginx
- 常见问题:
- 如果使用
-p 127.0.0.1:8080:80
,则容器端口仅绑定到本地回环地址(外部无法访问)。
修复:删除127.0.0.1
,改为-p 8080:80
。 - 检查容器是否正在运行且端口映射已生效:
podman ps podman port <容器名或ID>
- 如果使用
2. 检查容器网络模式
- 默认网络模式:Podman 默认使用
slirp4netns
网络(rootless 模式),可能限制外部访问。 - 解决方案:
- 方法 1:使用
--network=host
共享主机网络(需谨慎):podman run -d --network=host --name myweb nginx
- 方法 2:使用
bridge
网络并正确映射端口:podman network create mynet podman run -d --network=mynet -p 8080:80 --name myweb nginx
- 方法 1:使用
3. 确认防火墙规则
- 关键命令:
# 查看防火墙状态 sudo systemctl status firewalld # 确认端口已开放(以 8080 为例) sudo firewall-cmd --list-ports sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent sudo firewall-cmd --reload
- 常见问题:
- 防火墙未启动或规则未生效。
- 端口未添加到正确的区域(如
public
)。
4. 检查 SELinux 限制
- 现象:如果 SELinux 处于
Enforcing
模式,可能阻止容器绑定端口。 - 解决方案:
- 临时禁用 SELinux(仅用于测试):
sudo setenforce 0
- 永久允许容器网络访问:
sudo setsebool -P container_manage_network on
- 添加 SELinux 策略:
sudo ausearch -c 'container' --raw | audit2allow -M my-container-policy sudo semodule -i my-container-policy.pp
- 临时禁用 SELinux(仅用于测试):
5. 验证容器内应用监听地址
- 问题:容器内的应用可能仅监听
127.0.0.1
(本地回环),而非0.0.0.0
(所有接口)。 - 检查方法:
podman exec <容器名或ID> netstat -tuln
- 修复:配置应用绑定到
0.0.0.0
。例如,在 Nginx 中修改配置:server { listen 0.0.0.0:80; # ... }
6. 检查云主机安全组(阿里云等)
- 关键点:云厂商的安全组规则可能拦截流量。
- 登录阿里云控制台,进入实例安全组配置。
- 确保入方向规则允许目标端口(如 8080/TCP)。
7. 验证主机路由和 IP 地址
- 检查主机 IP:
ip addr show
- 测试本地访问:
curl http://localhost:8080 # 从主机内部访问 curl http://<主机公网IP>:8080 # 从外部访问
8. Rootless 容器的端口限制
- 问题:Rootless 容器默认无法绑定 1024 以下的端口。
- 解决方案:
- 使用非特权端口(如 8080 代替 80)。
- 允许非特权用户绑定低端口:
sudo sysctl net.ipv4.ip_unprivileged_port_start=80
总结步骤
- 确认容器端口映射正确(
-p 主机端口:容器端口
)。 - 检查防火墙和云安全组规则。
- 关闭 SELinux 或调整策略(仅用于测试)。
- 确保容器内应用监听
0.0.0.0
。 - 验证网络模式和主机路由。
如果仍无法解决,请提供以下信息:
podman ps -a
podman inspect <容器ID> | grep -i "port\|ip"
sudo firewall-cmd --list-all
sudo ss -tuln | grep 8080
持续更新中…