使用VSCode Dev Containers设置Docker in Docker:如何访问主机上正在运行的Docker容器

5

我正在使用VSCode开发容器作为默认的golang镜像的开发环境。我在Dockerfile中添加了以下代码片段来下载Docker CLI:

# Add Docker
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 \
   # Clean up
   && apt-get autoremove -y \
   && apt-get clean -y \
   && rm -rf /var/lib/apt/lists/*

# Symlink docker socket
RUN ln -s "/var/run/docker-host.sock" "/var/run/docker.sock"

并将以下挂载添加到devcontainer.json中的挂载列表中:

"mounts": ["source=/var/run/docker.sock,target=/var/run/docker-host.sock,type=bind"]

这确实让我可以访问在本地机器上运行的Docker守护程序。但是,如果我启动一个postgres容器:

docker run -e POSTGRES_USER=user -e POSTGRES_PASSWORD=password -p 5432:5432 -d postgres:9

我可以从本地计算机连接到它,但无法从Dev Container内部连接。是否有一种方法可以在启动Dev Container时指定网络选项(例如允许主机网络或创建共享网络)?或者是否有其他方法可以从Dev Container内部连接到另一个正在运行的Docker容器?

3个回答

3
如果您喜欢使用与wanheda提出的docker-in-docker替代解决方案不同的docker-from-docker方法,您可以将dev容器连接到主机端口。
假设您保留了主机的docker套接字挂载:
"mounts": ["source=/var/run/docker.sock,target=/var/run/docker-host.sock,type=bind"]

你可以将这行代码添加到你的 .devcontainer/devcontainer.json 文件中:
"runArgs": ["--add-host=host.docker.internal:host-gateway"]

通过使用主机名 host.docker.internal,您可以为开发容器提供一种访问主机地址的方式。

我建议您阅读这篇文章,因为从 Docker 中运行 Docker 具有较低的开销优势,但也存在一些绑定挂载限制。

从容器中使用 Docker 或 Kubernetes


1
如果您能在Dev Container中运行其他容器,那么此答案才是有用的。
您可以使用docker-in-docker设置Dev Container。这样,您就可以在Dev Container中运行Docker容器(因此网络将正常工作)。 Dockerfile如下所示。这里有一篇medium article很好地解释了这一点。
    FROM docker:19.03.12-dind-rootless@sha256:7606255ca83a7f516fae1b78299b79774f1f798ba9fc792a7231e7b0967ddb05
    USER root

    # Change this with your dependencies, note that this uses alpine apk
    RUN apk add git bash curl make vim go

    USER rootless
    ENV DOCKER_HOST=unix:///var/run/user/1000/docker.sock

关于.devcontainers/devcontainer.json所需更改的说明: 更新(2021-03-04):从20.10.x开始,不再需要--experimental选项(moby/moby#40759)(请参见添加实验性“无根”dind变体)。 - gkephorus

0

假设我正确地理解了你的问题,你想要:

  • 在你的 devcontainer 中使用 docker CLI
  • Devcontainer 实际上使用主机的 docker socket
  • 启动一个 Postgres 容器作为 Devcontainer 的一部分
  • Devcontainer 应该能够直接与 Postgres 容器进行通信

假设默认设置,你的 devcontainer 容器和 Postgres 容器都应该位于同一网络中。如果是这样的话,devcontainer 可以使用 Postgres 容器的 IP:port 与其通信。你可以使用 docker inspect 命令找到它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接