Azure DevOps — Kubernetes 上的自托管代理 — 第 4 部分
在本篇博文中,我们将深入探讨 Docker in Docker (DinD) 的强大功能。这项技术使我们能够在 Docker 容器中运行 Docker 命令,为容器化工作流开辟了无限可能。
本系列文章将探讨如何让 Docker 与 Azure DevOps 无缝协作!在本篇博文中,我们将探索一个名为 Docker in Docker (DinD) 的酷炫技巧。它就像在容器中嵌套容器,对于任何使用 Kubernetes 的人来说,它都将带来颠覆性的改变。
我们将指导您创建 Docker in Docker 镜像并在 Kubernetes Pod 中运行它们。我们将把所有内容连接到 Azure DevOps,让您轻松运行 Docker 任务。
准备好简化您的 Kubernetes 工作流程,并使用 Docker 和 Azure DevOps 将 DevOps 提升到新的水平。让我们开始吧!
目录
- 了解 Docker in Docker
- 设置 Docker in Docker 镜像
- 在 Kubernetes 中部署 Docker in Docker (DinD) 镜像
- 在 DinD 自托管代理上运行 Docker 命令
- Docker in Docker (DinD) 对 Azure DevOps 的优势
了解 Docker in Docker
顾名思义,Docker in Docker 使我们能够将 Docker 容器嵌套在一起。此功能在需要在隔离环境中构建、测试或部署 Docker 化应用程序的场景中尤为有用。
设置 Docker in Docker 镜像
首先,我们将创建一个 Docker in Docker 镜像。该镜像允许我们在容器内无缝执行 Docker 命令。通过封装 Docker 运行时环境,我们可以确保跨不同平台的一致性和可移植性。
让我们构建一个 Docker in Docker (DinD) 镜像:
在你的 Docker 环境中创建包含以下内容的 Dockerfile
#
# Ubuntu Bionic + Docker
#
# Instructions for docker installation taken from:
# https://docs.docker.com/install/linux/docker-ce/ubuntu/
#FROM ubuntu:bionic# Docker install
RUN apt-get update && apt-get install --no-install-recommends -y \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-common
RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
RUN apt-key fingerprint 0EBFCD88RUN add-apt-repository \"deb [arch=amd64] https://download.docker.com/linux/ubuntu \$(lsb_release -cs) \stable"
RUN apt-get update && apt-get install --no-install-recommends -y docker-ce docker-ce-cli containerd.ioRUN apt update -y && apt upgrade -y && apt install curl git jq libicu60 -y# Also can be "linux-arm", "linux-arm64".
ENV TARGETARCH="linux-x64"WORKDIR /azp/COPY ./start.sh ./
RUN chmod +x ./start.shENV AGENT_ALLOW_RUNASROOT="true"# # Set start.sh script as ENTRYPOINT.
ENTRYPOINT ["/azp/start.sh"]
在同一路径下创建一个start.sh脚本,内容如下(该脚本将帮助我们启动容器内的docker并连接到Azure DevOps代理池)
#!/bin/bash
set -eprint_header() {lightcyan="\033[1;36m"nocolor="\033[0m"echo -e "\n${lightcyan}$1${nocolor}\n"
}print_header "Starting the Docker Process..."
dockerd > /var/log/dockerd.log 2>&1 &if [ -z "${AZP_URL}" ]; thenecho 1>&2 "error: missing AZP_URL environment variable"exit 1
fiif [ -z "${AZP_TOKEN_FILE}" ]; thenif [ -z "${AZP_TOKEN}" ]; thenecho 1>&2 "error: missing AZP_TOKEN environment variable"exit 1fiAZP_TOKEN_FILE="/azp/.token"echo -n "${AZP_TOKEN}" > "${AZP_TOKEN_FILE}"
fiunset AZP_TOKENif [ -n "${AZP_WORK}" ]; thenmkdir -p "${AZP_WORK}"
ficleanup() {trap "" EXITif [ -e ./config.sh ]; thenprint_header "Cleanup. Removing Azure Pipelines agent..."# If the agent has some running jobs, the configuration removal process will fail.# So, give it some time to finish the job.while true; do./config.sh remove --unattended --auth "PAT" --token $(cat "${AZP_TOKEN_FILE}") && breakecho "Retrying in 30 seconds..."