You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

VSCode开发容器无法访问宿主机Docker容器的解决方案咨询

解决Dev Container内部无法连接外部Docker容器的问题

你的问题核心在于:Dev Container本身是宿主Docker中的一个容器,当你通过挂载的docker.sock启动postgres容器时,postgres默认运行在宿主的Docker网络中,而Dev Container里的localhost指向的是它自己的容器环境,不是宿主机器,所以直接用localhost:5432会连不上。下面给你几个实用的解决方案:

方案1:使用Docker自定义网络(推荐)

这是最规范的方式,通过自定义网络让Dev Container和postgres容器处于同一个网络环境,容器之间可以直接通过名称互相访问:

  1. 创建一个自定义网络(可以在宿主或Dev Container内执行,因为你已经挂载了docker.sock):

    docker network create dev-shared-net
    
  2. 启动postgres容器时指定加入这个网络,并设置一个容易识别的容器名:

    docker run -e POSTGRES_USER=user -e POSTGRES_PASSWORD=password \
      --network dev-shared-net \
      --name postgres-dev \
      -d postgres:9
    
  3. 同时修改devcontainer.json,让Dev Container启动时也加入这个网络:

    "runArgs": ["--network=dev-shared-net"]
    

现在在Dev Container内部,直接用postgres-dev:5432作为连接地址即可,Docker的内置DNS会自动解析容器名对应的IP。

方案2:通过宿主网关IP访问

如果你不想创建自定义网络,可以通过宿主在Docker默认bridge网络中的网关IP来访问postgres:

  1. 在Dev Container内执行以下命令,获取宿主的网关IP:

    ip route show default | awk '/default/ {print $3}'
    

    通常这个地址是172.17.0.1,是Docker默认bridge网络的网关。

  2. 用这个IP作为postgres的连接地址,比如在Golang代码中:

    db, err := sql.Open("postgres", "host=172.17.0.1 port=5432 user=user password=password dbname=postgres sslmode=disable")
    

方案3:让postgres使用宿主网络模式(不推荐)

这种方式会让postgres直接使用宿主的网络栈,隔离性较差,容易出现端口冲突,但配置最简单:

启动postgres时添加--network host参数:

docker run -e POSTGRES_USER=user -e POSTGRES_PASSWORD=password \
  --network host \
  -d postgres:9

此时在Dev Container内部直接用localhost:5432就能连接到postgres。

额外优化:精简Dockerfile中的Docker安装

你目前安装了docker-ce(完整的Docker引擎),但其实只需要docker-ce-cli(Docker命令行工具)就足够了,因为你已经通过挂载docker.sock复用了宿主的Docker引擎。可以把Dockerfile中的安装命令改成:

# Add Docker CLI instead of full engine
RUN apt-get update \
 && apt-get -y install --no-install-recommends \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg2 \
    software-properties-common \
 && curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - \
 && add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" \
 && apt-get update \
 && apt-get -y install --no-install-recommends docker-ce-cli \
# Clean up
 && apt-get autoremove -y \
 && apt-get clean -y \
 && rm -rf /var/lib/apt/lists/*

内容的提问来源于stack exchange,提问作者Blokje5

火山引擎 最新活动