linux 将Docker容器连接到互联网

nfeuvbwi  于 2023-03-17  发布在  Linux
关注(0)|答案(2)|浏览(198)

我已经使用这个博客中的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直接连到互联网上。

vyswwuz2

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。我建议从

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

8xiog9wr2#

您所遵循的指导将QEMU设置为使用“用户模式网络”。(有点)像QEMU本身模拟一个小NAT路由器和VM所在的专用网络。这反过来又在Docker容器内部,并与Docker容器的网络设置进行通信,这里有两层--您需要清楚地了解这种双层设置,这样您就不会混淆这两层中的哪一层可能是问题的根源。
用户模式网络有一些限制:值得注意的是,ping不起作用,并且您不能从外部连接到VM,除非您设置了特定的端口转发(说明包括从主机端口2222到VM的ssh端口22的端口转发)。
因此,您需要弄清楚您是否能够忍受用户模式网络的限制,并确保您所做的任何测试都是测试您所关心的内容,而不是您可能并不真正关心的内容,例如ping数据包是否能够正常工作。(桥)网络后端,这要复杂得多,但确实可以让QEMU VM作为主机网络上的一台机器真正可见。

相关问题