如何在Docker容器中运行Docker [3种方法]
在本博客中,我将向您介绍在docker中运行docker所需的三种不同方法。
Docker In Docker的用处
- dockerIndocker的一个潜在用处是CI管道,在代码成功构建后,您需要在其中构建docker镜像并将其推送到容器镜像仓库。
- 使用VM构建Docker映像非常简单。但是,当您计划将基于 Jenkins docker的动态代理用于CI/CD管道时,docker In docker是必备功能。
- 沙盒环境。
- 出于实验目的,在您的本地开发工作站上。
在Docker容器中运行Docker
在Docker中实现Docker的三种方法
- 通过挂载docker.sock(DooD方法)运行docker
- dind 方法
- 使用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.04
LABEL 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-test
以docker: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构建映像,如先前方法所示。
关键注意事项
- 仅在必要时在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命令。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 搞它!!!linux服务器硬件及RAID 配置实战
- 认识XML
- 基于oracle的sql(结构化查询语言)指令
- oracle约束条件
- oracle常用函数介绍
- 搞它!!!Linux系统中查看进程和计划任务管理
- 搞它!!!深入了解linux文件系统底层原理及日志文件介绍
- 搞它!!!Linux系统MBR分区和GPT分区的区别
- oracle补充
- 搞它!!!Linux系统LVM原理及磁盘配额(PV、VG、LV、PE的关系,手把手教你,嘴对嘴的传达)
- 搞它!!!linux网络服务基本设置命令合集
- 搞它!!!Linux系统上DHCP服务器的配置(理论加实验,分分钟搞定!!!)
- 搞它!!!Linux——引导、排障及修复
- 排障集锦:九九八十一难之第一难!linux发现交换文件无法打开文件!
- 排障集锦:九九八十一难之第三难!搭建DNS错误:Host xxxx not found: 2(SERVFAIL)