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连接的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-20Docker部署资料:新手入门教程
- 2024-12-19Docker部署实战:新手入门教程
- 2024-12-19Docker部署教程:新手入门详解
- 2024-12-09云原生周刊:在Docker上部署大语言模型
- 2024-12-05Docker教程:新手快速入门指南
- 2024-12-05Docker项目实战:新手教程与案例解析
- 2024-12-04Docker入门教程:快速掌握基础操作
- 2024-12-04Docker入门教程:轻松搭建你的第一个容器化应用
- 2024-12-04Docker-Compose 入门教程:全面解析基础命令与应用场景
- 2024-12-04Docker入门:新手必读的简单教程