静茹docker容器的几种方法_如何在Docker容器中运行Docker 「3种方法」

DevOps云学堂 今天

c365643162276376e4e147d3dfd160b1.png

在本博客中,我将向您介绍在docker中运行docker所需的三种不同方法。

Docker In Docker的用处

  1. dockerIndocker的一个潜在用处是CI管道,在代码成功构建后,您需要在其中构建docker镜像并将其推送到容器镜像仓库。
  2. 使用VM构建Docker映像非常简单。但是,当您计划将基于 Jenkins docker的动态代理用于CI/CD管道时,docker In docker是必备功能。
  3. 沙盒环境。
  4. 出于实验目的,在您的本地开发工作站上。

在Docker容器中运行Docker

在Docker中实现Docker的三种方法

  1. 通过挂载docker.sock(DooD方法)运行docker
  2. dind 方法
  3. 使用Nestybox sysbox Docker运行时

让我们详细了解每个选项。确保在主机中安装了docker来尝试此设置。

方法1:使用[/var/run/docker.sock]的Docker中运行Docker

c38acc7b9d05981b6447cfddc49a5760.png

什么是/var/run/docker.sock?

/var/run/docker.sock是默认的Unix套接字。套接字用于在同一主机上的进程之间进行通信。Docker守护程序默认情况下侦听docker.sock。如果您在运行Docker守护程序的主机上,则可以使用/ var/run/docker.sock管理容器。

例如,如果您运行以下命令,它将返回docker engine的版本。

curl --unix-socket /var/run/docker.sock http://localhost/version

现在您已经了解了什么是docker.sock,让我们看看如何使用在docker中运行docker。

要在docker内部运行docker,要做的只是在默认Unix套接字docker.sock作为卷的情况下运行docker 。

例如,

docker run -v /var/run/docker.sock:/var/run/docker.sock            -ti docker-image

请注意:如果您的容器可以访问docker.sock,则意味着它具有对docker守护程序的更多特权。因此,在实际项目中使用时,请了解并使用安全隐患。

现在,从容器中,您应该能够执行docker命令来构建镜像并将其推送到镜像仓库。在这里,实际的docker操作发生在运行docker容器的VM主机上,而不是在容器内部进行。意思是,即使您正在容器中执行docker命令,也指示Docker客户端通过以下docker.sock方式连接到VM主机docker-engine。


方法2:Docker In Docker

7b28e7789cd1eea0ab037b34e6130daa.png

此方法实际上在容器内部创建一个子容器。仅当您确实要在容器中包含容器和图像时才使用此方法。否则,我建议您使用第一种方法。为此,您只需要使用带有dind标签的官方docker镜像即可。该dind映像使用Docker所需的实用程序进行制作以在Docker容器中运行。

方法3:使用Sysbox运行时的Docker中的Docker

afd222c733cae40cee890bd5583d5313.png

方法1和2在安全方面有一些缺点,因为在特权模式下运行容器。Nestybox尝试通过使用sysbox Docker运行时来解决该问题。

如果使用Nestybox sysbox运行时创建容器,则它可以在能够运行systemd,docker,kubernetes的容器内创建虚拟环境,而无需特权访问基础主机系统。解释sysbox需要足够的理解力,因此我不在本文的讨论范围之内。请参考此页面以全面了解sysbox。

步骤1:安装sysbox运行时环境。请参阅此页面以获取有关安装sysbox运行时的最新官方说明。

第2步:一旦拥有sysbox运行时可用,您要做的就是使用sysbox运行时标志启动docker容器,如下所示。在这里,我们使用的是官方docker dind映像。

docker run --runtime=sysbox-runc --name sysbox-dind -d docker:dind

步骤3:现在将exec会话带到sysbox-dind容器。

docker exec -it sysbox-dind /bin/sh

现在,您可以尝试使用Dockerfile构建映像,如先前方法所示。

关键注意事项

  1. 仅在必要时在Docker中使用Docker。在将任何工作流程迁移到Docker-in-Docker方法之前,请进行足够的测试。
  2. 在特权模式下使用容器时,请确保您已获得企业安全团队有关计划执行的必要批准。
  3. 在带有kubernetes容器的Docker中使用Docker时,存在一些挑战。请参阅此博客以了解更多信息。
  4. 如果您打算使用Nestybox(Sysbox),请确保已通过企业架构师/安全团队的测试和批准。

常见问题

这是Docker问题中一些经常问到的Docker。

在Docker中运行Docker安全吗?

使用docker.sock和dind方法在docker中运行docker的安全性较差,因为它具有对docker守护程序的完全特权

如何在Jenkins中的docker中运行docker?

您可以使用Jenkins动态docker代理设置并将docker.sock安装到代理容器,以从代理容器内执行docker命令。


关于我们

泽阳,DevOps领域实践者。专注于企业级DevOps运维开发技术实践分享,主要以新Linux运维技术、DevOps技术课程为主。丰富的一线实战经验,课程追求实用性获得多数学员认可。课程内容均来源于企业应用,在这里既学习技术又能获取热门技能,欢迎您的到来!(VVXXID: devopsvip)

#DevOps# #持续交付# #Docker#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值