準備条件
ポート 2375 が有効になっていることを確認します。有効になっていない場合は、次の手順に従って有効にします。
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 が依存関係を追加する
次の依存関係を POM に追加します。
<!-- 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>
ここではバージョン 3.2.13 を使用します。バージョンは自分で選択できます。バージョンが異なると記述方法も異なる場合があります。
書き込みツールクラス
DockerUtils クラスを作成します。
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
}
次にDockerの操作方法ですが、より直感的にするために一緒に書かずリージョンブロック内に書きます
コンテナを作成する
/**
* 创建容器
* @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();
}
フルコードのプレゼント
こう書いてみると、全く書き方が分からない人もいると思うので、書いておきます。
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();
}
}
エピローグ
APIには多くの操作がありますが、基本的な操作を学習した後、その他の操作も統合されることが予想されますので、ニーズに合わせて調整してみましょう。