Vorbereitungsbedingungen
Stellen Sie sicher, dass Port 2375 aktiviert ist. Wenn nicht, führen Sie die folgenden Schritte aus, um ihn zu aktivieren:
vim /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
Maven fügt Abhängigkeiten hinzu
Fügen Sie dem POM die folgenden Abhängigkeiten hinzu:
<!-- https://mvnrepository.com/artifact/com.github.docker-java/docker-java -->
<dependency>
<groupId>com.github.docker-java</groupId>
<artifactId>docker-java</artifactId>
<version>3.2.13</version>
</dependency>
Hier kommt die Version 3.2.13 zum Einsatz. Sie können die Version selbst wählen. Verschiedene Versionen können unterschiedlich geschrieben sein.
Werkzeugklasse schreiben
Erstellen Sie die DockerUtils-Klasse:
public class DockerUtils {
// 定义dockerClient操作docker
private DockerClient dockerClient;
// 重新定义无参构造函数,初始化dockerCilent
DockerUtils(){
dockerClient = DockerClientBuilder.getInstance(DefaultDockerClientConfig.createDefaultConfigBuilder()
.withDockerHost("tcp://x.x.x.x:2375").build()).build();
}
// 或直接如下写法,这个版本如下方法已被弃用,不推荐,但是可以用
/*
DockerUtils(){
dockerClient = DockerClientBuilder.getInstance("tcp://x.x.x.x:2375").build();
}
*/
// region 编写操作Docker的方法
...
// endregion
}
Als nächstes folgt die Methode zur Bedienung von Docker. Um intuitiver zu sein, wird es nicht zusammengeschrieben, sondern einfach in den Regionsblock geschrieben
Container erstellen
/**
* 创建容器
* @param iamgeName 镜像名称
* @param portMap 端口映射Map,key是hostPort,value是containerPort
* @return 创建完的容器
*/
public CreateContainerResponse createCon(String iamgeName, Map<String,Port> portMap) {
// 创建容器需要使用的命令
CreateContainerCmd ccm = dockerClient.createContainerCmd(iamgeName);
// 封装端口映射
List<PortBinding> list = new ArrayList<>();
for (String hostPort : portMap.keySet()) {
// 暴露端口
ccm = ccm.withExposedPorts(ExposedPort.parse(portMap.get(hostPort) + "/tcp"));
// 绑定主机端⼝ -> docker容器端⼝
list.add(PortBinding.parse(hostPort + ":" + portMap.get(hostPort)));
}
HostConfig hostConfig = HostConfig.newHostConfig()
.withPortBindings(list);
// 执行创建命令
CreateContainerResponse container = ccm
.withHostConfig(hostConfig)
.exec();
return container;
}
Grundlegende Containeroperationen
/**
* 开启容器
* @param id 容器ID
*/
public void startCon(String id) {
dockerClient.startContainerCmd(id).exec();
}
/**
* 关闭容器
* @param id 容器ID
*/
public void stopCon(String id) {
dockerClient.stopContainerCmd(id).exec();
}
/**
* 暂停容器
* @param id 容器ID
*/
public void pauseCon(String id) {
dockerClient.pauseContainerCmd(id).exec();
}
/**
* 重启容器
* @param id 容器ID
*/
public void restartCon(String id) {
dockerClient.restartContainerCmd(id).exec();
}
Container löschen
/**
* 删除容器
* @param id 容器ID
*/
public void startCon(String id) {
// 删除之前请先调用关闭方法关闭容器!!!!!
DockerClient dockerClientByIp = DockerClientBuilder.getInstance("tcp://" + hostip + ":2375").build();
dockerClientByIp.startContainerCmd(id).exec();
}
Speichern Sie den Container als Bild
/**
* docker容器commit为镜像
* @param containerID 容器id
* @param rep 镜像的仓库,就相当于【ubuntu:latest】中的【ubuntu】
* @param tag 镜像的标签,就相当于【ubuntu:latest】中的【latest】
* @return
*/
public void createImageByContainer(String containerID, String rep, String tag) throws Exception{
dockerClientByIp.commitCmd(containerID).withRepository(rep).withTag(tag).exec();
}
Vollständiger Code zum Verschenken
Nachdem ich dies geschrieben habe, befürchte ich, dass einige Leute nicht wissen, wie man es vollständig schreibt, also werde ich es aufschreiben.
public class DockerUtils {
// 定义dockerClient操作docker
private DockerClient dockerClient;
// 重新定义无参构造函数,初始化dockerCilent
DockerUtils(){
dockerClient = DockerClientBuilder.getInstance(DefaultDockerClientConfig.createDefaultConfigBuilder()
.withDockerHost("tcp://x.x.x.x:2375").build()).build();
}
// 或直接如下写法,这个版本如下方法已被弃用,不推荐,但是可以用
/*
DockerUtils(){
dockerClient = DockerClientBuilder.getInstance("tcp://x.x.x.x:2375").build();
}
*/
/**
* 创建容器
* @param iamgeName 镜像名称
* @param portMap 端口映射Map,key是hostPort,value是containerPort
* @return 创建完的容器
*/
public CreateContainerResponse createCon(String iamgeName, Map<String,Port> portMap) {
// 创建容器需要使用的命令
CreateContainerCmd ccm = dockerClient.createContainerCmd(iamgeName);
// 封装端口映射
List<PortBinding> list = new ArrayList<>();
for (String hostPort : portMap.keySet()) {
// 暴露端口
ccm = ccm.withExposedPorts(ExposedPort.parse(portMap.get(hostPort) + "/tcp"));
// 绑定主机端⼝ -> docker容器端⼝
list.add(PortBinding.parse(hostPort + ":" + portMap.get(hostPort)));
}
HostConfig hostConfig = HostConfig.newHostConfig()
.withPortBindings(list);
// 执行创建命令
CreateContainerResponse container = ccm
.withHostConfig(hostConfig)
.exec();
return container;
}
/**
* 开启容器
* @param id 容器ID
*/
public void startCon(String id) {
dockerClient.startContainerCmd(id).exec();
}
/**
* 关闭容器
* @param id 容器ID
*/
public void stopCon(String id) {
dockerClient.stopContainerCmd(id).exec();
}
/**
* 暂停容器
* @param id 容器ID
*/
public void pauseCon(String id) {
dockerClient.pauseContainerCmd(id).exec();
}
/**
* 重启容器
* @param id 容器ID
*/
public void restartCon(String id) {
dockerClient.restartContainerCmd(id).exec();
}
/**
* 删除容器
* @param id 容器ID
*/
public void startCon(String id) {
// 删除之前请先调用关闭方法关闭容器!!!!!
DockerClient dockerClientByIp = DockerClientBuilder.getInstance("tcp://" + hostip + ":2375").build();
dockerClientByIp.startContainerCmd(id).exec();
}/**
* docker容器commit为镜像
* @param containerID 容器id
* @param rep 镜像的仓库,就相当于【ubuntu:latest】中的【ubuntu】
* @param tag 镜像的标签,就相当于【ubuntu:latest】中的【latest】
* @return
*/
public void createImageByContainer(String containerID, String rep, String tag) throws Exception{
dockerClientByIp.commitCmd(containerID).withRepository(rep).withTag(tag).exec();
}
}
Epilog
Es gibt viele Operationen in der API. Nach dem Studium der Grundoperationen wird geschätzt, dass die anderen integriert werden. Lassen Sie uns sie entsprechend den Anforderungen anpassen.