docker api实现容器中centos使用ssh连接

2021/9/17 7:07:28

本文主要是介绍docker api实现容器中centos使用ssh连接,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

前言

本篇文章是基于lz的这篇文章为基础的,需要代码示例的可以从这篇文章中下载源码。上篇帖子主要实现了通过docker-java-api的SDK实现了远程对docker中镜像和容器的增删改查重命名等基本功能,这篇文章在基础镜像centos:latest版中安装ssh服务,commit到本地仓库后,使用docker相关SDK生成commit在本地的镜像容器,然后通过宿主机8081端口映射docker的centos镜像22端口,再使用xftp连接宿主机的映射端口,实现了对docker中镜像的管理
Java实现使用docker api实现镜像拉取,容器管理(docker-java-api)



参数配置

由于时间比较紧所以不想花太多时间解释,感兴趣的可以看看我上篇帖子,直接分享参数配置,参数的含义代码中有注释,代码中luntek_centos为自己创建的带有ssh连接的镜像

创建自定义容器

@ResponseBody
    @GetMapping("/testDockerUtilCreate")
    public ResponseResult testDockerUtil(String containerName) {
        //自定义容器HostConfig参数
        //HostConfig暴露的端口,设置宿主机与docker镜像对应端口暴露信息
        JsonObject buildPortBindings = Json.createObjectBuilder().
                add("22/tcp",
                        Json.createArrayBuilder().
                                add(Json.createObjectBuilder().
                                        add("HostPort", "8081").
                                        add("HostIp", "").build())).
                build();
        JsonObjectBuilder hostConfig = Json.createObjectBuilder().
        //设置此参数使得此启动的容器中可以使用systemctl指令
                add("Privileged", true).
        add("PortBindings", buildPortBindings);

        //ExposedPorts参数,容器内部端口暴露
        JsonObjectBuilder exposedPorts = Json.createObjectBuilder().
                add("22/tcp", Json.createObjectBuilder().
                        add("HostPort", "8081").
                        add("HostIp", "").build());

        //自定义容器参数
        JsonObjectBuilder job = Json.createObjectBuilder().
                add("Image", "luntek_centos").
                add("HostConfig", hostConfig.build()).
                add("ExposedPorts", exposedPorts).
                //设置启动指令集
                        add("Cmd", Json.createArrayBuilder().add("/usr/sbin/init").build()).
                //自定义Mac地址
                        add("MacAddress", "12:34:56:78:9a:bc").
                //保证容器启动后不关闭,守护式启动。定义标准输入流
                //三个参数分别为:是否附加到标准输入、将标准流附加到 TTY如果未关闭则包括stdin、打开标准输入
                        add("AttachStdin", true).
                        add("Tty", true).
                        add("OpenStdin", true);
        Container latest = createContainer(containerName, "latest", job);
        log.info("***容器信息:{}***", latest);
        return ResponseResult.success();
    }

    /**
     * 创建一个容器
     *
     * @param containerName    容器名称
     * @param containerVersion 容器版本号
     * @param job              容器自定义信息,具体格式参考:
     *                         https://docs.docker.com/engine/api/v1.40/#operation/ContainerList
     * @return
     */
    public static Container createContainer(String containerName, String containerVersion, JsonObjectBuilder job) {
        try {
            Images allContainer = getAllImages();
            boolean contains = false;
            Container container = null;
            Image image = null;
            for (Image img : allContainer) {
                boolean result = img.toString().contains("luntek_centos:latest");
                if (result) {
                    contains = true;
                    image = img;
                    break;
                }
            }
            log.info("是否包含镜像名称为【{}】的镜像:{}", containerName, contains);

            if (contains & image != null) {
                //已存在,直接创建返回
                container = image.docker().containers().create(containerName, job.build());
            } else {
                //不存在镜像,拉取
                final Docker docker = new CustomizeUnixDocker(new File("/var/run/docker.sock"),
                        "v1.41");
                final Images images = docker.images();
                System.out.println("拉取ubuntu镜像");
                //镜像自带ssh服务
                final Image img = images.pull("luntek_centos", "latest");
                container = img.docker().containers().create(containerName, job.build());
                container.start();
                log.info("运行ubuntu容器成功信息为:" + container);
            }
            return container;
        } catch (IOException e) {
            log.error("创建镜像发生未知错误");
            e.printStackTrace();
            return null;
        }
    }

容器创建完成之后到控制台中使用docker ps -a指令查看创建的容器ID

启动容器

@ResponseBody
    @GetMapping("/testDockerUtilStart")
    public ResponseResult startByContainerId(String containerId) {
        DockerUtil.startByContainerId(containerId);
        return ResponseResult.success();
    }
public static void startByContainerId(String containerId) {
        Containers containers = getAllContainer();
        Container container = containers.get(containerId);
        log.info("容器信息为:{}", container);
        if (container != null) {
            try {
                container.start();
                log.info("容器启动完成");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }



运行结果

创建容器
在这里插入图片描述
启动容器
在这里插入图片描述
容器情况
在这里插入图片描述
使用xftp连接
在这里插入图片描述


文章写得很粗略有不懂的可以私信我看到后肯定第一时间回复,对你有用的话记得点个赞,创作不易

这篇关于docker api实现容器中centos使用ssh连接的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程