Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
docker容器如何访问Internet_Docker_Networking - Fatal编程技术网

docker容器如何访问Internet

docker容器如何访问Internet,docker,networking,Docker,Networking,我安装了docker(Mac的docker)。 我开始使用一个新的容器 docker run -it ubuntu 我可以通过简单地调用 ping google.com 我明白了: root@b06e1a46cc40:/# ping google.com PING google.com (216.58.209.14) 56(84) bytes of data. 64 bytes from sof01s12-in-f14.1e100.net (216.58.209.14): icmp_seq=

我安装了docker(Mac的docker)。 我开始使用一个新的容器

docker run -it ubuntu
我可以通过简单地调用

ping google.com
我明白了:

root@b06e1a46cc40:/# ping google.com
PING google.com (216.58.209.14) 56(84) bytes of data.
64 bytes from sof01s12-in-f14.1e100.net (216.58.209.14): icmp_seq=1 ttl=37 time=63.0 ms
64 bytes from sof01s12-in-f14.1e100.net (216.58.209.14): icmp_seq=2 ttl=37 time=63.7 ms
64 bytes from sof01s12-in-f14.1e100.net (216.58.209.14): icmp_seq=3 ttl=37 time=64.8 ms
接下来,我检查了容器连接到的网络:

root@b06e1a46cc40:/# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1
    link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1
    link/tunnel6 :: brd ::
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
root@b06e1a46cc40:/#
root@b06e1a46cc40:/#ip地址显示
1:lo:mtu 65536 qdisc noqueue状态未知组默认qlen 1
链接/环回00:00:00:00:00 brd 00:00:00:00:00:00:00
inet 127.0.0.1/8范围主机lo
永远有效\u lft首选\u lft永远有效
2: tunl0@NONE:mtu 1480 qdisc noop状态关闭组默认qlen 1
链接/ipip 0.0.0.0 brd 0.0.0.0
三:ip6tnl0@NONE:mtu 1452 qdisc noop状态关闭组默认qlen 1
链路/隧道16::brd::
6: eth0@if7:mtu 1500 qdisc noqueue state UP组默认值
链路/以太02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff链路网络ID 0
inet 172.17.0.2/16 brd 172.17.255.255范围全局eth0
永远有效\u lft首选\u lft永远有效
root@b06e1a46cc40:/#
据我所知,eth0用于访问互联网——它是一个172.17.0.0/16的网络

当我查看主机的网络列表时,我未连接到此网络

那么,我的容器如何访问internet


据我所知,我的容器应该通过我的主机访问internet,因为毕竟我的主机连接到internet,所以这是唯一的访问方式。

在启动时使用主机网络
根据我的理解,docker容器有一个独立的网络,多个容器可以连接到该网络。同一网络中的容器可以立即相互通信。此内部网络可用于internet。
请参阅此文档:

Docker for Mac采用macOS 在虚拟机(VM)中运行(CLD)

现在,虚拟机内的CLD与主机操作系统(即macOS)没有网络连接, 但Docker for Mac填补了这一空白(从字面上讲)

VPNkit使用共享内存队列发送网络数据包 然后将它们注入到另一端的网络堆栈中

以下是一些相关文章,详细描述了这些东西是如何工作的:

因此,直接回答您的问题-您可以在容器中看到的网络/接口 在主机(macOS)上没有对应项。相反,当您运行
ping google.com
时, 产生的网络数据包被虚拟机内的VPNkit截获, 传输到主机并注入主机的网络堆栈


入站数据包也是如此,但方向相反。

@Imlmvxi它并没有真正回答我的问题。我想了解默认(网桥)网络是如何允许我连接到互联网的——这怎么可能呢?我知道网桥是一个默认情况下所有容器都连接到的网络,因此它们可以相互通信implementation@lmlmvxi,您的意思是docker默认情况下使用iptables创建隔离的路由网络,特别是针对容器。但对于macOS和Docker Desktop,情况并非如此。我的答案是:在Mac上,我的容器实际上运行在后台的虚拟机上。所以有这样的层:我的主机(Mac)->VM(linux)->容器(ubuntu)。因此,容器的网络(网桥)可能连接容器和VM。然后,VM连接到我的主机也使用的某个网络(该网络是哪个?如何检查?)。这就是容器访问internet的方式。我说的对吗?是的,我明白。然而,网桥网络如何允许internet访问?>入站数据包也是如此,但方向相反。这是否意味着到任何接口的所有传入流量也将通过vpnkit?