前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何在Docker容器中运行Docker [3种方法]

如何在Docker容器中运行Docker [3种方法]

作者头像
DevOps云学堂
发布于 2020-09-14 06:53:21
发布于 2020-09-14 06:53:21
27.8K00
代码可运行
举报
文章被收录于专栏:DevOps持续集成DevOps持续集成
运行总次数:0
代码可运行

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl --unix-socket /var/run/docker.sock http://localhost/version

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

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

例如,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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镜像。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -v /var/run/docker.sock:/var/run/docker.sock -ti docker

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker pull ubuntu

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker images

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir test && cd test
vi Dockerfile

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker build -t test-image .

方法2:Docker In Docker

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run --privileged -d --name dind-test docker:dind

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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映像。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run --runtime=sysbox-runc --name sysbox-dind -d docker:dind

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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命令。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DevOps云学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Docker in Docker容器化版的“盗梦空间”
Kubernetes集群计划迁移至1.24版本的集群,底层容器运行时换成了Containerd,然而当前的CI/CD流水线大多地方使用到了docker指令,要改成Containerd指令成本巨大,如何以最小的改动,最为高效地完成迁移便成了难题,为了攻克这个难题我们引入了DinD的方案进行实现,流水线都不用做任何改动,简直完美。
SRE运维手记
2024/08/30
1530
Docker in Docker容器化版的“盗梦空间”
浅析docker的多种逃逸方法
Docker实现原理:https://zone.huoxian.cn/d/1034-docker
UzJu@菜菜狗
2022/04/25
6.2K0
浅析docker的多种逃逸方法
如何在 Docker 中使用 Docker
在 CI 中,通常会有一个 CI Engine 负责解析流程,控制整个构建过程,而将真正的构建交给 Agent 去完成。例如,Jenkins 、GitLab 均是如此。
陈少文
2020/12/06
2.4K0
如何在 Docker 中使用 Docker
24条 Docker 建议
在TES GLOBAL,我们已经爱上Docker并从Docker的0.8版本开始就在生产环境中使用它。我们的很多开发者都参加了在DockerCon欧洲上的培训。下面是我们总结的一些tips,希望可以帮
小小科
2018/05/02
1.1K0
24条 Docker 建议
万字长文:编写 Dockerfiles 最佳实践
Docker通过读取Dockerfile中的指令自动构建镜像,一个文本文件包含构建镜像的所有指令。Dockerfile遵循特定的格式和指令集,您可以在Dockerfile中引用它们。
崔庆才
2019/08/20
2.1K0
万字长文:编写 Dockerfiles 最佳实践
Docker容器如何优雅使用NVIDIA GPU
Docker 容器不会自动看到您系统的 GPU。这会导致依赖 GPU 的工作负载(例如机器学习框架)的性能降低。以下是将主机的 NVIDIA GPU 公开给容器的方法。
我的小碗汤
2021/12/24
54.7K0
Docker容器如何优雅使用NVIDIA GPU
【随笔小记】提高Docker容器的安全性
随着 Docker 的兴起,越来越多的项目采用 Docker 搭建生产环境,因为容器足够轻量化,可以快速启动并且迁移业务服务,不过在使用的过程中,我们很容易就忽略了项目的安全问题,容器虽然有隔离的作用,但是我们知道,他与虚拟机的架构差距还是比较大的。
Balliol Chen
2022/04/21
5800
云上攻防-云原生篇&Docker安全&权限环境检测&容器逃逸&特权模式&危险挂载
Docker 是一个开放源代码软件,是一个开放平台,用于开发应用、交付(shipping)应用、运行应用。Docker允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。 Docker 容器与虚拟机类似,但二者在原理上不同,容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。
没事就要多学习
2024/07/18
2210
云上攻防-云原生篇&Docker安全&权限环境检测&容器逃逸&特权模式&危险挂载
再见 Docker,是时候拥抱下一代容器工具了
Linux 容器是由 Linux 内核所提供的具有特定隔离功能的进程,Linux 容器技术能够让你对应用及其整个运行时环境(包括全部所需文件)一起进行打包或隔离。从而让你在不同环境(如开发、测试和生产等环境)之间轻松迁移应用的同时,还可保留应用的全部功能。
iMike
2019/09/25
1.6K0
再见 Docker,是时候拥抱下一代容器工具了
使用PHP搭建Web版Docker管理系统实践
团队中使用容器比较频繁,但并不是所有人都可以登陆服务器去执行命令,但是又需要用到docker,所以有一个需求通过web来管理docker,而其他语言并不怎么熟悉,后期维护成本比较高,所以笔者采用PHP来管理容器。
汤青松
2018/10/19
2.2K0
使用PHP搭建Web版Docker管理系统实践
【Linux 系列】Watchtower - 自动更新 Docker 镜像与容器
Watchtower 是一个 Docker 容器的自动更新服务。当 Docker Hub 上的镜像被更新时,Watchtower 会检测这些变化并更新本地的 Docker 镜像和容器。
框架师
2023/03/23
2.9K0
记录我们迁移到 Docker 的挑战和经验教训
几周之前,我们宣布了 最新的产品 发布,以及由容器技术和 Docker 支持的 Artifakt 平台的全新的任意 App 功能。
深度学习与Python
2021/11/10
9440
记录我们迁移到 Docker 的挑战和经验教训
你可能不知道的容器镜像安全实践
最近在公司搭建CI流水线,涉及到容器镜像安全的话题,形成了一个笔记,分享与你,也希望我们都能够提高对安全的重视。
Edison Zhou
2023/01/09
7890
你可能不知道的容器镜像安全实践
docker 常用命令总结[通俗易懂]
注意 stop,restart后的容器,或者commit后的镜像启动环境变量需要重新加载,比如 source /etc/source
全栈程序员站长
2022/08/01
7970
docker 常用命令总结[通俗易懂]
Docker容器逃逸
由于传播、利用本公众号亿人安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号亿人安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
亿人安全
2023/12/25
7310
Docker容器逃逸
技术干货 | Docker 容器逃逸案例汇集
当获得一个Webshell,我们的攻击点可能处于服务器的一个虚拟目录里,一台虚拟机或是一台物理机,甚至是在一个Docker容器里。
Bypass
2020/08/09
2.9K0
Docker重学系列之Dockerfile
Dockerfile可以认为是Docker镜像的描述文件,是由一系列命令和参数构成的脚本。主要作用是用来构建docker镜像的构建文件。
大忽悠爱学习
2022/05/10
2K0
Docker重学系列之Dockerfile
3.Docker学习之Dockerfile
描述:Dockerfile是一个文本格式的配置文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。 用户可以使用Dockerfile快速创建自定义的镜像;通过它所支持的内部指令,以及使用它创建镜像的基本过程,Docker拥有”一点修改代替大量更新”的灵活之处;
全栈工程师修炼指南
2020/10/23
1.8K0
3.Docker学习之Dockerfile
在 Docker 上开发应用 - 编写 Dockerfile 的最佳实践
Docker 可以通过从 Dockerfile 中读取指令来自动构建镜像,Dockerfile 是一个文本文件,其中包含了按顺序排列的构建指定镜像所需的全部命令。Dockerfiles 采用特殊格式,使用一系列特别的指令。可以在 Dockerfile 参考页面 学习这些基础知识。如果对于编写 Dockerfile 你还是新手,那么接着往下看吧。
拓荒者
2019/03/11
2K0
使用 Docker 全自动构建 Java 应用
我们会在 Docker 容器里运行 Jenkins,再使用 Jenkins 启动一个 Maven 容器,用来编译我们的代码,接着在另一个 Maven 容器中运行测试用例并生成制品(例如 jar 包),然后再在 Jenkins 容器中制作 Docker 镜像,最后将镜像推送到 Docker Hub。
LinuxSuRen
2019/12/23
1.5K0
使用 Docker 全自动构建 Java 应用
相关推荐
Docker in Docker容器化版的“盗梦空间”
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验