开启docker的守护进程
maven 包
<dependency>
<groupId>com.github.docker-java</groupId>
<artifactId>docker-java</artifactId>
<version>3.2.7</version>
</dependency>
<dependency>
<groupId>com.github.docker-java</groupId>
<artifactId>docker-java-transport-okhttp</artifactId>
<version>3.2.7</version>
</dependency>
java 实现类
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.command.CreateContainerCmd;
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.api.command.InspectContainerResponse;
import com.github.dockerjava.api.command.InspectImageResponse;
import com.github.dockerjava.api.exception.NotFoundException;
import com.github.dockerjava.api.model.ExposedPort;
import com.github.dockerjava.api.model.HostConfig;
import com.github.dockerjava.api.model.Ports;
import com.github.dockerjava.core.DefaultDockerClientConfig;
import com.github.dockerjava.core.DockerClientConfig;
import com.github.dockerjava.core.DockerClientImpl;
import com.github.dockerjava.okhttp.OkDockerHttpClient;
import com.github.dockerjava.transport.DockerHttpClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.net.URI;
import java.util.List;
@Service
@Slf4j
public class DockerApiImpl {
private DockerClient dockerClient;
@Value(value = "${docker.host}") //守护进程地址 localhost:2375
private String dockerHost;
@PostConstruct
public void connectDocker() {
URI url = null;
try{
url =new URI(dockerHost);
}catch (Exception e){
}
DockerClientConfig dockerClientConfig = DefaultDockerClientConfig
.createDefaultConfigBuilder()
.build();
DockerHttpClient httpClient = new OkDockerHttpClient.Builder()
.dockerHost(url)
.build();
dockerClient = DockerClientImpl.getInstance(dockerClientConfig, httpClient);
}
/**
* checkout is having Image,yes:create container 。 No:pull image crate container
* @param imageName
* @param containerName
* @param cmd
* @return
*/
public String createContainer(String imageName,int imagePort, String containerName, int port, List<String> cmd){
if(!checkoutHostImages(imageName)){
pullWaitImages(imageName);
}
ExposedPort tcp80 = ExposedPort.tcp(imagePort);
Ports portBindings = new Ports();
portBindings.bind(tcp80, Ports.Binding.bindPort(port));
HostConfig hostConfig = new HostConfig();
CreateContainerCmd clientContainerCmd= dockerClient.createContainerCmd(imageName);
if(cmd != null){
clientContainerCmd.withCmd(cmd);
}
CreateContainerResponse container = clientContainerCmd
.withName(containerName)
.withHostConfig(hostConfig.withPortBindings(portBindings))
.exec();
return container.getId();
}
/**
* 启动容器
* @param containerId
*/
public void startContainer(String containerId) {
dockerClient.startContainerCmd(containerId).exec();
}
/**
* 停止容器
* @param containerId
*/
public void stopContainer(String containerId) {
dockerClient.stopContainerCmd(containerId).exec();
}
/**
* 移除容器
* @param containerId
*/
public void removeContainer(String containerId) {
dockerClient.removeContainerCmd(containerId).exec();
}
/**
* 检查本地是否存在镜像
* @param imageName
* @return
*/
public Boolean checkoutHostImages(String imageName) {
InspectImageResponse obj=null;
try {
obj = dockerClient.inspectImageCmd(imageName).exec();
}catch (NotFoundException e){
return false;
}
if(obj == null){
return false;
}
return true;
}
/**
* 等待拉取镜像完成
* @param imageName
*/
public void pullWaitImages(String imageName) {
if(!checkoutHostImages(imageName)){
pullImages(imageName);
while(true){
if(checkoutHostImages(imageName)){
break;
}
}
}
}
/**
* 拉取镜像
* @param imageName
*/
public void pullImages(String imageName) {
dockerClient.pullImageCmd(imageName).start();
}
/**
* 容器状态
* @param containerId
* @return
*/
public InspectContainerResponse.ContainerState inspectContainerStatus(String containerId) {
InspectContainerResponse response = dockerClient.inspectContainerCmd(containerId).exec();
return response.getState();
}
}