docker-java

一 所需依赖包

<dependency><groupId>com.github.docker-java</groupId><artifactId>docker-java</artifactId><version>3.3.3</version>
</dependency>

二 前期准备

2.1 docker已安装

2.2 运行程序用户的docker使用权限

默认docker安装后是root权限运行的,比如运行程序的用户是admin用户,则需要将admin用户加加入到docker用户组

gpasswd -a admin docker
systemctl restart docker

2.3 docker.service 的访问方式,需要开启tcp访问默认,不然可能导致非root用户运行程序导致连接异常

vi /usr/lib/systemd/system/docker.service

将 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

改为
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

然后重启

systemctl daemon-reload

systemctl restart docker

三 配置参数

3.1 配置信息类,可以放在配置文件中,为了演示直接写死
public class Docker {/** docker 连接方式* 或者 "unix:///var/run/docker.sock"*/private String host = "tcp://DOCKER_HOST_IP:2375";private String configDir = "/home/admin/.docker";private String apiVersion = "1.30";private String registerUrl = "";private String registerName = "";private String registerPassword = "";private String registerEmail = "";private Boolean tlsVerify = false;private String certPath = ""; // tsl证书地址
}

3.2 创建请求参数

import java.util.Collection;
import java.util.List;
import java.util.Map;
import lombok.Getter;
import lombok.Setter;@Getter
@Setter
public class ContainerCreateParam implements Serializable {private String imageName;private String containerName;/*** 端口映射Map,key是hostPort,value是containerPort*/private Map<Integer, Integer> portMap;/***  卷绑定 /host:/container:ro*/private Collection<String> volumeBindSpecs;private Long memory;private List<String> envs;
}

四 工具类

import cn.hutool.core.collection.CollectionUtil;
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.command.CreateContainerCmd;
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.api.model.Bind;
import com.github.dockerjava.api.model.ExposedPort;
import com.github.dockerjava.api.model.HostConfig;
import com.github.dockerjava.api.model.PortBinding;
import com.github.dockerjava.api.model.SearchItem;
import com.github.dockerjava.core.DefaultDockerClientConfig;
import com.github.dockerjava.core.DockerClientBuilder;
import com.xz.cp.core.exception.BusinessException;
import com.xz.cp.core.utils.JsonUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import org.apache.commons.lang3.BooleanUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;@Component
public class DockerUtils {private static final String CONTAINER_NAME_PATTERN = "^/?[a-zA-Z0-9][a-zA-Z0-9_.-]+$";private static final Logger LOG = LoggerFactory.getLogger(DockerUtils.class);private static DockerClient dockerClient;public DockerUtils() {Docker dockerProperties = new Docker(); // 取配置信息,视情况放在配置中心读取DefaultDockerClientConfig.Builder builder = DefaultDockerClientConfig.createDefaultConfigBuilder().withDockerHost(dockerProperties.getHost()).withDockerConfig(dockerProperties.getConfigDir()).withApiVersion(dockerProperties.getApiVersion()) // optional.withRegistryUrl(dockerProperties.getRegisterUrl()).withRegistryUsername(dockerProperties.getRegisterName()).withRegistryPassword(dockerProperties.getRegisterPassword()).withRegistryEmail(dockerProperties.getRegisterEmail());if (BooleanUtils.isTrue(dockerProperties.getTlsVerify())) {builder.withDockerTlsVerify(true).withDockerCertPath(dockerProperties.getCertPath());}dockerClient = DockerClientBuilder.getInstance(builder.build()).build();LOG.info("dockerClient init success");}private void _checkContainerName(String containerName) {if (!Pattern.matches(CONTAINER_NAME_PATTERN, containerName)) {throw new BusinessException("", "非法容器名!");}}/*** 创建容器** @param containerCreateParam containerCreateParam* @return 创建完的容器*/public CreateContainerResponse createContainer(ContainerCreateParam containerCreateParam) {_checkContainerName(containerCreateParam.getContainerName());// 创建容器需要使用的命令CreateContainerCmd containerCmd = dockerClient.createContainerCmd(containerCreateParam.getImageName()).withName(containerCreateParam.getContainerName());// 封装端口映射List<PortBinding> list = new ArrayList<>();Map<Integer, Integer> portMap = containerCreateParam.getPortMap();for (Integer hostPort : portMap.keySet()) {// 暴露端口containerCmd = containerCmd.withExposedPorts(ExposedPort.parse(portMap.get(hostPort) + "/tcp"));// 绑定主机端⼝ -> docker容器端⼝list.add(PortBinding.parse(hostPort + ":" + portMap.get(hostPort)));}HostConfig hostConfig = HostConfig.newHostConfig().withMemory(containerCreateParam.getMemory() == null ? 1024L * 1024 * 1024: containerCreateParam.getMemory()).withPortBindings(list);if (CollectionUtil.isNotEmpty(containerCreateParam.getVolumeBindSpecs())) {List<Bind> volumeBinds = containerCreateParam.getVolumeBindSpecs().stream().map(Bind::parse).collect(Collectors.toList());hostConfig.withBinds(volumeBinds);}if (CollectionUtil.isNotEmpty(containerCreateParam.getEnvs())) {containerCmd = containerCmd.withEnv(containerCreateParam.getEnvs());}// 执行创建命令CreateContainerResponse container = containerCmd.withHostConfig(hostConfig).exec();LOG.info("create container res = {}", JsonUtils.toString(container));return container;}public List<SearchItem> searchItems(String image) {return dockerClient.searchImagesCmd(image).exec();}/*** 关闭容器** @param id 容器ID*/public void stopContainer(String id) {dockerClient.stopContainerCmd(id).exec();}/*** 暂停容器** @param id 容器ID*/public void pauseContainer(String id) {dockerClient.pauseContainerCmd(id).exec();}/*** 重启容器** @param id 容器ID*/public void restartContainer(String id) {dockerClient.restartContainerCmd(id).exec();}/*** 删除容器** @param id 容器ID*/public void startContainer(String id) {dockerClient.startContainerCmd(id).exec();}/*** docker容器commit为镜像** @param containerID 容器id* @param rep         镜像的仓库,就相当于【ubuntu:latest】中的【ubuntu】* @param tag         镜像的标签,就相当于【ubuntu:latest】中的【latest】*/public void createImageByContainer(String containerID, String rep, String tag) {dockerClient.commitCmd(containerID).withRepository(rep).withTag(tag).exec();}
}

五 测试类

@SpringBootTest
class DockerUtilsTest {@AutowiredDockerUtils dockerUtils;@Testvoid createContainer() {ContainerCreateParam param = new ContainerCreateParam();String containerName = "customizeName-" + UUID.fastUUID();param.setContainerName(containerName);param.setEnvs(List.of("MYSQL_ROOT_PASSWORD=123456"));param.setImageName("mysql:5.7");param.setVolumeBindSpecs(List.of("/root/docker_data/" + containerName + ":/var/lib/mysql"));param.setPortMap(Map.of(3318, 3306));param.setMemory(1024L * 1024 * 1024 * 2);dockerUtils.createContainer(param);}
}

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

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

相关文章

“深入解析JVM:Java虚拟机内部原理揭秘“

标题&#xff1a;深入解析JVM&#xff1a;Java虚拟机内部原理揭秘 摘要&#xff1a;本文将深入探讨Java虚拟机&#xff08;JVM&#xff09;的内部原理&#xff0c;包括JVM的架构、运行时数据区域、垃圾回收机制以及即时编译器等重要组成部分。通过对JVM内部原理的解析&#xf…

Java注解语法

Java注解语法 1. 前置基础 ​ 学习java反射语法 JAVA通过反射使用公共构造方法和私有构造方法来创建对象 2. Java注解是什么&#xff1f; ​ Java注解是代码中的特殊标记&#xff0c;比如Override、Test等&#xff0c;作用是&#xff1a;让其他程序根据注解 信息决定怎么执…

【xxl-job快速入门搭建】

目录标题 xxl-job快速入门搭建源码地址项目结构初始化数据库启动项目1、启动服务端2、启动任务执行器端 MD文档指导教程功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内…

el-form表单验证:只在点击保存时校验(包含select、checkbox、radio)

1、input类型 input类型 在el-input里加入:validate-event"false" <el-form-item label"活动名称" prop"name"><el-input v-model"ruleForm.name" :validate-event"false"></el-input> </el-form-i…

【环境配置】ubuntu2204-cudnn GPG key 错误

问题: cudnn GPG error Reading package lists... Done W: GPG error: file:/var/cudnn-local-repo-ubuntu2204-8.8.0.121 InRelease: …

SAP‘s ECC6 EoL(End of Life) 支持服务声明 2027?

前言 一、EoL公告信息&#xff0c;2027&#xff1f; 二、继续使用ECC6.0的选项 1.引入第三方支持 2.S/4 HANA 3.SAP Business ByDesign 4.SAP Business One 总结 最新的公告是&#xff1a;2027年&#xff0c;SAP ECC 6.0将停止得到支持&#xff0c;并退出主流SAP支持&am…

【面试刷题】————STL中的vector是如何实现的?

STL&#xff08;Standard Template Library&#xff09;是C标准库中的一部分&#xff0c;它提供了许多常用的数据结构和算法&#xff0c;其中包括了动态数组 vector。 vector std::vector 是一个动态数组&#xff0c;它能够自动调整自己的大小&#xff0c;以适应存储元素的需…

关于3D位姿旋转

一. 主动旋转和被动旋转 1. active rotation 主动旋转 站在坐标系的位置看旋转目标物&#xff1a;目标物主动发生旋转。 2. passive rotation 被动旋转 站在旋转目标物的位置看坐标系&#xff1a; 坐标系发生旋转&#xff0c;相当于目标物在坐标系内的位置被动地发生了旋转…

c++ day1

定义一个命名空间Myspace&#xff0c;包含以下函数&#xff1a;将一个字符串中的所有单词进行反转&#xff0c;并输出反转后的结果。例如&#xff0c;输入字符串为"Hello World"&#xff0c;输出结果为"olleH dlroW"&#xff0c;并在主函数内测试该函数。 …

动态不确定性的动态S过程(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【从零开始的rust web开发之路 一】axum学习使用

系列文章目录 第一章 axum学习使用 文章目录 系列文章目录前言老规矩先看官方文档介绍高级功能兼容性 二、hello world三、路由四&#xff0c;handler和提取器五&#xff0c;响应 前言 本职java开发&#xff0c;兼架构设计。空闲时间学习了rust&#xff0c;目前还不熟练掌握。…

同步、异步无障碍:Python异步装饰器指南

一、引言 Python异步开发已经非常流行了&#xff0c;一些主流的组件像MySQL、Redis、RabbitMQ等都提供了异步的客户端&#xff0c;再处理耗时的时候不会堵塞住主线程&#xff0c;不但可以提高并发能力&#xff0c;也能减少多线程带来的cpu上下文切换以及内存资源消耗。但在业务…

Linux dd命令

Linux中的dd命令是一个强大的块级命令行工具&#xff0c;用于进行数据转换和复制操作。它可以从一个块设备或文件中读取数据&#xff0c;并将数据写入另一个块设备或文件中。dd命令的基本语法如下&#xff1a; dd ifinput_file ofoutput_file [options]以下是dd命令的一些常用…

回归预测 | MATLAB实现SSA-RF麻雀搜索优化算法优化随机森林算法多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现SSA-RF麻雀搜索优化算法优化随机森林算法多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现SSA-RF麻雀搜索优化算法优化随机森林算法多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;…

2023年国赛 高教社杯数学建模思路 - 案例:退火算法

文章目录 1 退火算法原理1.1 物理背景1.2 背后的数学模型 2 退火算法实现2.1 算法流程2.2算法实现 建模资料 ## 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 退火算法原理 1.1 物理背景 在热力学上&a…

组合总和-LeetCode

给你一个无重复元素的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的所有不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序返回这些组合。 candidates 中的同一个数字可以无限制重复被选取 。如果至少一个…

【Python】PyCharm配置外部工具

【摘要】 QT Designer配置 Designer绘制的UI文件转换成py文件 UI用到的图片资源文件转换成py文件 注意&#xff1a;使用豆瓣原安装比较快 pip install * -i http://pypi.douban.com/simple --trusted-host pypi.douban.com 1&#xff0c;File->Settings->Tools->…

手机无人直播软件,有哪些优势?

近年来&#xff0c;随着手机直播的流行和直播带货的市场越来越大&#xff0c;手机无人直播软件成为许多商家开播带货的首选。在这个领域里&#xff0c;声音人无人直播系统以其独特的优势&#xff0c;成为市场上备受瞩目的产品。接下来&#xff0c;我们将探讨手机无人直播软件给…

Office ---- excel ---- 怎么批量设置行高

解决方法&#xff1a; 调整行高即可

C# 流Stream详解(2)——FileStream、BinaryReader、MemorySream、SreamReader等之间的关系

【文件流】 电脑上的文件有很多&#xff0c;文本文件、音频文件、视频文件、图片文件等&#xff0c;这些文件会被持久化存储在磁盘上&#xff0c;其本质都是一堆二进制数据。 FileStream用于读取二进制文件。电脑上的所有文件&#xff0c;不管是文本、音频、视频还是其他任意…