我已经使用这个博客中的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
现在我希望能够将此连接到Internet。根据Docker Docs,我尝试使用以下命令将正在运行的容器连接到Internet:
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命令会返回如上所示的结果,所以pinggoogle.com是在根@上工作,而不是在pi@raspberry上工作。
我需要把pi直接连到互联网上。
2条答案
按热度按时间vyswwuz21#
发生此错误是因为您尚未创建名为
multi-host-network
的Docker网络。要创建它,您可以参考Docker docs。默认情况下,所有Docker容器都连接到默认的
bridge
网络(名称与驱动程序类型匹配)。对于docker-compose
,将创建名称为docker-compose-directory-name_default
的网桥网络,如here所述。您可以通过运行docker network inspect docker-compose-directory-name_default
检查,并在Containers
部分中找到您的容器。由于您的容器已经连接到internet,因此它应该具有internet访问权限,而不需要显式地将其连接到网络。
如果没有互联网连接,请尝试其他解决方案proposed in this question。我建议从
8xiog9wr2#
您所遵循的指导将QEMU设置为使用“用户模式网络”。(有点)像QEMU本身模拟一个小NAT路由器和VM所在的专用网络。这反过来又在Docker容器内部,并与Docker容器的网络设置进行通信,这里有两层--您需要清楚地了解这种双层设置,这样您就不会混淆这两层中的哪一层可能是问题的根源。
用户模式网络有一些限制:值得注意的是,ping不起作用,并且您不能从外部连接到VM,除非您设置了特定的端口转发(说明包括从主机端口2222到VM的ssh端口22的端口转发)。
因此,您需要弄清楚您是否能够忍受用户模式网络的限制,并确保您所做的任何测试都是测试您所关心的内容,而不是您可能并不真正关心的内容,例如ping数据包是否能够正常工作。(桥)网络后端,这要复杂得多,但确实可以让QEMU VM作为主机网络上的一台机器真正可见。