本篇文章是基于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连接