docker作为现在微服务运行的最有效解决方案,最近在实现年会抽奖程序,前端打包了一个镜像给后端部署,后端服务是跑在本机上,于是需要实现容器内部访问宿主机的服务。
docker容器的网络模式
docker提供了四种网络模式来实现容器间的网络通信以及与外界的连接,分别是:
桥接模式(Bridge):默认的网络模式,docker在宿主机创建一个名为 docker0 的虚拟网桥,每个新创建的容器都会分配一个独立的ip地址,通过网桥连接到一起,形成一个内部的,隔离的网络。通常应用于容器之间相互通信,不暴露给主机和外网。
主机模式(Host):通过 --network=host
指定,主机模式下,容器和宿主机共享网络命名空间, 容器可以直接使用宿主机的网络。
无间隔模式(None):通过 --network=none
指定,无间隔模式下,容器不会有自己的网络,需要在启动时自行配置,适用于完全隔离的场景。
覆盖(Overlay):覆盖网络模式允许多个容器在同一个网络进行通信。适用于容器集群环境。
容器如何与宿主机进行通信?
通过上述的网络管理模式,可以通过主机模式来进行 --network=host
选项来启动容器即可。但是这只能容器访问宿主机的服务,宿主机不能访问容器的服务。
除此之外,还可以通过以下方式来实现同样的效果。
使用宿主机的IP地址
Mac 命令: ipconfig getifaddr en0
Windows 命令:ipconfig | findstr /R "IPv4 Address"
Linux命令:ifconfig eth0 | grep 'inet addr'
或者 ip addr show dev eth0
en0
是wifi的ip地址,如果是以太网连接,把en0
改为en1
使用特殊的网络地址
容器内部可以通过 host.docker.internal 访问宿主机的ip。
最后通过宿主机的IP地址来实现容器访问宿主机服务,直接在nginx配置转发规则即可。
location /api {
rewrite ^/api/(.*) /$1 break;
proxy_pass http://host.docker.internal:8080;
}