pve虚拟机下istoreos docker容器内部不能访问外网的问题解决方法

pve虚拟机下istoreos docker容器不能访问外网的问题解决方法

问题复现:安装了QD容器,执行任务时一直超时,同样的其他容器内部好像也不能访问外网,最直接的方式是用了host模式启动容器,这样可以正常连接外网。

  • 查了资料发现是防火墙问题
    • 参考一:https://www.jb51.net/server/290134iof.htm
    • 参考二:https://github.com/istoreos/istoreos/discussions/1077
    • 参考三:https://github.com/istoreos/istoreos/issues/1511
    • 参考四:https://github.com/istoreos/istoreos/issues/934

解决方法1:你这个是因为旁路由的情况下,流量不是从wan口出去,而是从lan口出去,lan口默认没开NAT。所以解决方法也很简单,在防火墙页面,把lan口的“IP动态伪装”勾选上。

解决方法2 :根据:https://www.jb51.net/server/290134iof.htm 该文章参考步骤尝试

# docker network inspect bridge 
[
    {
        "Name": "bridge",
        "Id": "52d99eec11c4706581e4b8235613d5258ef2c318557baddbb79766136d7b0868",
        "Created": "2022-10-22T19:31:19.358514137+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "false",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

发现:com.docker.network.bridge.enable_ip_masquerade值为false,代表是否开启IP伪装,false代表未开启。

接着原文通过\# vim /etc/systemd/system/docker.service来更改配置,找了半天也没有找到istoreos里面的docker.service文件在哪里,最后得知直接更改/etc/config/dockerd文件,将iptables0改为1即可

config globals 'globals'
    option log_level 'warn'
    option iptables '1'  # 将 '0' 改为 '1'
    option data_root '/mnt/sdb1/docker'
    option remote_endpoint '0'

config firewall 'firewall'
    option device 'docker0'
    list blocked_interfaces 'wan'

然后重启docker:service dockerd restart,然后再docker network inspect bridge 发现"com.docker.network.bridge.enable_ip_masquerade": “true”,至此QD任务可正常执行

看看AI的解释:

在 Docker 的配置文件中,`iptables` 选项用于控制 Docker 是否应该管理和修改 iptables 规则。具体来说:

- `option iptables '0'` 表示 Docker 不会管理和修改 iptables 规则。
- `option iptables '1'` 表示 Docker 会管理和修改 iptables 规则。

当 `iptables` 设置为 `0` 时,Docker 不会添加任何 iptables 规则,这意味着容器的网络流量不会经过 Docker 的默认 NAT 和防火墙规则处理。这可能会导致容器无法访问外部网络,除非手动配置 iptables 规则。

设置 `iptables` 为 `1` 可以确保 Docker 自动管理 iptables 规则,以确保容器的网络功能正常运行,包括 NAT、端口映射和 IP 伪装等。
如果你使用的是默认的docker网络,那么容器之间是可以相互通信的,但是容器默认是不能被外部访问的。要让外部能够访问容器,可以通过以下几种方法: 1. 使用端口映射:可以将容器内的端口映射到主机的端口上,这样外部就可以通过主机的 IP 地址和端口来访问容器了。例如,将容器内的80端口映射到主机的8080端口上可以使用以下命令: ``` docker run -d -p 8080:80 nginx ``` 2. 使用桥接网络:可以创建一个桥接网络,将容器加入该网络中,这样容器之间就可以相互访问,而且外部也可以通过桥接网络访问容器。例如,创建一个名为`my-net`的桥接网络可以使用以下命令: ``` docker network create my-net ``` 然后将容器加入该网络中: ``` docker run -d --net my-net --name container-1 nginx docker run -d --net my-net --name container-2 nginx ``` 这样容器`container-1`和`container-2`就可以相互访问了,而且外部也可以通过桥接网络访问它们。 3. 使用主机网络:可以使用主机网络模式,将容器直接绑定到主机的网络上,这样容器就可以直接使用主机的 IP 地址访问外部网络。例如,使用主机网络模式启动一个容器可以使用以下命令: ``` docker run -d --net host nginx ``` 这样容器就可以直接使用主机的 IP 地址访问外部网络了。 以上三种方法都可以让外部访问容器,选择哪种方法要根据具体的需求和场景来定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值