docker容器 host模式访问ip变化

host模式启动java springboot项目打成镜像的 docker容器 访问127.0.0.1 连接redis 时 ip变成了宿主机的设备名称

img

img

如图 redis是 端口映射运行的
springboot服务 是host模式运行的

img

springboot项目里面 的确是访问127.0.0.1 这个ip 按理说是可以连上redis容器的

1、docker简单可认为就是一台机器,因此实际上你的应用为一个docker,redis是另一个docker,所以两台机器肯定不能用127.0.0.1访问。除非两个装在一个docker里。
2、host模式下,dcoker-redis端口自动映射到宿主机,因此docker应用访问dcoker-redis就用宿主机ip就可以了。

这里的问题 不是容器之间怎么怎么样 连不连的上 问题是 host模式启动的springboot服务里 明明是访问127.0.0.1 但是变成了 宿主机的设备名 所以应该是host模式 有什么问题 或者需要配置什么东西

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    对于这个问题,我理解的是在使用docker容器运行java springboot项目时,使用host模式启动后打成镜像,访问127.0.0.1连接redis容器时,IP地址会变成宿主机的设备名称,而需要解决这个问题。

    首先,需要了解一下docker容器的网络模式和host模式,docker的网络模型有:bridge(桥接模式),host(主机模式),none(没有网络模式),container(容器模式),自定义模式等;而host模式是指直接使用宿主机的网络模式,容器将不会拥有单独的网络栈,而会和宿主机共用同一个网络栈,这就意味着容器可以直接访问宿主机上的端口,但是也导致容器的网络配置会受到宿主机上的网络配置的影响,进而导致出现这个问题。

    为了解决这个问题,可以使用docker的网络模式来避免直接使用host模式。具体的解决方案如下:

    1. 创建自定义的网络,可以使用下面的命令创建:
    docker network create -d bridge --subnet 172.18.0.0/24 redis-net
    

    这里使用bridge模式,并指定了子网为172.18.0.0/24,这样就可以在这个自定义的网络之间通信了。

    1. 在启动redis容器时,使用上一步创建的网络,可以使用下面的命令:
    docker run --name redis --network redis-net redis:latest
    

    注意这里的--network参数,指定了连接的网络。

    1. 在springboot项目中连接redis时,不再使用127.0.0.1,而是使用redis容器的名称(这里是redis),可以使用下面的配置:
    spring.redis.host=redis
    spring.redis.port=6379
    

    这样就可以避免出现IP地址变成宿主机设备名称的问题了。

    另外,如果还需要用到容器之间的通信,也需要将容器加入到同一个网络中,修改docker run命令的--network参数即可。

    最后,这里只提供了一个可行的解决方案,具体实现还需要根据具体情况进行调整和细化。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^