学习
实践
活动
专区
工具
TVP
写文章
专栏首页DevOps持续集成如何在Docker容器中运行Docker [3种方法]

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

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

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

原始发表时间:2020-09-08
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • Docker 容器中运行 Docker 命令

    发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/145668.html原文链接:https://javaforall.cn

    全栈程序员站长
  • docker停止运行中的容器(docker关闭容器)

    centos 启动一个容器添加了-d 参数,但是docker ps 或者docker ps -a查看却已经退出了

    全栈程序员站长
  • 如何在Ubuntu 14.04上的Docker容器中运行Nginx

    通过容纳Nginx,我们减少了系统管理员的开销。我们将不再需要通过包管理器管理Nginx或从源代码构建它。Docker容器允许我们在发布新版本的Nginx时简单...

    朝朝
  • 一个docker容器中运行多个服务还是弄一堆docker容器运行?

    ydymz
  • [docker]整站迁移到docker容器中3

    在我docker整站迁移到docker容器中2这篇文章中,我分析了要做的内容,接下去的日志我将会慢慢更新提及的几个关键服务软件的搭建方式,以及我将会记录下对应遇...

    djc8小码农
  • ASP.NET Core 如何在运行Docker容器时指定容器外部端口

    晓晨
  • 复制文件到正在运行的Docker容器中

    通过之前的章节,你已经可以灵活控制容器了,那么在接下来的几篇文章中,我们来练习通过修改容器来创建一个个性化的镜像,然后发布到Dockerhub、阿里云、Azur...

    角落的白板报
  • 进入正在运行状态中的Docker容器

    我运行一个包含了SpringBoot应用打好的jar包的docker镜像后,在宿主机控制台看到了SpringBoot应用成功启动的调试信息:

    Jerry Wang
  • Jenkins(2)docker容器中安装python3[通俗易懂]

    使用docker安装jenkins环境,jenkins构建的workspace目录默认是在容器里面构建的,如果我们想执行python3的代码,需进容器内部安装p...

    全栈程序员站长
  • 上传本地项目到Docker运行的GitLab容器中

    GitLab默认是以http方式进行上传的,但是文件过大,Nginx与GitLab的默认配置限制了客户端像服务器传送文件的大小,,当前环境当中GitLab是以D...

    星哥玩云
  • 为什么不需要在 Docker 容器中运行 SSHD

    当开始使用Docker时,人们经常问:“我该如何进入容器?”,其他人会说“在你的容器里运行一个SSH服务器”。但是,从这篇博文中你将会了解到你根本不需要运行SS...

    星哥玩云
  • Docker - 如何使用SSH连接到正在运行中的容器

    本篇文章主要介绍了如何使用SSH将你的Docker容器与其他Docker容器进行连接的方法,如果我忽略了一个或多个重点,请随意评论/建议。

    用户1150262
  • 如何在一个Docker中同时运行多个程序进程?

    那么基本思路是在Dockerfile 的CMD 或者 ENTRYPOINT 运行一个”东西”,然后再让这个”东西”运行多个其他进程 简单说来是用Bash She...

    sunsky
  • k3d入门指南:在Docker中运行K3s

    在本文中,我们将简单了解k3d,这是一款可让您在安装了Docker的任何地方运行一次性Kubernetes集群的工具,此外在本文中我们还将探讨在使用k3d中可能...

    CNCF
  • 把运行在 Docker 容器内的 Microsoft SQL 服务器部署到 SAP Kyma 中

    在阅读这篇文章之前,Jerry 假设您已经读过了这篇在 Docker 里运行 Microsoft SQL 服务器。

    Jerry Wang
  • docker容器中的前台程序和后台程序,为什么一定要前台运行

    目前了解的可以使用以下3种方法,具体用哪种方法,依据实际情况,生产情况下,通常用docker-compose结合具体cmd作为容器初起的命令。

    用户10048459
  • Jenkins2 学习系列25 -- 添加 Docker Cloud 并构建镜像

    目前Docker已经成为众多流水线中关键的组成部分之一。容器化具有的简单性,灵活性以及隔离性可以让我们定制特定的而且能够精确重复的环境。容器化部署也越来越流行。

    mafeifan
  • 创建自己的Docker基础镜像

    Docker 提供了两种方法来创建基础镜像,一种是通过引入tar包的形式,另外一种是通过一个空白的镜像来一步一步构建,本文使用的是第二种方法,既FROM scr...

    大江小浪

扫码关注腾讯云开发者

领取腾讯云代金券