在远程服务器上的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守护程序的上下文。
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。如果有人对这个内容感到满意,我会很高兴。