背景:

使用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对象,用于将主机的目录或卷挂载到容器内的路径。

启动容器

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

停止和删除容器

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

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

Java API 操作Docker浅谈的更多相关文章

  1. MongoDB Java API操作很全的整理

    MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写,一般生产上建议以共享分片的形式来部署. 但是MongoDB官方也提供了其它语言的客户端操作API.如下图所示: 提供了C.C++ ...

  2. hive-通过Java API操作

    通过Java API操作hive,算是测试hive第三种对外接口 测试hive 服务启动 package org.admln.hive; import java.sql.SQLException; i ...

  3. hadoop2-HBase的Java API操作

    Hbase提供了丰富的Java API,以及线程池操作,下面我用线程池来展示一下使用Java API操作Hbase. 项目结构如下: 我使用的Hbase的版本是 hbase-0.98.9-hadoop ...

  4. 使用Java API操作HDFS文件系统

    使用Junit封装HFDS import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import org ...

  5. java的反射机制浅谈(转)

    原文链接:java的反射机制浅谈 一.java的反射机制浅谈 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性 ...

  6. Kafka系列三 java API操作

    使用java API操作kafka 1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs ...

  7. Hadoop之HDFS(三)HDFS的JAVA API操作

    HDFS的JAVA API操作 HDFS 在生产应用中主要是客户端的开发,其核心步骤是从 HDFS 提供的 api中构造一个 HDFS 的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS ...

  8. zookeeper的java api操作

    zookeeper的java api操作 创建会话: Zookeeper(String connectString,int sessionTimeout,Watcher watcher) Zookee ...

  9. java api操作

    java api操作 导入开发包 将hbase安装包中lib下包导入java项目   创建表   Configuration conf = HBaseConfiguration.create(); c ...

  10. HDFS 05 - HDFS 常用的 Java API 操作

    目录 0 - 配置 Hadoop 环境(Windows系统) 1 - 导入 Maven 依赖 2 - 常用类介绍 3 - 常见 API 操作 3.1 获取文件系统(重要) 3.2 创建目录.写入文件 ...

随机推荐

  1. 知识图谱(Knowledge Graph)- Neo4j 5.10.0 使用 - CQL - 太极拳传承谱系表

    删除数据库中以往的图 MATCH (n) DETACH DELETE n 创建节点 CREATE命令语法 Neo4j CQL"CREATE"命令用于创建没有属性的节点. 它只是创建 ...

  2. STM32中SWD下载不进去的解决方法

    这是我第一次写自己的博客,希望以后写博客可以当做自己的个人习惯并坚持下去,作为技术分享,也欢迎各位大佬前来指正.本人本科学习的机械电子工程,了解机械制图.嵌入式编程.目前刚好学习了PCB制板,正在向着 ...

  3. Pytorch语法——torch.autograd.grad

    The torch.autograd.grad function is a part of PyTorch's automatic differentiation package and is use ...

  4. Hadoop环境安装与配置

    1.基础操作系统环境安装(略) 2.JDK的安装与配置 当前各大数据软件如Hadoop等,仍然停留在Java 8上,在本实验选用的是Java 8.在自己的Linux系统中,jdk可以使用如下命令进行一 ...

  5. [MAUI]实现动态拖拽排序列表

    @ 目录 创建页面元素 创建可绑定对象 创建绑定服务类 拖拽(Drag) 拖拽悬停,经过(DragOver) 释放(Drop) 限流(Throttle)和防抖(Debounce) 项目地址 上一章我们 ...

  6. Linux平台Oracle 23c单实例 安装部署配置 快速参考

    转眼间已经2023年,再有一周就要过年了,在这里先给大家拜个早年,祝大家新的一年万事顺利. Oracle如今版本号也和年份挂钩,在前段时间的OCW上也宣布发布了beta版本的23c,因为23c是继19 ...

  7. Flask框架——详解URL、HTTP请求、视图函数和视图类

    文章目录 1 什么是url? 2 为什么要有url? 3 如何应用url? 3.1 url和路由的区别. 3.2 url传参的两种 3.2.1动态路由传参 3.2.1.1 动态路由的过滤 3.2.2 ...

  8. OPPO主题组件开发 - 组件内容自适应

    OPPO桌面有 3*5.3*6.4*5.4*6.5*5.5*6 等布局,随着布局不同,组件大小也会发生改变:不同型号手机分辨率不同,组件大小也不一致.这就要求组件内容做到自适应. 说明 OPPO主题组 ...

  9. C#归并排序算法

    前言 归并排序是一种常见的排序算法,它采用分治法的思想,在排序过程中不断将待排序序列分割成更小的子序列,直到每个子序列中只剩下一个元素,然后将这些子序列两两合并并排序,最终得到一个有序的序列. 归并排 ...

  10. Bridge 桥接模式简介与 C# 示例【结构型2】【设计模式来了_7】

    〇.简介 1.什么是桥接模式? 一句话解释:   通过一个类的抽象,与另一个类的抽象关联起来,当做桥.此后不管两个抽象类的实现有多少种,均可以通过这个桥来将两个对象联系起来. 桥接,顾名思义就是用桥来 ...