준비 조건
포트 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
}
다음은 도커 운용 방법인데 좀 더 직관적으로 하기 위해 같이 쓰지 않고 그냥 region 블록에 쓰도록 하겠습니다.
컨테이너 만들기
/**
* 创建容器
* @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에는 많은 작업이 있습니다. 기본 작업을 공부한 후 나머지 작업은 통합될 것으로 예상됩니다. 필요에 따라 일치시키겠습니다.