前言

看到标题可能有些人会问,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>

地址:https://github.com/docker-java/docker-java

  • 引入之后通过该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;
    }
}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐