docker - docker容器如何上网
问题描述
我安装了 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 用于访问互联网 - 它是一个网络 172.17.0.0/16。
当我查看主机的网络列表时,我没有连接到该网络。
那么我的容器如何访问互联网呢?
据我了解,我的容器应该通过我的主机访问互联网,因为毕竟我的主机连接到互联网,所以这是唯一的访问方式。
解决方案
Docker for Mac 使用 macOS Hypervisor 框架在虚拟机 (VM) 中 运行自定义 Linux 发行版(CLD)。
现在,VM 内部的 CLD 与主机操作系统(即 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
,生成的网络数据包会被虚拟机内部的 VPNkit 拦截,传输到主机并注入到主机的网络堆栈中。
入站数据包也是如此,但方向相反。
推荐阅读
- git - -m 在 git remote add 中有什么作用
- python - Pygame鼠标点击检测移动精灵
- laravel - Laravel 5.6 DB::RAW 计数()
- c++ - 拆分 C++ 嵌套模板
- python-3.x - Kivy 在增加窗口大小时冻结
- java - 使用 log4j 记录 springboot 应用程序
- r - `gganimate` fps 与指定的不一样
- c++ - CLion Cygwin(32 位)版本 2.11.2 GDB 调试错误 0xc0000135
- woocommerce - 客户下订单然后管理员将特定订单分配给 wc 市场插件中的供应商后是否有可能
- java - Android/JAVA:异步函数调用以避免阻塞调用