在本博客中,我将向您介绍在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


什么是/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。

要测试他的设置,请使用来自docker hub 的官方docker映像。它具有docker二进制文件。

请按照以下步骤测试设置。

第1步:以交互方式启动Docker容器,并挂载docker.sock卷。我们将使用官方的docker镜像。

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

步骤2:进入容器后,执行以下docker命令。

docker pull ubuntu

步骤3:列出Docker映像时,您应该看到ubuntu映像以及在主机VM中其他Docker映像。

docker images

步骤4:现在在测试目录中创建一个Dockerfile。

mkdir test && cd test
vi Dockerfile

复制以下Dockerfile内容以从容器内部测试映像构建。

FROM ubuntu:18.04LABEL maintainer="Bibin Wilson <bibinwilsonn@gmail.com>"RUN apt-get update && \apt-get -qy full-upgrade && \apt-get install -qy curl && \apt-get install -qy curl && \curl -sSL https://get.docker.com/ | sh

编译Dockerfile

docker build -t test-image .

方法2:Docker In Docker


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

请按照以下步骤测试安装程序。

注意:这要求您的容器以特权模式运行。

步骤1:建立dind-testdocker:dind图片命名的容器

docker run --privileged -d --name dind-test docker:dind

步骤2:使用exec登录到容器。

docker exec -it dind-test /bin/sh

现在,从以前的方法执行步骤2到4,并验证docker命令行说明和映像构建。


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


方法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.sockdind方法在docker中运行docker的安全性较差,因为它具有对docker守护程序的完全特权

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

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


关于我们

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

DevOps流水线实践课程

????戳阅读原文,进入课堂

如何在Docker容器中运行Docker [3种方法]相关推荐

  1. Docker 容器中运行 Docker 命令

    Docker 容器中运行 Docker 命令 在使用 GitLab/Jenkins 等 CI 软件的时候需要使用 Docker 命令来构建镜像,需要在容器中使用 Docker 命令:通过将宿主机的 D ...

  2. 如何在Docker容器中运行GUI程序

    如何在Docker容器中运行GUI程序 各位,今天我们将学习如何在Docker之中运行GUI程序.我们可以轻易地在Docker容器中运行大多数GUI程序且不出错.Docker是一个开源项目,提供了一个 ...

  3. vs附加其它计算机应用到进程,如何将VS代码附加到在docker容器中运行的节点进程...

    我试图将Visual Studio代码调试程序附加到在Docker容器中运行的node.js应用程序. 我启动应用程序,如: node --debug-brk app.js 我在docker-comp ...

  4. 【Rust日报】 2019-05-27:toast - 支持在docker容器中运行任务的工具

    Rust中文社区翻译小组招募 #activity #RustChina 首批任务:Rust官网翻译 这里有详细说明 https://github.com/rust-lang/www.rust-lang ...

  5. 在Linux和Windows的Docker容器中运行ASP.NET Core

    译者序:其实过去这周我都在研究这方面的内容,结果周末有事没有来得及总结为文章,Scott Hanselman就捷足先登了.那么我就来翻译一下这篇文章,让更多的中文读者看到.当然Scott遇到的坑我也遇 ...

  6. Beats:如何在 Docker 容器中运行 Filebeat

    今天在这篇博客中,我们将学习如何在容器环境中运行 Filebeat. 为了快速了解 Filebeat 是做什么用的: Filebeat用于转发和集中日志数据 它重量轻,小型化,使用的资源更少 它作为代 ...

  7. 如何在 docker 容器内部运行 docker命令

    更多.更及时内容欢迎留意微信公众号: 小窗幽记机器学习 背景 有些场景在容器内部需要调用 docker 命令.为此,本文梳理2种可以在容器内部执行docker命令的方法. 方法1:基于 docker. ...

  8. Docker容器中运行Ubuntu系统

    只习惯用Centos系统,但是有些软件编译安装很麻烦不方便,但是呢在Ubuntu中就变得容易方便,所以我打算用docker运行Ubuntu系统弥补Centos短板和不足之处: 项目地址:https:/ ...

  9. 在Docker容器中运行程序时出错,You have to remove (or rename) that container to be able to reuse that name

    1.docker run 命令来在容器内运行一个应用程序,出现以下问题 [root@localhost ~]# docker run --name runoob-nginx-test -p 8081: ...

最新文章

  1. nrf51822-添加DFU服务
  2. 在iptables防火墙下开启vsftpd的端口
  3. python3 类的一个实例
  4. java清屏_【图片】请问java编写中如何做到清屏啊。。。_java吧_百度贴吧
  5. html单行元素居中显示,多行元素居左显示
  6. 教资计算机科学与技术教资,教资笔试查成绩啦!广师大未来教师们又前进一步...
  7. Qt|C++-OpenGL绘制三角形带
  8. CSS单位--px,em,rem,rpx区别
  9. float 精度_为什么float后面要加f
  10. 华为最新 5G 折叠机 MateXs 发布,起售价 19000 多元
  11. JS中类方法、对象方法、原型方法
  12. 【编程|二十四点】关于编程解决二十四点的两种思路
  13. 三角形周长最短问题_最短路径问题之三角形的周长最小
  14. Arduino制作跑马灯
  15. java 导出excel 附带图片
  16. POJ Haybale Guessing
  17. 【点云分割】边界分割对点云分割的监督学习(CBL)
  18. 笔记--javascript对象及简单,复杂数据类型
  19. PMP备考指南之第十一章:项目风险管理
  20. 在国内当个程序员究竟钱途如何?2011程序员薪资调查报告

热门文章

  1. 软件架构---微核架构
  2. 操作教程:大华摄像头通过GB28181协议注册EasyCVR平台的详细配置
  3. 如何使用 Typora 创建思维导图
  4. python多核运行程序_python单进程能否利用多核cpu的测试结论
  5. python的图片转PDF
  6. 立体视觉相机使用JetsonTX2提升图像
  7. 40、卤代烷灭火系统模拟喷气试验
  8. 贴纸拼词--动态规划
  9. linux_常用命令
  10. c++链表获取长度,链表翻转,查找链表倒数第K个节点以及中间点