将 docker 容器连接到互联网

时间:2021-04-19 04:59:36

标签: linux docker raspberry-pi qemu

我使用本博客中的 Dockerfile 创建了我的 docker 镜像和容器。 https://hackernoon.com/raspberry-pi-cluster-emulation-with-docker-compose-xo3l3tyw

我能够通过 ssh 进入 rpi 并且 ifconfig 返回以下状态:

pi@raspberrypi:~ $ ifconfig

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
        ether 52:54:00:12:34:56  txqueuelen 1000  (Ethernet)
        RX packets 561  bytes 49862 (48.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 386  bytes 47311 (46.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 41  base 0x1000    dma 0xff

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 2  bytes 100 (100.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2  bytes 100 (100.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

现在我希望能够将其连接到互联网。根据 docker docs,我尝试使用以下方法将正在运行的容器连接到互联网:

docker network connect multi-host-network 008796f5316a

它返回错误。 来自守护进程的错误响应:找不到网络多主机网络。

如何从 docker 内部连接到互联网?

编辑: 该博客讨论了在 docker 上运行 qemu 并在其上安装修改后的 raspbian(为了与 qemu 兼容)。 当我使用 docker exec 命令访问容器时,

docker exec -it testnode bash

ifconfig 返回以下内容:

root@1f210520938c:~# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 637  bytes 356778 (356.7 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 404  bytes 39482 (39.4 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

pi 的 ifconfig 命令返回的结果如上图所示。 因此,ping google.com 正在处理 root@ 而不是 pi@raspberry。

我需要将 pi 直接连接到互联网。

2 个答案:

答案 0 :(得分:0)

发生此错误是因为您尚未创建名为 multi-host-network 的 Docker 网络。要创建它,您可以参考Docker docs

默认情况下,所有 docker 容器都连接到默认的 bridge 网络(名称与驱动程序类型匹配)。至于 docker-compose, bridge network with name docker-compose-directory-name_defaultwill be created, as described [here][2]. You can check it by runningdocker network 检查 docker-compose-directory-name_defaultand find your container inContainers` 部分。

由于您的容器已连接到 Internet,因此它应该可以访问 Internet,而无需显式连接到网络。

如果没有互联网连接,请尝试解决方案 proposed in this question。我建议从

开始
sysctl -w net.ipv4.ip_forward=1 # both on host and container
sudo service docker restart # (or sudo systemctl restart docker) on host

答案 1 :(得分:0)

您遵循的说明将 QEMU 设置为使用“用户模式网络”。这(有点)就像 QEMU 本身模拟了一个小的 NAT 路由器和虚拟机所在的私有网络。这反过来又在 docker 容器内部,并与 docker 容器的网络设置进行通信,因此您在这里有两层——您需要清楚这个双层设置,这样您就不会对哪一层感到困惑这两者可能是您遇到任何问题的根源。

用户模式网络有一些限制:值得注意的是,ping 不起作用,并且您无法从外部连接到 VM,除非您设置了特定的端口转发(说明包括来自主机端口 2222 到 VM 的 ssh 端口 22)。

所以你需要弄清楚你是否可以忍受用户模式网络的限制,并确保你所做的任何测试都是在测试你关心的东西,而不是你可能并不真正关心的东西,比如是否 ping包特别工作。如果您不想要用户模式网络,则需要设置 QEMU tap(桥接)网络后端,这要复杂得多,但确实可以让 QEMU VM 作为主机网络上的机器真正可见.