docker作为现在微服务运行的最有效解决方案,最近在实现年会抽奖程序,前端打包了一个镜像给后端部署,后端服务是跑在本机上,于是需要实现容器内部访问宿主机的服务。

docker容器的网络模式

docker提供了四种网络模式来实现容器间的网络通信以及与外界的连接,分别是:

桥接模式(Bridge):默认的网络模式,docker在宿主机创建一个名为 docker0 的虚拟网桥,每个新创建的容器都会分配一个独立的ip地址,通过网桥连接到一起,形成一个内部的,隔离的网络。通常应用于容器之间相互通信,不暴露给主机和外网。

主机模式(Host):通过 --network=host 指定,主机模式下,容器和宿主机共享网络命名空间, 容器可以直接使用宿主机的网络。

无间隔模式(None):通过 --network=none 指定,无间隔模式下,容器不会有自己的网络,需要在启动时自行配置,适用于完全隔离的场景。

覆盖(Overlay):覆盖网络模式允许多个容器在同一个网络进行通信。适用于容器集群环境。

b82cd492-048b-46d3-ae70-8ec7f7be20f3.png
Automatically created networks in Docker

容器如何与宿主机进行通信?

通过上述的网络管理模式,可以通过主机模式来进行 --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;
}