您现在的位置是:首页 >技术交流 >在docker容器中启动docker服务并实现构建多平台镜像的能力网站首页技术交流
在docker容器中启动docker服务并实现构建多平台镜像的能力
简介在docker容器中启动docker服务并实现构建多平台镜像的能力
在docker容器中启动docker服务并实现构建多平台镜像的能力
背景
在容器中运行docker,是devops中无法避免的场景,通常被应用于提供统一的镜像构建工具,出于安全考虑,不适合将主机的docker进程暴露给公司的内部人员使用,转而使用在容器中运行docker再发布成https的接口供公司内部人员使用,提高安全性。
实现方式
构建基于轻量级的镜像中安装docker的静态可执行文件以减少依赖包,同时创建证书,以提高docker接口的安全性。将此docker的http接口发布出去后,可以使用io.fabric8的docker-maven-plugin打包插件,通过配置,可自动化的执行本地代码的编译,上传docker构建镜像的临时文件到docker容器中的docker进程中,执行镜像的制作以及自动上传等功能。
实现步骤
在docker容器中启动docker服务
准备镜像资源
- 以下是制作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 #镜像的启动命令
- 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"]
- 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镜像的构建
-
当前pom.xml中已将docker-maven-plugin的打包绑定到了build阶段,故可在maven的build阶段时自动完成java代码的编译、打包,docker镜像的构建、发布到镜像仓库及自动删除镜像等过程。
-
手动使用docker-maven-plugin提供的命令自行构建
使用buildx插件构建多平台镜像能力
- 安装模拟器和使能特性
Docker for Linux不支持构建 ARM 架构镜像,我们可以安装模拟器(用于多平台镜像构建) 让其支持该特性
# 进入到dind容器
docker exec -it bind bash
# 安装模拟器
docker run --rm --privileged tonistiigi/binfmt:latest --install all
- 创建builder
# 进入到dind容器
docker exec -it bind bash
# 创建构建器
docker buildx create --use --name=mybuilder-cn
#查看构建器
docker buildx ls
- 多平台镜像的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/*
- 执行构建
docker buildx build --provenance false --platform linux/amd64,linux/arm64 -t IP:PORT/openjdk:8-tj --push .
将上面的IP和端口换成自己搭建的镜像仓库(如:harbor)。
- 在镜像仓库中查看镜像
本例使用的是harbor镜像仓库
从上图中可以看到已创建了amd64和arm64两种架构的镜像。
注:buildx只能在服务器上运行,无法通过docker-maven-plugin插件远程构建。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。