Java API 操作Docker浅谈

背景:

使用com.github.docker-java库可以很方便地在Java中操作Docker。下面是一个详细的教程,包括创建镜像、创建容器、启动容器、停止容器和删除容器的步骤以及每一步的说明。

前提:

首先,在你的Java项目中添加com.github.docker-java库的依赖。你可以在你的构建工具(如Maven或Gradle)的配置文件中添加以下依赖项:

<dependency>

    <groupId>com.github.docker-java</groupId>

    <artifactId>docker-java</artifactId>

    <version>3.2.5</version>

</dependency>

创建Docker客户端

import com.github.dockerjava.api.DockerClient;

import com.github.dockerjava.api.DockerClientBuilder;

DockerClient dockerClient = DockerClientBuilder.getInstance()

        .withDockerHost("tcp://localhost:2375")

        .withDockerCertPath("/path/to/cert")

        .withApiVersion("1.41")

        .build();

通过withDockerHost()方法设置了Docker守护进程的连接地址,withDockerCertPath()方法设置了TLS证书的路径,withApiVersion()方法设置了Docker API的版本。最后,通过调用build()方法构建了一个DockerClient对象。

  1. DockerClientBuilder类是用于构建和配置DockerClient对象的构建器类。它提供了一组方法,用于设置与Docker守护进程通信所需的参数和配置。

  2. getInstance()DockerClientBuilder类的静态方法。通过调用该方法,可以获取DockerClientBuilder的单例实例。

  3. DockerClientBuilder使用单例模式的设计,主要是为了提供对Docker守护进程的访问的全局共享实例。这样可以避免重复创建和销毁DockerClientBuilder实例,提高了性能和效率。

  4. 使用DockerClientBuilder.getInstance()方法获取DockerClientBuilder的实例后,可以通过该实例进行链式调用,设置各种与Docker守护进程通信相关的参数和配置。

  5. 通过链式调用DockerClientBuilder的方法,可以设置例如Docker守护进程的连接地址、认证信息、超时时间、TLS配置等。这些方法包括withDockerHost()withDockerCertPath()withDockerConfig()withApiVersion()等。

  6. 最后,通过调用build()方法,可以构建出一个DockerClient对象,用于与Docker守护进程进行交互。该对象可以执行各种Docker操作,如创建容器、启动容器、构建镜像等。

创建镜像

import com.github.dockerjava.api.command.BuildImageResultCallback;

String dockerfilePath = "/path/to/dockerfile";

String imageName = "my-image";

String imageTag = "latest";

dockerClient.buildImageCmd()

    .withDockerfile(new File(dockerfilePath))

    .withTags(Collections.singleton(imageName + ":" + imageTag))

    .exec(new BuildImageResultCallback())

    .awaitCompletion();

  • withDockerfile(new File(dockerfilePath)):指定Dockerfile的路径,用于构建镜像。
  • withTags(Collections.singleton(imageName + ":" + imageTag)):指定镜像的标签。可以通过withTags方法传递一个包含镜像标签的集合,这里使用Collections.singleton()方法创建一个只包含一个元素的集合 
  • withBaseDirectory(baseDirectory):设置基础目录,该目录中包含了构建镜像所需的所有文件。与withDockerfile()一起使用时,会自动将基础目录中的Dockerfile关联到构建命令中。
  • withNoCache():禁用缓存,每次构建镜像时都会重新执行所有命令,确保使用最新的文件和依赖项。
  • withPull(pull):指定是否应该在构建之前拉取最新的基础镜像,默认为false,即不拉取。
  • withQuiet():设置静默模式,不输出构建镜像的日志信息。
  • withBuildArg(buildArg):使用Map<String, String>类型的参数设置构建参数。键值对表示构建参数的名称和值。
  • withLabels(labels):使用Map<String, String>类型的参数设置镜像的标签。键值对表示标签的键和值。
  • withBuildArgs(buildArgs):使用Map<String, String>类型的参数设置构建参数。与withBuildArg()类似,但可以一次设置多个构建参数。
  • withPull():设置是否应该在构建之前拉取最新的基础镜像。
  • withProgressHandler(progressHandler):设置用于处理构建镜像进度的ProgressHandler

创建容器

import com.github.dockerjava.api.command.CreateContainerResponse;

import com.github.dockerjava.api.model.Bind;

import com.github.dockerjava.api.model.PortBinding;

import com.github.dockerjava.api.model.Volume;

String imageName = "my-image";

String containerName = "my-container";

int hostPort = 8080;

int containerPort = 80;

String volumeHostPath = "/host/path";

String volumeContainerPath = "/container/path";

CreateContainerResponse container = dockerClient.createContainerCmd(imageName)

    .withName(containerName)

    .withPortBindings(new PortBinding(

        new Binding(null, null, hostPort),

        new ExposedPort(containerPort)))

    .withBinds(new Bind(volumeHostPath, new Volume(volumeContainerPath)))

    .exec();

在上述代码中,imageName表示要使用的镜像的名称,containerName表示要创建的容器的名称。hostPortcontainerPort分别表示主机端口和容器端口,用于进行端口映射。volumeHostPathvolumeContainerPath表示主机路径和容器路径,用于挂载卷。其中,CreateContainerResponse对象,包含了有关新创建容器的信息,比如容器的ID、名称等。以便接下来的启动停止容器等操作

  • withName(containerName):为容器指定一个名称。
  • withPortBindings(portBindings):指定容器的端口绑定。portBindings是一个PortBinding对象,用于将主机端口映射到容器内的端口。
  • withBinds(bindings):指定容器的卷绑定。bindings是一个Bind对象,用于将主机的目录或卷挂载到容器内的路径。

启动容器

1

dockerClient.startContainerCmd(container.getId()).exec();

停止和删除容器

dockerClient.stopContainerCmd(container.getId()).exec();

dockerClient.removeContainerCmd(container.getId()).exec();

在上述代码中,container.getId()获取到的是容器的ID。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

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

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

相关文章

P8598 [蓝桥杯 2013 省 AB] 错误票据

题目背景 某涉密单位下发了某种票据&#xff0c;并要在年终全部收回。 题目描述 每张票据有唯一的 ID 号&#xff0c;全年所有票据的 ID 号是连续的&#xff0c;但 ID 的开始数码是随机选定的。因为工作人员疏忽&#xff0c;在录入 ID 号的时候发生了一处错误&#xff0c;造…

LLM、AGI、多模态AI 篇二:Prompt编写技巧

文章目录 系列生成图片(Stable Diffusion)生成文章(ChatGPT)代码生成(GitHub Copilot)Prompt编写模式Prompt模板Prompt 即代码系列 LLM、AGI、多模态AI 篇一:开源大语言模型简记 LLM、AGI、多模态AI 篇二:Prompt编写技巧 生成图片(Stable Diffusion) 视角和构图。 …

Linux之组管理和权限管理

组的概念 如图所示&#xff1a;test.txt是由tom创建的&#xff0c;所以tom是文件的所有者&#xff0c;tom归属于组A&#xff0c;组A就是文件的所在组&#xff1b;组B就是文件的其他组。 所有者 谁创建了文件&#xff0c;谁就是文件的所有者。 查看文件的所有者 指令&…

2024 计划

学习 brpc源码 netty源码 ace源码 《Javascript高级程序设计》 《《Full-stack web development with Vue.js and Node build scalable and powerful web apps with modern web stack, MongoDB, Vue, Node.js, and Express》&#xff08;之前没有看完&#xff09; 生活 每周…

Django 学习教程- Hello world入门案例

系列 Django 学习教程-介绍与安装-CSDN博客 欢迎来到第Djagno学习教程第二章Hello World 入门案例。 在本教程中&#xff0c;我将引导您完成django的Hello World入门案例。 让我们开始吧&#xff01; 版本 Django 5.0Python 3.10 创建项目 安装 Django 之后&#xff0…

信创之国产浪潮电脑+统信UOS Linux操作系统体验10:visual studio code中调试C++程序

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、引言 老猿在CSDN的《信创之国产浪潮电脑统信UOS操作系统体验2&#xff1a;安装visual studio code和cmake搭建C开发环镜》介绍了在国产浪潮电脑统信UOS操作系统中安装visual studio code和cmake搭建C开…

css动态传参,attr的妙用

今天再做一个编辑器的功能的时候&#xff0c;发现有一段非常奇妙的代码&#xff0c;使用attr获取div标签的data-label值。 css的attr?What fuck?这又是什么鬼东西&#xff0c;emmm。 查询后官方是这么回答的&#xff1a; CSS 表达式 attr() 用来获取选择到的元素的某一 HTM…

GO语言基础笔记(八):高级特性与性能优化

目录 反射&#xff08;Reflection&#xff09; 反射概念 反射的关键概念 反射的常见用途 代码示例 1. 检查类型和值 2. 修改变量值 3. 调用函数 4. 结构体反射 并发模式&#xff08;Concurrency Patterns&#xff09; 1. Worker Pool 模式 工作原理 在代码中的体现…

Mybatis插件运行原理及自定义插件

引言 MyBatis是一个流行的持久层框架&#xff0c;它提供了许多强大的功能来简化数据库访问和映射。其中一个非常重要的特性是插件&#xff08;Interceptor&#xff09;&#xff0c;它允许开发者在MyBatis的执行过程中插入自定义逻辑&#xff0c;以实现对SQL执行过程的定制化。…

Unity坦克大战开发全流程——结束场景——通关界面

结束场景——通关界面 就照着这样来拼 写代码 hideme不要忘了 修改上一节课中的代码

django/springboot后台+vue/js前端设计一款高校毕业生就业方向统计管理系统及可视化大屏

项目设计目的&#xff1a; 设计一款高校毕业生就业方向统计管理系统及可视化大屏&#xff0c;旨在为高校提供一个方便、高效的毕业生就业数据管理平台&#xff0c;帮助学校更好地了解毕业生的就业情况和就业方向&#xff0c;以便进行教育和就业指导。 功能需求&#xff1a; 用…

SpringBoot入门到精通-使用Jasypt对数据库账号密码加解密

引用代码库 <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version></dependency> 配置启动 EnableEncryptableProperties public class Ce…

动态内存管理篇

为什么要动态内存分配&#xff1f; 之前&#xff0c;我们向内存申请空间&#xff0c;有两种方式&#xff0c;一种是定义变量&#xff0c;一种是建立数组&#xff1b;但是&#xff0c;这两种方式都有缺陷&#xff0c;创建的空间大小是固定的&#xff0c;在程序的运行过程中&…

买对好车省钱又防坑,高性价比的买车攻略

一、教程描述 正所谓隔行如隔山&#xff0c;买车这件事情并不简单&#xff0c;买车的内幕还是有不少的&#xff0c;本套教程讲述买车攻略&#xff0c;非常适合准备买车的朋友&#xff0c;可以帮助大家买车少入坑&#xff0c;高性价比买到自己心仪的车。本套买车教程&#xff0…

2023-12-23 LeetCode每日一题(移除石子使总数最小)

2023-12-23每日一题 一、题目编号 1962. 移除石子使总数最小二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数数组 piles &#xff0c;数组 下标从 0 开始 &#xff0c;其中 piles[i] 表示第 i 堆石子中的石子数量。另给你一个整数 k &#xff0c;请你执行下述…

chromium通信系统-ipcz系统(七)-ipcz系统代码实现-跨Node通信-NonBroker和NonBroker通信

在chromium通信系统-ipcz系统(六)-ipcz系统代码实现-跨Node通信-基础通信 一文中我们分析了broker 和 nonbroker 通信的过程。本文我们来分析NonBroker 和NonBroker的通信过程&#xff0c;同样以单元测试为例子分析。 mojo/core/invitation_unittest.cc 951 DEFINE_TEST_CLIEN…

面试算法:快速排序

题目 快速排序是一种非常高效的算法&#xff0c;从其名字可以看出这种排序算法最大的特点就是快。当表现良好时&#xff0c;快速排序的速度比其他主要对手&#xff08;如归并排序&#xff09;快2&#xff5e;3倍。 分析 快速排序的基本思想是分治法&#xff0c;排序过程如下…

Python期末复习资料

一、基础知识点 1. Python基础语法 变量与数据类型 定义变量&#xff0c;理解变量的命名规则基本数据类型&#xff1a;整数、浮点数、字符串列表、元组、字典、集合等复合数据类型 1. 1 变量 1.1.1 变量的定义 在Python中&#xff0c;变量是用来存储数据值的标识符。你可…

.Net8 新特性之键控服务-依赖注入一对多模式

在.NET8 中引入了KeyedService支持&#xff0c;这使得可以支持一对多的依赖注入了。在官方&#xff0c;这个功能叫键化DI服务。 什么是键化DI服务&#xff1f;官方解释是这样的&#xff0c;键化依赖项注入&#xff08;DI&#xff09;服务提供了一种适用键来注册和检索DI服务的…

【随口一说】最近的CSDN

这段时间随便发的一篇博文很快就有“点赞”、“收藏”、“关注”的信息&#xff0c; 而且简单看了一眼用户&#xff0c;很多都是空的或者一堆转载&#xff0c; 机器人也太明显了点&#xff0c;很让人不舒服&#xff0c; 不花点心思设计文章评优推送算法反倒用机器人刷热门&…