DockerInDockerdockerIndocker的使用.使用VM构建Docker镜像非常简单。但是,当您计划使用基于Jenkinsdocker的动态代理进行CI/CD流水线时,dockerindocker是必备功能。沙盒环境。出于实验目的,在您的本地开发工作站上。在Docker容器中运行Docker在Docker中实现Docker的三种方式通过挂载docker运行dockerdind方法。确保您的主机中安装了docker以尝试此设置。方法一:在Docker中使用[/var/run/docker.sock]运行Docker什么是/var/run/docker.sock?/var/run/docker.sock是默认的Unix套接字。套接字用于在同一主机上的进程之间进行通信。Docker守护进程默认监听docker.sock。如果您在运行Docker守护进程的主机上,则可以使用/var/run/docker.sock来管理容器。例如,如果您运行以下命令,它将返回docker引擎的版本。curl--unix-socket/var/run/docker.sockhttp://localhost/version了解了docker.sock是什么之后,让我们看看如何在docker中使用rundocker。要在docker内部运行docker,您所要做的就是使用默认的Unix套接字docker.sock作为卷运行docker。例如dockerrun-v/var/run/docker.sock:/var/run/docker.sock\-tidocker-image注意:如果你的容器可以访问docker.sock,说明它有访问dockerdaemon的更多权限.因此,在实际项目中使用时,请了解并使用其中的安全风险。现在,您应该能够从容器中执行docker命令来构建映像并将其推送到注册表。在这里,实际的docker操作发生在运行docker容器的VM主机上,而不是在容器内部。也就是说,即使你在容器中执行docker命令,也可以通过以下docker.sock方式指示docker客户端连接到VM主机docker-engine。这个方法实际上是在容器内部创建了一个子容器。只有当你真的想在容器中放置容器和图像时才使用它。否则,我建议您使用第一种方法。为此,您只需要使用带有dind标签的官方docker镜像。dind图像是使用Docker在Docker容器中运行所需的实用程序制作的。方法三:Docker中使用Sysbox运行时的Docker方法一和方法二在安全性方面存在一些不足,因为容器是运行在特权模式下的。Nestybox试图通过使用sysboxDocker运行时来解决这个问题。如果您使用Nestyboxsysbox运行时创建容器,它可以在能够运行systemd、docker、kubernetes的容器内创建虚拟环境,而无需对底层主机系统的特权访问。解释sysbox需要足够的理解,所以我不在本文的范围之内。请参阅此页面以全面了解sysbox。第一步:安装sysbox运行环境。有关安装sysbox运行时的最新官方说明,请参阅此页面。第2步:一旦您拥有可用的sysbox运行时,您所要做的就是使用sysbox运行时标志启动docker容器,如下所示。在这里,我们使用官方的dockerdind镜像。dockerrun--runtime=sysbox-runc--namesysbox-dind-ddocker:dind第3步:现在将exec会话带到sysbox-dind容器。dockerexec-itsysbox-dind/bin/sh现在您可以尝试使用Dockerfile构建镜像,如前一种方法所示。关键注意事项仅在必要时才在Docker中使用Docker。在将任何工作流程迁移到Docker-in-Docker方法之前,请进行足够的测试。在特权模式下使用容器时,请确保您已获得企业安全团队对计划执行的必要批准。在带有kubernetes容器的Docker中使用Docker时存在一些挑战。有关详细信息,请参阅此博客。如果您打算使用Nestybox(Sysbox),请确保它已经过您的企业架构师/安全团队的测试和批准。常见问题以下是Docker问题中的一些常见Docker问题。在Docker中运行Docker安全吗?使用docker.sock和dind方法在docker中运行docker不太安全,因为它对docker守护进程具有完全特权如何在Jenkins的docker中运行docker?您可以使用Jenkins动态docker代理设置并将docker.sock挂载到代理容器以从代理容器内部执行docker命令。
