docker-java

这篇具有很好参考价值的文章主要介绍了docker-java。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一 所需依赖包

<dependency>
    <groupId>com.github.docker-java</groupId>
    <artifactId>docker-java</artifactId>
    <version>3.3.3</version>
</dependency>

二 前期准备

2.1 docker已安装

2.2 运行程序用户的docker使用权限

默认docker安装后是root权限运行的,比如运行程序的用户是admin用户,则需要将admin用户加加入到docker用户组

gpasswd -a admin docker
systemctl restart docker

2.3 docker.service 的访问方式,需要开启tcp访问默认,不然可能导致非root用户运行程序导致连接异常

vi /usr/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

三 配置参数

3.1 配置信息类,可以放在配置文件中,为了演示直接写死
public class Docker {
    /** docker 连接方式
     * 或者 "unix:///var/run/docker.sock"
     */
    private String host = "tcp://DOCKER_HOST_IP:2375";
    private String configDir = "/home/admin/.docker";
    private String apiVersion = "1.30";
    private String registerUrl = "";
    private String registerName = "";
    private String registerPassword = "";
    private String registerEmail = "";
    private Boolean tlsVerify = false;
    private String certPath = ""; // tsl证书地址
}

3.2 创建请求参数文章来源地址https://www.toymoban.com/news/detail-684468.html

import java.util.Collection;
import java.util.List;
import java.util.Map;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class ContainerCreateParam implements Serializable {

    private String imageName;
    private String containerName;
    /**
     * 端口映射Map,key是hostPort,value是containerPort
     */
    private Map<Integer, Integer> portMap;
    /**
     *  卷绑定 /host:/container:ro
     */
    private Collection<String> volumeBindSpecs;
    private Long memory;
    private List<String> envs;
}

四 工具类

import cn.hutool.core.collection.CollectionUtil;
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.model.Bind;
import com.github.dockerjava.api.model.ExposedPort;
import com.github.dockerjava.api.model.HostConfig;
import com.github.dockerjava.api.model.PortBinding;
import com.github.dockerjava.api.model.SearchItem;
import com.github.dockerjava.core.DefaultDockerClientConfig;
import com.github.dockerjava.core.DockerClientBuilder;
import com.xz.cp.core.exception.BusinessException;
import com.xz.cp.core.utils.JsonUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import org.apache.commons.lang3.BooleanUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class DockerUtils {

    private static final String CONTAINER_NAME_PATTERN = "^/?[a-zA-Z0-9][a-zA-Z0-9_.-]+$";
    private static final Logger LOG = LoggerFactory.getLogger(DockerUtils.class);

    private static DockerClient dockerClient;

    public DockerUtils() {
        Docker dockerProperties = new Docker(); // 取配置信息,视情况放在配置中心读取
        DefaultDockerClientConfig.Builder builder = DefaultDockerClientConfig
            .createDefaultConfigBuilder()
            .withDockerHost(dockerProperties.getHost())
            .withDockerConfig(dockerProperties.getConfigDir())
            .withApiVersion(dockerProperties.getApiVersion()) // optional
            .withRegistryUrl(dockerProperties.getRegisterUrl())
            .withRegistryUsername(dockerProperties.getRegisterName())
            .withRegistryPassword(dockerProperties.getRegisterPassword())
            .withRegistryEmail(dockerProperties.getRegisterEmail());

        if (BooleanUtils.isTrue(dockerProperties.getTlsVerify())) {
            builder.withDockerTlsVerify(true)
                .withDockerCertPath(dockerProperties.getCertPath());
        }

        dockerClient = DockerClientBuilder.getInstance(builder.build()).build();

        LOG.info("dockerClient init success");
    }

    private void _checkContainerName(String containerName) {
        if (!Pattern.matches(CONTAINER_NAME_PATTERN, containerName)) {
            throw new BusinessException("", "非法容器名!");
        }
    }

    /**
     * 创建容器
     *
     * @param containerCreateParam containerCreateParam
     * @return 创建完的容器
     */
    public CreateContainerResponse createContainer(ContainerCreateParam containerCreateParam) {
        _checkContainerName(containerCreateParam.getContainerName());

        // 创建容器需要使用的命令
        CreateContainerCmd containerCmd = dockerClient
            .createContainerCmd(containerCreateParam.getImageName())
            .withName(containerCreateParam.getContainerName());
        // 封装端口映射
        List<PortBinding> list = new ArrayList<>();
        Map<Integer, Integer> portMap = containerCreateParam.getPortMap();
        for (Integer hostPort : portMap.keySet()) {
            // 暴露端口
            containerCmd = containerCmd
                .withExposedPorts(ExposedPort.parse(portMap.get(hostPort) + "/tcp"));
            // 绑定主机端⼝ -> docker容器端⼝
            list.add(PortBinding.parse(hostPort + ":" + portMap.get(hostPort)));
        }

        HostConfig hostConfig = HostConfig.newHostConfig()
            .withMemory(containerCreateParam.getMemory() == null ? 1024L * 1024 * 1024
                : containerCreateParam.getMemory())
            .withPortBindings(list);
        if (CollectionUtil.isNotEmpty(containerCreateParam.getVolumeBindSpecs())) {
            List<Bind> volumeBinds = containerCreateParam.getVolumeBindSpecs().stream()
                .map(Bind::parse)
                .collect(Collectors.toList());

            hostConfig.withBinds(volumeBinds);
        }

        if (CollectionUtil.isNotEmpty(containerCreateParam.getEnvs())) {
            containerCmd = containerCmd.withEnv(containerCreateParam.getEnvs());
        }

        // 执行创建命令
        CreateContainerResponse container = containerCmd
            .withHostConfig(hostConfig)
            .exec();

        LOG.info("create container res = {}", JsonUtils.toString(container));
        return container;
    }

    public List<SearchItem> searchItems(String image) {
        return dockerClient.searchImagesCmd(image).exec();
    }

    /**
     * 关闭容器
     *
     * @param id 容器ID
     */
    public void stopContainer(String id) {
        dockerClient.stopContainerCmd(id).exec();
    }

    /**
     * 暂停容器
     *
     * @param id 容器ID
     */
    public void pauseContainer(String id) {
        dockerClient.pauseContainerCmd(id).exec();
    }

    /**
     * 重启容器
     *
     * @param id 容器ID
     */
    public void restartContainer(String id) {
        dockerClient.restartContainerCmd(id).exec();
    }

    /**
     * 删除容器
     *
     * @param id 容器ID
     */
    public void startContainer(String id) {
        dockerClient.startContainerCmd(id).exec();
    }

    /**
     * docker容器commit为镜像
     *
     * @param containerID 容器id
     * @param rep         镜像的仓库,就相当于【ubuntu:latest】中的【ubuntu】
     * @param tag         镜像的标签,就相当于【ubuntu:latest】中的【latest】
     */
    public void createImageByContainer(String containerID, String rep, String tag) {
        dockerClient.commitCmd(containerID).withRepository(rep).withTag(tag).exec();
    }
}

五 测试类

@SpringBootTest
class DockerUtilsTest {

    @Autowired
    DockerUtils dockerUtils;

    @Test
    void createContainer() {
        ContainerCreateParam param = new ContainerCreateParam();

        String containerName = "customizeName-" + UUID.fastUUID();
        param.setContainerName(containerName);
        param.setEnvs(List.of("MYSQL_ROOT_PASSWORD=123456"));
        param.setImageName("mysql:5.7");
        param.setVolumeBindSpecs(List.of("/root/docker_data/" + containerName + ":/var/lib/mysql"));
        param.setPortMap(Map.of(3318, 3306));
        param.setMemory(1024L * 1024 * 1024 * 2);
        dockerUtils.createContainer(param);
    }
}

到了这里,关于docker-java的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联

    看了很多资料,说做互联的一个原因是容器内ip不固定,关掉重启后如果有别的容器启动,之前的ip会被占用,所以做互联创建一个网络,让几个容器处于同一个网络,就可以互联还不受关闭再启动ip会改变的影响,但是其实我拿我做的mysql测试,不管是代码里还是sql连接工具

    2024年02月06日
    浏览(55)
  • 【Java】微服务——Docker容器部署(docker安装,docker配置镜像加速,DockerHub,docker基本操作,Dockerfile自定义镜像.Docker-Compose)

    微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。 在数百上千台服务中重复部署,环境不一定一致,会遇到各种问题 1.1.1.应用部署的环境问题 大型项目组件较多,运

    2024年02月04日
    浏览(54)
  • docker export,import后无法运行,如java命令找不到,运行后容器内编码有问题

    为什么用docker export呢,😔~由于客户环境太恶心了,测试一次更是麻烦,所以什么都得在本地调试完成,争取每次测试+上线一次通过才行,说多了都是泪。 由于踩坑几次了,每次都忘记,且每次网上找半天也难以发现问题,今日决定记录一笔。 在进行docker export导出镜像,然

    2024年02月15日
    浏览(44)
  • docker centos容器里,安装python3环境,且安装java8环境。并打成基础镜像

    一、 1、运行命令,即自动下载centos对应的镜像,但此时镜像是关闭状态: docker run centos:7.4 2、docker images 查看上述命令对应的 镜像 3、docker run -it centos:7.4 /bin/bash 之后退出 exit docker ps -a 之后, docker start imageid 启动对应的关闭状态的镜像 。 4、docker exec -it imageid /bin/bash 进入镜

    2023年04月09日
    浏览(42)
  • 使用Docker容器部署java运行环境(java8 + mysql5.7 + redis5.0 + nginx1.14.1

    环境:阿里云ECS服务器 1.1 安装工具 1.2 为yum源添加docker仓库位置 1.3 将软件包信息提前在本地索引缓存 (非必要,建议执行,可以提升yum安装的速度,报错去掉fast试试) 1.4 安装Docker 傻瓜式安装 点击y 1.5 启动Docker 1.6 设置开机自启动 1.7 安装完成后可以测试一下,是否安装成功

    2024年02月02日
    浏览(73)
  • 3.docker创建容器 (docker容器命令)

    2.1. 命令解读 docker run : 创建并运行一个容器 –name : 给容器起一个名字, 比如叫做 myNginx -p : 将宿主机端口与容器端口映射, 冒号左侧是宿主机端口, 右侧是docker容器端口 -d : 后台运行容器 nginx : 镜像名称 , 例如nginx 2.2. 通过查询得知nginx容器已经创建并运行成功 2.3. 验证是否启

    2024年02月04日
    浏览(45)
  • 【Docker 】Docker 客户端,容器使用,启动容器,启动已停止运行的容器,停止一个容器,进入容器

    作者简介: 辭七七,目前大一,正在学习C/C++,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。 可以通过命令 dock

    2024年02月11日
    浏览(44)
  • 《Docker极简教程》--Docker容器--Docker容器的创建和使用

    一、创建Docker容器 1.1 使用现有镜像创建容器 当使用现有镜像创建容器时,通常会涉及以下步骤: 获取镜像 :首先,需要从Docker Hub或其他镜像仓库获取所需的镜像。可以使用 docker pull 命令来获取镜像,语法如下: 其中, 镜像名称 是要获取的镜像的名称, 标签 是可选的版

    2024年02月19日
    浏览(50)
  • docker容器:Docker consul的容器服务更新与发现

    目录 一、Docker consul 1、什么是服务注册与发现 2、什么是consul 3、consul部署 ①实验目的 ②实验环境及拓扑 ③consul配置 ④registrator后端配置 ⑤测试发现功能是否正常 4、consul-template部署 ①准备template nginx模板文件 ②编译安装nginx ③安装template 5、验证template-nginx负载结果 6、测

    2024年02月04日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包