spotify.docker.client 8.9.0版本的使用(java)

在网上找了很久,始终没有找到很好的博客。通过我的慢慢摸索,终于写出一点点的代码,一些使用的小例子。

我们可以在文档上面找到api的介绍和使用。https://www.javadoc.io/doc/com.spotify/docker-client/8.9.0/com/spotify/docker/client/DockerClient.html

首先我们需要将docker主机上面的端口暴露出来。

进入docker服务器,修改配置文件

vi /lib/systemd/system/docker.service
找到ExecStart 开头的配置,注释原配置 进行备份 插入的信息是-H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
保存和重启docker服务
systemctl daemon-reload
service docker restart

当我们可以正常访问docker主机ip:你暴露的端口,说明你正常开放了这一个端口。

接下来我们引入一些依赖

<dependency>
            <groupId>com.spotify</groupId>
            <artifactId>docker-client</artifactId>
            <version>8.9.0</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-client</artifactId>
            <version>2.22</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-common</artifactId>
            <version>2.22</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-jaxb</artifactId>
            <version>2.22</version>
        </dependency>

接下来就是一些使用的代码

下面的函数是创建一个dockerClient客户端

// CONTINUE_TIMEOUT_MILLIS 自己设置,我这里设置的是10000L
public static DefaultDockerClient getDockerClient(String hostPath,String port) throws Exception {
        if(StringUtils.isBlank(port)){
            port = DEAFUOLT_PORT;
        }
        DefaultDockerClient dockerClient;

        try {
            dockerClient = DefaultDockerClient.builder().connectTimeoutMillis(CONTINUE_TIMEOUT_MILLIS).uri(URI.create("http://"+hostPath+":"+port)).build();
        }
        catch (Exception e){
            LOGGER.error("NE1001",e.getMessage());
            throw new Exception("NE1001");

        }
        return dockerClient;
    }

下面是一些使用的函数例子

        final DockerClient docker = getDockerClient("218.0.52.69", "2375");

   
        // 查询容器列表  无参是查询正在run的容器信息
        final List<Container> containers = docker.listContainers(DockerClient.ListContainersParam.allContainers());
        for (int i = 0; i <containers.size() ; i++) {
            System.out.println(containers.get(i));
        }
        
        
        final List<Container> containers = docker.listContainers();

        // 启动容器
        docker.startContainer("nostalgic_ramanujan");

        // 停止容器
        docker.stopContainer("bi_system",10);

        // 查看容器信息
        final ContainerInfo info = docker.inspectContainer("fb71b7aa54da");
        System.out.println(info.toString());

        // 查询newtork列表信息
        List<Network> networks = docker.listNetworks();
        for (int i = 0; i < networks.size(); i++) {
            System.out.println(networks.get(i));
        }

创建指定network的容器

 // 获取指定名称的网络
        Network network = docker.listNetworks().stream()
                .filter(n -> "myuser-0".equals(n.name()))
                .findFirst()
                .orElseThrow(() -> new RuntimeException("Network not found"));


        // 配置容器
        ContainerConfig containerConfig = ContainerConfig.builder()
                .image("ubuntu:18.04").cmd("bash").tty(true)
                .hostConfig(HostConfig.builder()
                        .networkMode(network.name())
                        .build())
                .build();

        // 创建容器,并将其加入到指定网络
        ContainerCreation container = docker.createContainer(containerConfig,"test");

创建指定网段的network ,这个方法需要subnet,IpRange,Gatway,请正确的填写。

        String subnet = Subnet ; // 子网地址
        String networkName = NetworkName + "-" + index; // 网络名称


        DockerClient docker = getDockerClient(hostPath, port);

        final Iterable<Network> networks = docker.listNetworks();

        // Iterate through the list of networks and check if the network with the given name exists
        boolean networkExists = false;
        for (Network network : networks) {
            if (network.name().equals(networkName)) {
                networkExists = true;
                System.out.println("重新输入名称");
                return;
            }
        }

        List<IpamConfig> ipamConfigs = new LinkedList<>();
        IpamConfig ss = IpamConfig.create(subnet,IpRange,Gatway);
        System.out.println(ss);
        ipamConfigs.add(ss);
        try {
            final NetworkConfig networkConfig = NetworkConfig.builder()
                    .name(networkName)
                    .driver("bridge")
                    .ipam(Ipam.create("default",ipamConfigs))
                    .build();
            final NetworkCreation creation = docker.createNetwork(networkConfig);
            final Network network = docker.inspectNetwork(creation.id());
            System.out.println("Network created: " + network.id());
        }
        catch (Exception e){
            System.out.println("fail,请输入正确的subnet,IpRange,Gatway");
        }

复制本机文件到docker容器里面(注意不是docker主机) 不能复制文件,只能复制文件夹。复制到docker容器里面的是文件夹里面的文件。可以看docker-client文档来理解操作。

 /**
     *
     * @param hostPath docker 主机ip
     * @param port 端口
     * @param localPath 文件夹地址
     * @param continerId 容器id
     * @param continerPath 容器内的路径
     */

    public static void CopyDirectoryToContiner(String hostPath,String port,String  continerId , String localPath , String continerPath) throws Exception {
        DockerClient docker = getDockerClient(hostPath, port);
        try {
            docker.inspectContainer(continerId);
            System.out.println("容器存在");
        }
        catch (Exception e){
            System.out.println("容器不存在");
        }
        try {
            docker.copyToContainer(Paths.get(localPath), continerId, continerPath);
            System.out.println("success");
        } catch (DockerException | InterruptedException e) {
            e.printStackTrace();
        }
    }