咨询host.docker.internal错误IP绑定位置及修正方法
在服务器A上,我们通过Docker容器配置里的host.docker.internal实现同服务器内其他容器对该容器的访问。将整个Docker环境迁移到服务器B后,主机名host.docker.internal仍然指向服务器A的IP地址。尝试清理缓存、完全重装容器都没有效果,服务器B上的host.docker.internal依旧指向旧IP。
请问:host.docker.internal的IP与主机名绑定记录存放在哪里?如何将其更新为服务器B的正确IP地址?
相关配置文件
docker-compose.yaml
version: '3.2' services: postgres: build: context: . dockerfile: ./docker_files/postgres.Dockerfile container_name: ${POSTGRES_CONTAINER_NAME} restart: always ports: - target: ${POSTGRES_TARGET_PORT} # 容器内部端口 published: ${POSTGRES_PUBLISHED_PORT} # 外部暴露端口 protocol: tcp # 端口协议(tcp或udp) mode: host extra_hosts: - "host.docker.internal:host-gateway" networks: - panter_docker_network volumes: - ${HOST_TRANSFER_DIRECTORY}:/tmp/host/ environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} networks: panter_docker_network: driver: bridge
postgres.Dockerfile
FROM postgres:15.1 RUN set -eux; \ apt-get update && apt-get install -y \ vim \ zip \ procps \ locales \ lsb-release \ libicu-dev \ iproute2 \ unzip \ iputils-ping && \ mkdir /tmp/host/ USER root
绑定记录的存放位置
- 容器内部的
/etc/hosts文件:你的docker-compose.yaml里配置了extra_hosts: "host.docker.internal:host-gateway",Docker在启动容器时会自动将这条映射写入容器的/etc/hosts,这是最直接的绑定记录位置。 - Docker守护进程(Docker daemon)缓存:部分网络配置可能被Docker daemon缓存,导致解析未及时更新。
- 宿主机DNS缓存:如果宿主机的DNS服务器缓存了
host.docker.internal的旧IP,也可能影响容器内的解析结果。
更新为正确IP的步骤
检查容器内的
/etc/hosts记录
进入容器执行命令:docker exec -it ${POSTGRES_CONTAINER_NAME} cat /etc/hosts查看
host.docker.internal对应的IP是否为服务器B的宿主机IP。如果不是,说明容器启动时未正确生成映射,需要排查Docker daemon或配置问题。重启Docker守护进程
Docker daemon可能缓存了旧的网络配置,执行以下命令重启(以Linux系统为例):sudo systemctl restart docker重启后重新启动容器:
docker-compose down && docker-compose up -d检查宿主机的
/etc/hosts文件
虽然你的配置用了host-gateway特殊值,但如果宿主机/etc/hosts里手动添加了host.docker.internal指向服务器A的IP,可能会干扰容器内的映射。打开宿主机/etc/hosts查看,如有相关记录直接删除。强制重新构建镜像
若镜像中存在残留的旧网络配置,执行以下命令强制重新构建(不使用缓存):docker-compose build --no-cache构建完成后重新启动容器。
检查容器DNS配置
查看容器的DNS设置是否使用了外部DNS服务器导致解析异常:docker inspect ${POSTGRES_CONTAINER_NAME} | grep -A5 "DNS"如果配置了非默认的DNS服务器,建议修改为宿主机DNS或Docker内置DNS(默认是
127.0.0.11)。
内容的提问来源于stack exchange,提问作者jnemecz

