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
对象。
DockerClientBuilder
类是用于构建和配置DockerClient
对象的构建器类。它提供了一组方法,用于设置与Docker守护进程通信所需的参数和配置。getInstance()
是DockerClientBuilder
类的静态方法。通过调用该方法,可以获取DockerClientBuilder
的单例实例。DockerClientBuilder
使用单例模式的设计,主要是为了提供对Docker守护进程的访问的全局共享实例。这样可以避免重复创建和销毁DockerClientBuilder
实例,提高了性能和效率。使用
DockerClientBuilder.getInstance()
方法获取DockerClientBuilder
的实例后,可以通过该实例进行链式调用,设置各种与Docker守护进程通信相关的参数和配置。通过链式调用
DockerClientBuilder
的方法,可以设置例如Docker守护进程的连接地址、认证信息、超时时间、TLS配置等。这些方法包括withDockerHost()
、withDockerCertPath()
、withDockerConfig()
、withApiVersion()
等。最后,通过调用
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
表示要创建的容器的名称。hostPort
和containerPort
分别表示主机端口和容器端口,用于进行端口映射。volumeHostPath
和volumeContainerPath
表示主机路径和容器路径,用于挂载卷。其中,CreateContainerResponse
对象,包含了有关新创建容器的信息,比如容器的ID、名称等。以便接下来的启动停止容器等操作
withName(containerName)
:为容器指定一个名称。withPortBindings(portBindings)
:指定容器的端口绑定。portBindings
是一个PortBinding
对象,用于将主机端口映射到容器内的端口。withBinds(bindings)
:指定容器的卷绑定。bindings
是一个Bind
对象,用于将主机的目录或卷挂载到容器内的路径。
启动容器
dockerClient.startContainerCmd(container.getId()).exec();
停止和删除容器
dockerClient.stopContainerCmd(container.getId()).exec();
dockerClient.removeContainerCmd(container.getId()).exec();
在上述代码中,container.getId()
获取到的是容器的ID。
Java API 操作Docker浅谈的更多相关文章
- MongoDB Java API操作很全的整理
MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写,一般生产上建议以共享分片的形式来部署. 但是MongoDB官方也提供了其它语言的客户端操作API.如下图所示: 提供了C.C++ ...
- hive-通过Java API操作
通过Java API操作hive,算是测试hive第三种对外接口 测试hive 服务启动 package org.admln.hive; import java.sql.SQLException; i ...
- hadoop2-HBase的Java API操作
Hbase提供了丰富的Java API,以及线程池操作,下面我用线程池来展示一下使用Java API操作Hbase. 项目结构如下: 我使用的Hbase的版本是 hbase-0.98.9-hadoop ...
- 使用Java API操作HDFS文件系统
使用Junit封装HFDS import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import org ...
- java的反射机制浅谈(转)
原文链接:java的反射机制浅谈 一.java的反射机制浅谈 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...
- Kafka系列三 java API操作
使用java API操作kafka 1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs ...
- Hadoop之HDFS(三)HDFS的JAVA API操作
HDFS的JAVA API操作 HDFS 在生产应用中主要是客户端的开发,其核心步骤是从 HDFS 提供的 api中构造一个 HDFS 的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS ...
- zookeeper的java api操作
zookeeper的java api操作 创建会话: Zookeeper(String connectString,int sessionTimeout,Watcher watcher) Zookee ...
- java api操作
java api操作 导入开发包 将hbase安装包中lib下包导入java项目 创建表 Configuration conf = HBaseConfiguration.create(); c ...
- HDFS 05 - HDFS 常用的 Java API 操作
目录 0 - 配置 Hadoop 环境(Windows系统) 1 - 导入 Maven 依赖 2 - 常用类介绍 3 - 常见 API 操作 3.1 获取文件系统(重要) 3.2 创建目录.写入文件 ...
随机推荐
- 《Linux基础》06. 进程管理 · 服务管理
@ 目录 1:进程管理 1.1:查看进程 1.1.1:ps 1.1.2:pstree 1.1.3:top 1.2:终止进程 1.2.1:kill 1.2.2:killall 2:服务管理 2.1:运行 ...
- 文心一言 VS 讯飞星火 VS chatgpt (85)-- 算法导论8.2 2题
二.用go语言,试证明 COUNTING-SORT 是稳定的. 文心一言: 要证明 COUNTING-SORT 是稳定的,我们需要证明在排序过程中,具有相同值的元素在排序后仍保持其原始的相对顺序.CO ...
- DeferredResult异步处理spring mvc Demo
一.概述 spring mvc同步接口在请求处理过程中一直处于阻塞状态,而异步接口可以启用后台线程去处理耗时任务.简单来说适用场景: 1.高并发: 2.高IO耗时操作. 二.Demo Spring M ...
- 领域驱动设计(DDD):DDD落地问题和一些解决方法
欢迎继续关注本系列文章,下面我们继续讲解下DDD在实战落地时候,会具体碰到哪些问题,以及解决的方式有哪些. DDD 是一种思想,主要知道我们方向,具体如何做,需要我们根据业务场景具体问题具体分析. 充 ...
- Solution Set -「CF 1486」
「CF 1486A」Shifting Stacks Link. 考虑最少需要操作多少次后判断. #include<map> #include<cstdio> using nam ...
- 9.1 运用API创建多线程
在Windows平台下创建多线程有两种方式,读者可以使用CreateThread函数,或者使用beginthreadex函数均可,两者虽然都可以用于创建多线程环境,但还是存在一些差异的,首先Creat ...
- 【ASP.NET Core】在 Mini-API 中注入服务
经过版本更新,Mini API 的功能逐步完善,早期支持得不太好的 mini API 现在许多特性都可以用了,比如灰常重要的依赖注入. 咱们先来个相当简单的注入测试.来,定义一个服务类,为了偷懒,老周 ...
- ai绘画提示词
(Drunken with Lights and Swords: 1.8), (Outdoor: 1.8), (Bust Close-up: 2.9), (solo: 3.8), 1 ancient ...
- GeoServer发布影像WMTS服务
WMTS提供了一种采用预定义图块方法发布数字地图服务的标准化解决方案. WMTS: 切片地图web服务(OpenGIS Web Map Tile Service) 使用GeoServer发布WMTS服 ...
- 2020/4/27 日常补坑-tarjan第一道awa
第一题 luoguP1407 我们已知n对夫妻的婚姻状况,称第i对夫妻的男方为Bi,女方为Gi.若某男Bi与某女Gj曾经交往过(无论是大学,高中,亦或是幼儿园阶段,i≠j),则当某方与其配偶(即Bi与 ...