spring项目操作docker
前言看到标题可能有些人会问,spring操作容器有什么用途?那么请问容器有什么用途?1.容器可以用来部署启动服务,一般服务相关都是运维通过脚本来操作的,而非用springboot2.所以springboot可以操作容器,就形成了接口调用的形式来对容器进行相关操作,岂不是很方便那些场景需要用到spring操作容器?例如:容器化的分布式压测平台,如果可以通过spring服务远程接口调用形式操作容器,那
·
前言
看到标题可能有些人会问,spring操作容器有什么用途?那么请问容器有什么用途?
1.容器可以用来部署启动服务,一般服务相关都是运维通过脚本来操作的,而非用springboot
2.所以springboot可以操作容器,就形成了接口调用的形式来对容器进行相关操作,岂不是很方便
那些场景需要用到spring操作容器?
例如:容器化的分布式压测平台,如果可以通过spring服务远程接口调用形式操作容器,那就可以对容器资源进行“即插即用”这样资源可以得到最大效率的可控性
例如:有些大公司都有自己的发布系统,容器服务的发布系统就可以通过spring服务来进行操作
如何操作容器
- 首先spring项目maven引入docker提供的开源组件依赖包
<dependency>
<groupId>com.github.docker-java</groupId>
<artifactId>docker-java</artifactId>
<version>3.2.0</version>
</dependency>
- 引入之后通过该jar提供的API
DockerClient
来对容器进行相关操作,常用方法:容器的创建、启动、关闭、删除
//连接docker,也就是获取DockerClient客户端
DockerClient dockerClient = DockerClientBuilder.getInstance().build(); //底层初始化见下图
//获取到DockerClient客户端对象后进行容器创建,imageName为容器名称,一般容器创建需要设值很多参数
CreateContainerResponse container = dockerClient.createContainerCmd(imageName)
.withName(containerName) //设值容器名
.withHostConfig(hostConfig) //添加容器host配置
.withCmd()
.withEnv(envs) //设值环境变量
.exec(); //最终执行
//最后终端命令展现形式
docker run -d -e "envs" --name containerName imageName
//创建容器之后,启动容器
//创建容器获取的CreateContainerResponse对象可以获取容器ID
dockerClient.startContainerCmd(containerId).exec(); //只需将容器ID传入就行
//停止容器,只是停止容器服务,容器还是存在;等同于终端命令:docker stop + containerId
dockerClient.stopContainerCmd(containerId);
//移除容器,等同于终端命令:docker rm + containerId
dockerClient.removeContainerCmd(containerId)
.withForce(true)
.withRemoveVolumes(true)
.exec();
- spring项目对docker封装的API、仅供参考
@Service
@Slf4j
public class DockerClientServiceImpl implements DockerClientService {
/**
* 连接docker服务器
*
* @return
*/
@Override
public DockerClient connectDocker() {
DockerClient dockerClient = DockerClientBuilder.getInstance().build();
return dockerClient;
}
/**
* 启动容器
*
* @param dockerClient
* @param containerId
*/
@Override
public void startContainer(DockerClient dockerClient, String containerId) {
dockerClient.startContainerCmd(containerId).exec();
}
/**
* 关闭容器
*
* @param dockerClient
* @param containerId
*/
@Override
public void stopContainer(DockerClient dockerClient, String containerId) {
dockerClient.stopContainerCmd(containerId);
}
/**
* 移除容器
*
* @param dockerClient
* @param containerId
*/
@Override
public void removeContainer(DockerClient dockerClient, String containerId) {
dockerClient.removeContainerCmd(containerId)
.withForce(true)
.withRemoveVolumes(true)
.exec();
}
/**
* 创建容器
*
* @param dockerClient
*/
@Override
public CreateContainerResponse createContainer(DockerClient dockerClient, String containerName, String imageName,
HostConfig hostConfig, List<String> envs) {
CreateContainerResponse container = dockerClient.createContainerCmd(imageName)
.withName(containerName)
.withHostConfig(hostConfig)
.withCmd()
.withEnv(envs)
.exec();
return container;
}
/**
* 容器是否存在
*
* @param dockerClient
* @param containerId
* @return
*/
@Override
public Boolean existContainer(DockerClient dockerClient, String containerId) {
List<Container> list = dockerClient.listContainersCmd()
.withShowAll(true)
.withIdFilter(Collections.singleton(containerId))
.exec();
return list.size() > 0 ? true : false;
}
}
更多推荐
已为社区贡献2条内容
所有评论(0)