+
50
-

如何在docker中运行docker?

如何在docker中运行docker?


网友回复

+
0
-

在 Docker 中运行 Docker(Docker-in-Docker,简称 DinD)是一种在已经容器化的环境中构建镜像和启动容器的技术。这在持续集成和持续部署(CI/CD)系统中特别有用,因为这些系统通常在 Docker 容器中运行代理来构建管道。

有两种主要方法可以实现 DinD:1. 使用 `docker:dind` 镜像:

通过 Docker Hub 上的 `docker:dind` 标签提供 Docker 的独立镜像。

启动这个镜像会在新容器内提供一个功能完备的 Docker 守护进程安装。

这种方法需要使用 `--privileged` 标志以特权模式运行容器,因为内部 Docker 需要创建新容器,这可能会带来安全风险。

使用 docker:dind 镜像:

docker run -d --privileged --name docker \
-e DOCKER_TLS_CERTDIR=/certs \
-v docker-certs-ca:/certs/ca \
-v docker-certs-client:/certs/client \
docker:dind

这个命令会启动一个名为 docker 的新容器,使用 docker:dind 镜像。--privileged 参数允许容器以特权模式运行,这是 DinD 场景所必需的。-e 参数设置环境变量,而 -v 参数则用于挂载证书。2. 挂载宿主机的 Docker socket:

避免使用 `dind` 的最佳方法是通过将宿主机的 Docker socket 挂载到常规的 `docker` 容器中。

这样,容器内的 Docker CLI 会与其在 `/var/run/docker.sock` 路径下找到的 Docker 守护进程 socket 交互,意味着容器内运行的 `docker` 命令将针对现有的 Docker 守护进程执行。

挂载宿主机的 Docker socket:

docker run -d --name docker \
-v /var/run/docker.sock:/var/run/docker.sock \
docker:latest
这个命令同样启动一个名为 docker 的新容器,但是使用的是 docker:latest 镜像,它会挂载宿主机的 Docker socket 到容器内部。这样,容器内的 Docker CLI 将与宿主机的 Docker 守护进程交互,而不是启动一个独立的 Docker 守护进程。

使用 `dind` 方法可能会遇到一些挑战,包括与 Linux 安全模块(如 AppArmor 和 SELinux)的冲突,以及容器文件系统之间的不兼容性。此外,`dind` 方法可能会带来额外的安全风险,因为它允许容器完全访问宿主机系统。

我认为应该优先采用基于 socket 的方法。这种方法更安全、更灵活,并且与启动 `dind` 容器一样功能完备。如果你的用例确实需要使用 `dind`,有一种更安全的方法是通过 Sysbox 项目部署它。

Sysbox 是一个专门的容器运行时,可以在不使用特权模式的情况下嵌套其他运行时。Sysbox 容器变得类似于虚拟机,能够支持通常在物理或虚拟机上裸机运行的软件,包括无需特殊配置的 Docker 和 Kubernetes。

我知道答案,我要回答