在远程服务器上的rootless Docker上,使用dind来运行rootful Docker,并通过Mac从rootful Docker进行访问

首先

尽管标题很长而且不易理解,但是我们正在做一件困难的事情。
我们正在内部服务器上部署rootless docker,但是工程师指出根less docker不能使用VSCode的devcontainer功能。
为了解决这个问题,我们正在讨论使用dind的方法。

建筑过程

前提是rootless docker已经建立和设置完毕。
通过执行docker ps或docker info命令确认docker正在运行,并且是以rootless方式运行的。

安装 dind

我将使用远程服务器进行操作。 (Wǒ .)

谜宫的关键是将dind容器的/var/run目录绑定起来,这样可以将docker.socket绑定到主机上。

docker run -it -d --rm --privileged --name dind -v $(pwd)/my-dind:/var/run docker:20-dind

如果您希望在dind容器内挂载文件夹,请在此时进行挂载。

docker run -it -d --rm --privileged --name dind -v $(pwd)/my-dind:/var/run -v /nfs/my-data:/work docker:20-dind

确认Dind容器正在运行。

$ docker ps
CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS          PORTS           NAMES
1...6   docker:20-dind   "dockerd-entrypoint.…"   34 seconds ago   Up 33 seconds   2375-2376/tcp   dind

我将确认我的-dind目录是否已经被创建。

$ ls -l my-dind
total 8
drwx------ 6 hoge hoge 4096 Aug 28 16:27 docker
-rw-r--r-- 1 hoge hoge    2 Aug 28 16:27 docker.pid
srw-rw---- 1 hoge hoge    0 Aug 28 16:27 docker.sock
-rw------- 1 hoge hoge    0 Aug 28 16:26 xtables.lock

创建/切换到相应的上下文,以便远程服务器能够接触到Docker中的dind。

docker context create --docker host=unix://$(pwd)/my-dind/docker.sock my-local-dind
docker context use my-local-dind

确认docker守护进程正在切换持有的docker。
之前已确认dind容器正在运行,但由于连接到dind容器内的docker守护进程,因此无法看到正在运行的容器。

$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

安装Mac设备

请安装并确认 Docker Desktop 正常运行。
官方网址如下:

Docker Desktop

创建/切换用于连接远程服务器的docker守护程序的上下文。

docker context create --docker host=ssh://<remote server> my-remote-docker
docker context use my-remote-docker

构建步骤就是这样。如果打开VSCode的容器扩展功能,就可以使用与docker相关的功能。还可以确认通过devcontainer功能创建的容器也会显示出来。

如果您想将挂载在dind容器上的目录挂载到dind内的容器上,请注意需要匹配挂载点。
根据前面的例子,我们使用了”-v /nfs/my-data:/work”来挂载,所以从dind内的容器中需要挂载”/work”。

docker run -it -v /work:/my-data ubuntu:latest bash

我想删除dind。

如果您想在远程服务器上删除dind,您可以使用docker context use命令返回上下文,然后停止dind容器,这样即可清除所有未持久化的数据。

$ docker context ls
$ docker context use rootless
$ docker stop dind

请使用以下命令来删除由dind容器创建的套接字文件。

$ chmod -R 770 my-dind
$ rm -rf my-dind

最终的

请理解,在逻辑上,我们将 rootful Docker 包装为 rootless Docker,所以它看起来是 rootful 的,但实际上应该是 rootless 的。
然而,请理解我们不能保证它确实是 rootless 的。

请根据用途和物理结构来选择适当的架构,以确保各种功能可以像rootful一样使用,但由于插入了rootless,设备的挂载和通过网络的访问可能变得复杂且混乱,有可能导致困惑加剧。

只需一种翻译选项:

在我尝试过的情况下,我能够使用VSCode中残留的认证缓存来登录GitHub并拉取私有库。同时,我还确认了devcontainer的运行情况,并确认能够充分利用VSCode。如果有人对这个内容感到满意,我会很高兴。

广告
将在 10 秒后关闭
bannerAds