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

news2025/2/22 13:43:17

在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插件远程构建。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/531855.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud alibaba微服务b2b2c电子商务平台

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务、系统服务、中间件服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot2、My…

飞书开发流程

1、进入飞书并创建一个应用 链接: 创建应用 创建应用成功后需要审核通过&#xff0c;如果你拥有管理权限则可以自己进入管理后台通过审核&#xff0c;否则需要联系管理员通过审核 2、进入开发者后台 链接: 发者后台 3、在该调试平台上测试 以这个订阅审批事件为例 这一步…

DHCP协议简单配置

实验原理 网络中主机需要与外界进行通信时,需要配置自己的IP地址、网关地址、DNS服务器等网络参数信息。手工在每台主机上配置维护成本高,容易出错,而且不利于管理员统一维护。 通过DHCP地址自动配置协议,使终端设备能自动获取地址,实现即插即用且IP地址统一由服务器管理…

springboot+java充电桩充电额维修管理系统

项目介绍 Spring Boot 是 Spring 家族中的一个全新的框架&#xff0c;它用来简化Spring应用程序的创建和开发过程。也可以说 Spring Boot 能简化我们之前采用SSM&#xff08;Spring MVC Spring MyBatis &#xff09;框架进行开发的过程。 系统基于B/S即所谓浏览器/服务器模式…

STM32 学习笔记_9 定时器中断:编码器接口模式

TIM编码器接口 之前我们处理旋转编码器&#xff0c;是转一下中断一次&#xff0c;挺消耗资源的。 我们可以利用TIM的编码器功能&#xff0c;隔一段时间取一下旋转器值使得cnt或–&#xff0c;以此判断旋转位置以及计算速度&#xff0c;相比中断节约资源。相当于外接了一个有方…

Kubernetes那点事儿——暴露服务之Service

Kubernetes那点事儿——暴露服务之Service 前言一、Service二、Service与Pod关系三、Service常用类型ClusterIPNodePortLoadBalancer 四、Service代理模式IptablesIPVS修改代理模式 前言 K8s中&#xff0c;我们将应用跑在Pod里。多数情况下是一组Pod&#xff0c;用户如何访问这…

凌恩生物美文分享 | 提升科研有一套 | 宏基因组磷循环分析又出新!

磷是包括微生物在内的所有生命体中不可缺少的元素。在生物大分子核酸、高能量化合物ATP、以及生物体内糖代谢的某些中间体中&#xff0c;都有磷的存在。在自然界中&#xff0c;磷的循环包括可溶性无机磷的同化、有机磷的矿化、不溶性磷的溶解等。微生物分解含磷化合物的作用&am…

操作系统面试相关知识

目录 一、简介1、什么是操作系统2、操作系统主要有哪些功能&#xff1f; 二、操作系统结构1、什么是内核&#xff1f;2、什么是用户态和内核态&#xff1f;3、 用户态和内核态是如何切换的&#xff1f; 三、 进程和线程1、并行和并发有什么区别&#xff1f;2、什么是进程上下文…

无线传感器网络的时钟同步估计问题(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 随着无线传感器网络的快速发展,其应用领域也越来越广。在诸多的应用环境中都需要大量已同步的传感器节点通过协同作用执行一个…

Python 中IndexError: list assignment index out of range 错误解决

文章目录 Python IndexError&#xff1a;列表分配索引超出范围修复 Python 中的 IndexError: list assignment index out of range修复 IndexError: list assignment index out of range 使用 append() 函数修复 IndexError: list assignment index out of range 使用 insert()…

怎么把文本翻译成英文?安利三个文本翻译方法

在当今全球化的时代&#xff0c;跨国交流和合作已经成为常态。然而&#xff0c;不同语言之间的沟通障碍经常阻碍着信息传递和理解。为了帮助我们更好地进行国际交流&#xff0c;文本翻译英文软件应运而生。这类软件能够将各种语言的文本迅速准确地翻译成英文&#xff0c;使我们…

【起飞】让你电脑速度快到飞起的一些牛逼的设置整理【电脑卡顿反应慢等问题解决】

对于开发来说电脑的反应速度简直影响了思维的速度&#xff0c;要让电脑速度跟上我们的思维&#xff0c;提高工作效率&#xff0c;早点打卡下班回家陪老婆孩子哈哈 这篇文章主要对windows系统做的一些优化&#xff0c;是真的好用&#xff0c;仿佛在访问静态页面一样&#xff0c;…

超实用!年薪40W的项目经理都在用的6个项目管理软件

项目管理软件是帮助团队进行项目计划、任务分配、进度跟踪和团队协作等方面的工具&#xff0c;已经成为了项目经理必不可少的工具之一。 市面上的项目管理软件有很多&#xff0c;这就来分享一下几款我认为好用的项目管理软件&#xff01; 一、六款好用的项目管理软件 1.简道…

C++开发工具 VTK技术实现三维重建CT医学影像PACS系统

一、信息管理 1、支持对患者、检查项目、申请医生、申请单据、设备等信息进行管理&#xff1b; 2、支持检查病人排队管理功能&#xff1b; 3、支持大屏幕队列显示和语音呼叫&#xff1b; 4、提供预约调整、插队管理和掉队处理等功能&#xff1b; 5、支持急诊申请优先安排。…

美股股指期货重要吗?要注意哪些风险?

美股股指期货是一种以美股股票价格指数作为标的物的金融期货合约。美股股指期货的表现对全球股指市场都有重要的影响力&#xff0c;具体体现在以下方面。 美股股指期货成为全球股指市场风向标 自20世纪70年代起&#xff0c;美国芝加哥商品交易所&#xff08;CME&#xff09;推…

Metasploit基础和实操-渗透测试察打一体(7)

Metasploit 基础包含专业术语,Metasploit 接口介绍,Metasploit 功能介绍 这些是弄渗透测试必须要了解的基础知识,也是0开始玩渗透测试和渗透开发的准备之一。 metasploit命令演示的环境搭建可以参考:https://luozhonghua.blog.csdn.net/article/details/123549917 作者用…

2023.05.14-微调ResNet参加kaggle上猫狗大战比赛打到99%的分类准确率_convert

文章目录 1. 前言2. 下载数据集3. 比赛成绩排名 4. baseline 5. 尝试5.1. 数据归一化&#xff08;98.994%&#xff09;5.2. 使用AdamW优化器&#xff08;98.63%&#xff09;5.3. 使用AdamW优化器SegNet模块&#xff08;95.05%&#xff09; 6. 结语7. 感慨 8. 代码8.1. ResNetNo…

贝尔曼福特算法——负权值单源最短路径

title: 贝尔曼福特算法——负权值单源最短路径 date: 2023-05-16 11:42:26 tags: 数据结构与算法 贝尔曼福特算法——负权值单源最短路径 **问题&#xff1a;**具有负权值非环图的单源最短路径算法 git地址&#xff1a;https://github.com/944613709/HIT-Data-Structures-and-A…

阿里云备案服务码怎么申请?

阿里云备案服务码是什么&#xff1f;ICP备案服务码怎么获取&#xff1f;阿里云备案服务码分为免费和付费两种&#xff0c;申请备案服务码是有限制条件的&#xff0c;需要你的阿里云账号下有可用于申请备案服务码的云产品&#xff0c;如云服务器、建站产品、虚拟主机等&#xff…

基于Sentinel自研组件的系统限流、降级、负载保护最佳实践探索 | 京东云技术团队

作者&#xff1a;京东物流 杨建民 一、Sentinel简介 Sentinel 以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel 具有以下特征: 丰富的应用场景&#xff1a;秒杀&#xff08;即突发流量控制在系统容量可以承受的范围&a…