Docker for Mac 的网络问题及解决办法
windmt.com/2019/08/30/docker-for-mac-network/
- Docker 是利用 Linux 的 Namespace 和 Cgroups 来实现资源的隔离和限制,容器共享宿主机内核,所以 Mac 本身没法运行 Docker 容器。不过不支持不要紧,我们可以跑虚拟机,最早还没有 Docker for Mac 的时候,就是通过 docker-machine 在 Virtual Box 或者 VMWare 直接起一个 Linux 的虚拟机,然后在主机上用 Docker Client 操作虚拟机里的 Docker Server。
- Docker for Mac 也是在本地跑了一个虚拟机来运行 Docker,不过 Hypervisor 采用的是 xhyve,而 xhyve 又基于 Mac 自带的虚拟化方案 Hypervisor.framework,虚拟机里运行的发行版是 Docker 自己打包的 LinuxKit,之前用的发行版好像是 Alpine Linux。总而言之就是 Docker for Mac 跑的这个虚拟机非常轻量级,性能也会更好。
- Docker for Mac 就是为了替代 Docker Toolbox 的
- Mac 上的 docker 配置地址
~/Library/Group\ Containers/group.com.docker/settings.json
- 探测容器地址
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $CONTAINER
docker 网络拓扑结构
blog.csdn.net/m0_38080062/article/details/79292058
- Linux container 中用到一个叫做veth的东西,这是一种新的设备,专门为 container 所建。veth 从名字上来看是 Virtual ETHernet 的缩写,它的作用很简单,就是要把从一个 network namespace 发出的数据包转发到另一个 namespace。veth 设备是成对的,一个是 container 之中,另一个在 container 之外,即在真实机器上能看到的。
- VETH设备总是成对出现,一端请求发送的数据总是从另一端以请求接受的形式出现。创建并配置正确后,向其一端输入数据,VETH会改变数据的方向并将其送入内核网络子系统,完成数据的注入,而在另一端则能读到此数据。(Namespace,其中往veth设备上任意一端上RX到的数据,都会在另一端上以TX的方式发送出去)veth工作在L2数据链路层,veth-pair设备在转发数据包过程中并不串改数据包内容。
- 成数据的注入,而在另一端则能读到此数据。(Namespace,其中往veth设备上任意一端上RX到的数据,都会在另一端上以TX的方式发送出去)veth工作在L2数据链路层,veth-pair设备在转发数据包过程中并不串改数据包内容。
- 显然,仅有veth-pair设备,容器是无法访问网络的。因为容器发出的数据包,实质上直接进入了veth1设备的协议栈里。如果容器需要访问网络,需要使用bridge等技术,将veth1接收到的数据包通过某种方式转发出去。
- Docker引擎支持两种网桥——bridge和overlay,bridge网络限制了在一台主机上运行Docker引擎,一个overlay网络可以支持多个主机上运行Docker引擎。
- Mac 上的
docker networks ls
显示有三个默认的网桥- bridge
- host
- none
其中docker_gwbridge是swarm集群时使用的网桥。
更官方的关于网络的文档 success.docker.com/article/networking#challengesofnetworkingcontainersandmicroservices
容器内如何使用宿主机代理网络
- stackoverflow.com/questions/30439684/docker-container-how-to-use-host-proxy
- 使用
--net host
参数
- 使用
- stackoverflow.com/questions/31324981/how-to-access-host-port-from-docker-container
- 容器内主机的IP地址是
host.docker.internal
- 容器内主机的IP地址是