我已经安装了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:/#
据我了解,eth0用于访问Internet-它是一个172.17.0.0/16网络。
当我查看主机的网络列表时,我没有连接到该网络。
然后我的集装箱如何访问互联网?
据我了解,我的容器应该通过主机访问Internet,因为毕竟主机已连接到Internet,所以这是唯一的访问方式。
答案 0 :(得分:1)
据我了解,Docker容器具有一个隔离的网络,多个容器可以连接到该网络。同一网络中的容器可以立即彼此通信。该内部网络可用于Internet。 请参阅此文档:https://docs.docker.com/v17.09/engine/userguide/networking/#bridge-networks
答案 1 :(得分:0)
在启动时使用主机网络
docker run -it --network host ubuntu
答案 2 :(得分:0)
适用于Mac的Docker使用了macOS Hypervisor framework 在虚拟机(VM)中运行custom Linux distribution(CLD)。
现在,VM内部的CLD与主机OS(即macOS)之间没有网络连接, 但是Docker for Mac通过VPNkit填补了字面上的空白。
VPNkit使用共享内存队列发送网络数据包 在主机和来宾之间,然后将它们注入到对方的网络堆栈中。
以下是一些相关文章,详细描述了这些事情的工作方式:
https://docs.docker.com/docker-for-mac/networking/ https://github.com/moby/vpnkit/blob/master/docs/ethernet.md https://github.com/moby/vpnkit/blob/master/docs/ports.md
因此,直接回答您的问题-您可以在容器内看到的网络/接口
主机(macOS)上没有副本。相反,当您运行ping google.com
时,
由此产生的网络数据包被VM内部的VPNkit拦截,
转移到主机并注入到主机的网络堆栈。
入站数据包也一样,但是方向相反。