您现在的位置是:首页 >技术交流 >在docker容器中启动docker服务并实现构建多平台镜像的能力网站首页技术交流

在docker容器中启动docker服务并实现构建多平台镜像的能力

cdy2143 2024-06-17 10:26:05
简介在docker容器中启动docker服务并实现构建多平台镜像的能力

在docker容器中启动docker服务并实现构建多平台镜像的能力

背景

在容器中运行docker,是devops中无法避免的场景,通常被应用于提供统一的镜像构建工具,出于安全考虑,不适合将主机的docker进程暴露给公司的内部人员使用,转而使用在容器中运行docker再发布成https的接口供公司内部人员使用,提高安全性。

实现方式

构建基于轻量级的镜像中安装docker的静态可执行文件以减少依赖包,同时创建证书,以提高docker接口的安全性。将此docker的http接口发布出去后,可以使用io.fabric8的docker-maven-plugin打包插件,通过配置,可自动化的执行本地代码的编译,上传docker构建镜像的临时文件到docker容器中的docker进程中,执行镜像的制作以及自动上传等功能。

实现步骤

在docker容器中启动docker服务

准备镜像资源

  1. 以下是制作dind镜像所使用的文件:
├── buildx-v0.10.4.linux-amd64     # buildx的插件包,可从https://github.com/docker/buildx#dockerfile下载
├── ca                             # ca证书,创建的过程参考http://www.manongjc.com/detail/62-sksugtattsntlcl.html
│   ├── ca-key.pem
│   ├── ca.pem
│   ├── ca.srl
│   ├── cert.pem
│   ├── key.pem
│   ├── server-cert.pem
│   └── server-key.pem
├── Dockerfile                     # 构建docker镜像的文件                     
└── entrypoint.sh                  #镜像的启动命令
  1. Dockerfile
FROM alpine:latest
ARG DOCKER_VERSION=23.0.5
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories 
&& apk add --no-cache curl 
&& apk add --no-cache iptables 
&& apk add --no-cache bash 
&& curl -O https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz 
&& tar zxvf docker-$DOCKER_VERSION.tgz 
&& cp docker/* /usr/bin/ 
&& docker -v
&& rm -rf /var/cache/apk/* 
&& rm -rf docker-$DOCKER_VERSION.tgz 
&& mkdir /ca 
&& mkdir -p /usr/local/lib/docker/cli-plugins

COPY buildx-v0.10.4.linux-amd64 /usr/local/lib/docker/cli-plugins/docker-buildx
COPY ca /ca
COPY entrypoint.sh /
CMD ["/entrypoint.sh"]
  1. entrypoint.sh
#!/bin/bash
rm -rf /var/run/docker.pid && 
dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:8375 --tlsverify --tlscacert=/ca/ca.pem --tlscert=/ca/server-cert.pem --tlskey=/ca/server-key.pem

构建

docker build -t dind:v1 .

使用docker-compose运行

docker-compose.yml的文件如下:

version: '2.3'
services:
  dind:
    image: dind:v1
    container_name: dind
    ports:
      - 8375:8375
    volumes:
      - /mnt/data/dind:/var/lib/docker
    privileged: true
    deploy:
      resources:
        limits:
          cpus: "2.0"
          memory: 1024M
    networks:
      - dev

networks:
  dev:
    external: false

运行

docker-compose up -d

在IDEA中集成Docker的镜像打包与发布

下载ca证书

将ca.pem, cert.pem, key.pem下载到本地并放到工程的ca的文件夹下。
在这里插入图片描述

pom.xml增加配置

<properties>
  <docker-maven-plugin.version>0.42.1</docker-maven-plugin.version>
  <!-- docker服务器信息 -->
  <docker-host>https://IP:8375</docker-host>
  <!-- 镜像仓库账户和密码 -->
  <docker-username>username</docker-username>
  <docker-password>password</docker-password>
</properties>
<build>
  <pluginManagement>
    <!-- docker -->
    <plugins>
        <groupId>io.fabric8</groupId>
         <artifactId>docker-maven-plugin</artifactId>
         <version>${docker-maven-plugin.version}</version>
         <executions>
             <execution>
                 <id>build</id>
                 <goals>
                     <goal>build</goal>
                     <goal>push</goal>
                     <goal>remove</goal>
                 </goals>
                 <phase>package</phase>
             </execution>
         </executions>
         <configuration>
             <imagePullPolicy>Always</imagePullPolicy>
             <dockerHost>${docker-host}</dockerHost>
             <certPath>${basedir}/../docker/ca/</certPath>
             <authConfig>
                 <username>${docker-username}</username>
                 <password>${docker-password}</password>
             </authConfig>
             <images>
                 <image>
                     <name>${project.artifactId}:${project.version}</name>
                     <build>
                         <from>openjdk:8</from>
                         <assembly>
                           <descriptorRef>artifact</descriptorRef>
                         </assembly>
                         <cmd>java -jar /maven/${project.name}-${project.version}.jar</cmd>
                           <ports>
                           <port>8080</port>
                         </ports>
                     </build>
                 </image>
             </images>
         </configuration>
     </plugin>
   </plugins>
 </build>

执行docker镜像的构建

  1. 当前pom.xml中已将docker-maven-plugin的打包绑定到了build阶段,故可在maven的build阶段时自动完成java代码的编译、打包,docker镜像的构建、发布到镜像仓库及自动删除镜像等过程。
    在这里插入图片描述

  2. 手动使用docker-maven-plugin提供的命令自行构建
    在这里插入图片描述

使用buildx插件构建多平台镜像能力

  1. 安装模拟器和使能特性
    Docker for Linux不支持构建 ARM 架构镜像,我们可以安装模拟器(用于多平台镜像构建) 让其支持该特性
# 进入到dind容器
docker exec -it bind bash
# 安装模拟器
docker run --rm --privileged tonistiigi/binfmt:latest --install all
  1. 创建builder
# 进入到dind容器
docker exec -it bind bash
# 创建构建器
docker buildx create --use --name=mybuilder-cn
#查看构建器
docker buildx ls
  1. 多平台镜像的dockerfile
    Dockerfile:
FROM openjdk:8
MAINTAINER xxx

ENV TZ=PRC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN apt update && apt -y install telnet vim net-tools lsof procps iftop iputils-ping fontconfig && apt clean && rm -rf /var/lib/apt/lists/*
  1. 执行构建
docker buildx build --provenance false --platform linux/amd64,linux/arm64 -t IP:PORT/openjdk:8-tj --push .

将上面的IP和端口换成自己搭建的镜像仓库(如:harbor)。

  1. 在镜像仓库中查看镜像
    本例使用的是harbor镜像仓库
    在这里插入图片描述
    在这里插入图片描述
    从上图中可以看到已创建了amd64和arm64两种架构的镜像。
    注:buildx只能在服务器上运行,无法通过docker-maven-plugin插件远程构建。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。