• 使用com.github.docker-java库操作Docker步骤详解
  • 发布于 2个月前
  • 158 热度
    0 评论
  • 雾月
  • 0 粉丝 24 篇博客
  •   
背景:
使用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";
 // 堆代码 duidaima.com
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。
用户评论