问题:
一次部署项目过程中,将Java项目与中间件服务部署在同一远程机器上,出现连接不上中间件服务的问题,而项目在本地运行时是可以连接的,没有问题。
原因:
这是因为项目与服务都是通过docker容器运行的,而docker 容器无法通过 IP 访问宿主机(貌似高版本解决了这个问题),所以导致部署到同一机器后出现问题
解决:
一、Docker社区有提过该问题已被解决,链接在这
二、也可以通过在容器运行时 加参数--net=host,这个命令让容器与宿主机共享网络命名空间,这样容器就可以直接使用宿主机的IP地址进行访问,但该方案局限性在于只能有一个容器使用--net=host参数。
三、若想同时运行多个容器并使它们可以通过IP访问宿主机,可以采用桥接网络模式,步骤如下:
1.创建Docker网络:
运行下面的命令来创建一个桥接网络:
docker network create --driver bridge mynetwork
这将创建一个名为mynetwork
的桥接网络,用于连接宿主机和容器。
2.运行容器并指定网络:
在启动容器时,使用 --network
参数并指定之前创建的桥接网络:
docker run --network=mynetwork <image_name>
<image_name>
是你要运行的容器镜像的名称。运行该命令后,容器将与mynetwork
网络连接。
3.在容器中访问宿主机:
在容器内部,可以使用宿主机的IP地址进行访问。宿主机的IP地址通常是桥接网络的网关地址。
运行下面的命令来查看桥接网络的网关地址:
docker network inspect mynetwork
在输出中,找到"Gateway": "<gateway_ip>"
,记录下<gateway_ip>
的值。
在容器内部,可以使用 <gateway_ip>
来访问宿主机上的服务或应用程序。
现在,你的容器应该能够通过桥接网络访问宿主机了。你可以在容器内部使用宿主机的IP地址(即桥接网络的网关地址)来访问宿主机上的服务或应用程序。