Docker Java API创建容器并映射端口

9 篇文章 0 订阅
4 篇文章 0 订阅

准备条件

确保已开启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
}

接下来是操作Docker的方法,为了更加直观,就不写在一起了,在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中还有好多好多操作,各自在研究清楚基本操作之后,估计别的也就融汇贯通了,根据需求自己搭配吧

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用JavaDocker API来查看Docker容器映射端口。以下是一个简单的Java示例代码: ```java import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.model.Container; import java.util.List; import java.util.Map; public class DockerPortMappingExample { public static void main(String[] args) { DockerClient dockerClient = DockerClientFactory.createDefault(); List<Container> containers = dockerClient.listContainersCmd().exec(); for (Container container : containers) { InspectContainerResponse inspectContainerResponse = dockerClient.inspectContainerCmd(container.getId()).exec(); Map<String, List<Map<String, String>>> portBindings = inspectContainerResponse.getHostConfig().getPortBindings(); if (portBindings != null) { for (Map.Entry<String, List<Map<String, String>>> entry : portBindings.entrySet()) { String containerPort = entry.getKey(); List<Map<String, String>> hostPorts = entry.getValue(); for (Map<String, String> hostPort : hostPorts) { String hostIp = hostPort.get("HostIp"); String hostPortNumber = hostPort.get("HostPort"); System.out.println("Container " + container.getId() + " port " + containerPort + " is mapped to " + hostIp + ":" + hostPortNumber); } } } } dockerClient.close(); } } ``` 该代码遍历所有Docker容器,并使用`inspectContainerCmd`方法检查每个容器的详细信息。然后,它获取容器端口映射绑定,遍历它们并打印出每个容器端口映射到的主机IP和端口号。 请注意,要运行此代码,您需要添加以下依赖项到您的Maven项目: ```xml <dependency> <groupId>com.github.docker-java</groupId> <artifactId>docker-java-core</artifactId> <version>3.2.5</version> </dependency> <dependency> <groupId>com.github.docker-java</groupId> <artifactId>docker-java-api</artifactId> <version>3.2.5</version> </dependency> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FENGYU406

赏杯咖啡喝~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值