欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > Docker-java

Docker-java

2025/2/7 0:27:52 来源:https://blog.csdn.net/weixin_65279640/article/details/144966382  浏览:    关键词:Docker-java

1、什么是Docker

Docker是一个开源的平台 [2],用于开发、交付和运行应用程序。它能够在Windows,macOS,Linux计算机上运行,并将某一应用程序及其依赖项打包至一个容器中,这些容器可以在任何支持Docker的环境中运行。容器彼此隔离,但可以通过特定的通道相互传递信息。

Docker提供了一个轻量级的虚拟化解决方案。由于运行在同一计算机上的所有容器共享同一个操作系统内核,避免了启动与维护虚拟机的开销。因此相比于传统的虚拟机,Docker容器更加轻便、快速、容易部署。使用Docker,开发者可以避免在两台计算机上运行效果不一致的问题,容器提供了一致的行为,进而使得应用程序在不同环境的计算机上有相同的运行效果。

其实也可以这样来理解 ,我们在部署使用一个java项目时,我们需要去配置运行环境。而docker容器就好似预制菜,当我们做好一个项目后,只需要我们将自己的项目打包成一个docker容器上传到docker平台中,就可以供别人直接下载使用,别人在部署的时候就不需要进行复杂的环境安装。

2、Docker有什么用

  1. 环境一致性:docker可以确保开发、测试和生产环境的一致性。通过使用容器,可以在不同的机器上运行相同的环境配置,避免了“在我的机器上可以运行”的问题。
  2. 隔离性:每个 Docker 容器都在自己的环境中运行,不会影响到其他容器或主机的环境,这提供了很好的隔离性。
  3. 可移植性:Docker 容器可以在任何支持 Docker 的操作系统上运行,这使得应用部署和迁移变得非常方便。
  4. 快速部署和扩展:Docker 容器可以快速启动,这意味着可以快速部署新的应用实例,也可以在需要时快速扩展服务。
  5. 资源高效:与传统的虚拟机相比,Docker 容器不需要为每个应用都运行一个完整的操作系统,因此它们占用的系统资源更少,可以更高效地利用硬件资源。
  6. 持续集成和持续部署(CI/CD):Docker 可以集成到 CI/CD 流程中,使得自动化测试和部署变得更加容易。
  7. 微服务架构:Docker 支持微服务架构的开发模式,允许将大型应用分解为多个小的、独立的服务,这些服务可以独立部署和扩展。

3、如何去安装与使用Docker

//centos7 直接使用yum安装
sudo yum install -y docker-ce docker-ce-cli containerd.io//ubuntu 使用apt命令安装
sudo apt-get install docker-ce docker-ce-cli containerd.io//windows

windows安装docker

去官网下载Docker Desktop on Windows

链接: Windows | Docker Docs

之后win11专业版或企业版可以去控制面板打开(这一步我看网上有人说不做也可以成功,先安装Docker Desktop on Windows 报错了再稿这一步把)

win + r 键入 control 打开控制面板 找到如下路径

控制面板\程序\程序和功能 找到 启动或关闭windows功能

之后找到Hyper-V 全部勾选重启即可。

也可以使用命令 打开power shell

dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All//设置 Windows 操作系统中的 Hyper-V 启动类型
bcdedit /set hypervisorlaunchtype auto

如果是家庭版,可以创建一个txt文档 然后输入一下代码

pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL

之后后缀名改成.bat以管理员运行 一直键入Y 即可 完成后重启

重启没有报错的话 打开cmd 键入 查看一下docker版本以及是否安装成功

docker -v

出现版本号基本就算成功了

成功后登录

之后进入设置配置docker镜象源

"registry-mirrors": ["https://hub-mirror.c.163.com","https://mirror.baidubce.com","https://pee6w651.mirror.aliyuncs.com","https://docker.211678.top","https://docker.1panel.live","https://hub.rat.dev","https://docker.m.daocloud.io","https://do.nark.eu.org","https://dockerpull.com","https://dockerproxy.cn","https://docker.awsl9527.cn"]

配置完之后点击

之后打开power shell

运行

docker run hello-world

等待拉取 拉去成功后主页可以看到

之后我们进入页面 点击启动容器,发现启动不了

之后去命令行执行

wsl -l -v

发现只有docker-desktop,少了一个linux系统,我们还需要去下载一个内置ubuntu

进入微软商店,找到ubuntu LTS (任意版本)获取即可

之后进入docker desktop 找到设置开启ubuntu

之后进入ubuntu bash命令行页面(win + r 键入 bash 也可以通过开始菜单打开)

给ubuntu22.04安装docker ce

授予当前用户root权限运行dockerCLI

//如果显示没有docker用户组可以自行创建   sudo groupadd docker
sudo usermod -aG docker $USER//安装dockercompose
sudo apt-get install -y python3 python3-pippip install --user docker-compose

之后再去运行hello-world你会发现仍然启动不了 这是因为当主进程完成时,docker 容器就会退出。hello-world主进程只会打印一些文本然后退出,因此容器也会退出。(真XX)

我们这里换一个容器来执行

 docker run --name nginx-demo -p 8080:80 -d nginx

加载完后你就会发现能正常访问了

4、使用java代码对docker容器进行基本操作

4.1 开启docker远程连接

打开docker desktop 找到设置

之后找到docker engine 配置hosts暴露端口

"hosts": ["tcp://0.0.0.0:2375"]

重启docker

配置防火墙

打开powershell 运行

netsh interface portproxy add v4tov4 listenport=2375 connectaddress=127.0.0.1 connectport=2375 listenaddress=<your-public-ip> protocol=tcp

之后测试

docker -H 127.0.0.1:2375 info

1.创建maven项目 导入相关依赖

创建一个maven项目

添加docker-java依赖

<!-- docker java --><dependency><groupId>com.github.docker-java</groupId><artifactId>docker-java-transport-httpclient5</artifactId><version>3.2.13</version></dependency><!-- https://mvnrepository.com/artifact/com.github.docker-java/docker-java --><dependency><groupId>com.github.docker-java</groupId><artifactId>docker-java</artifactId><version>3.4.0</version></dependency>

2.创建类 实例化DockerClientConfig来配置docker-java

实例化DockerClientConfig 构建器配置客户端的每个属性 告诉java如何访问Docker

import com.github.dockerjava.core.DockerClientConfig
import com.github.dockerjava.core.DefaultDockerClientConfigDockerClientConfig custom = DefaultDockerClientConfig.createDefaultConfigBuilder().withDockerHost("tcp://docker.somewhere.tld:2376").withDockerTlsVerify(true).withDockerCertPath("/home/user/.docker").withRegistryUsername(registryUser).withRegistryPassword(registryPass).withRegistryEmail(registryMail).withRegistryUrl(registryUrl).build();
  • DOCKER_HOSTDocker 主机 URL,例如 或tcp://localhost:2376unix:///var/run/docker.sock
  • DOCKER_TLS_VERIFY启用/禁用 TLS 验证(在 和 协议之间切换)httphttps
  • DOCKER_CERT_PATHTLS 验证所需证书的路径
  • DOCKER_CONFIG其他 docker 配置文件的路径(如.dockercfg)
  • api.versionAPI 版本,例如 .1.23
  • registry.url您的注册表地址。
  • registry.username您的注册表用户名(推送容器时需要)。
  • registry.password您的注册表密码。
  • registry.email您的注册表电子邮件。

实例化DockerClient客户端

DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder().dockerHost(custom.getDockerHost())  //传入主机信息.sslConfig(custom.getSSLConfig())    //SSL配置,用于处理HTTPS连接时的安全套接层配置,确保与Docker守护进程的通信是加密的.maxConnections(100)                 //设置了HTTP客户端可以维护的最大连接数.connectionTimeout(Duration.ofSeconds(30)) //置了建立到Docker守护进程连接的超时时间,这里设置为30秒.responseTimeout(Duration.ofSeconds(30))   //设置了等待Docker守护进程响应的超时时间,这里也设置为30秒.build();

之后根据提供的配置信息(custom)和HTTP客户端(httpClient),创建一个能够与Docker守护进程进行通信的客户端实例

 DockerClient dockerClient = DockerClientImpl.getInstance(custom,httpClient);

3 功能

获取用户信息

Info info = dockerClient.infoCmd().exec();System.out.println(info);

搜索镜像

ist<SearchItem> dockerSearch = dockerClient.searchImagesCmd("wordpress").exec();System.out.println("Search returned" + dockerSearch.toString());

拉取镜像

 dockerClient.pullImageCmd("wordpress:latest").exec(new ResultCallback.Adapter<PullResponseItem>() {@Overridepublic void onNext(PullResponseItem object) {System.out.println(object.getStatus());}}).awaitCompletion();

创建运行容器

try {
//            创建容器CreateContainerResponse containerResponse = dockerClient.createContainerCmd("wordpress").withName("my-wordpress")    //设置容器名称.withPortBindings(PortBinding.parse("8082:80"))  //将容器80端口映射到主机8082端口.exec();//            启动容器dockerClient.startContainerCmd(containerResponse.getId()).exec();System.out.println("容器id为:" + containerResponse.getId() + "创建成功");} catch (Exception e){e.printStackTrace();}finally {try {
//                关闭docker客户端连接httpClient.close();} catch (IOException e) {e.printStackTrace();}}

整体代码

import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.async.ResultCallback;
import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.api.model.*;
import com.github.dockerjava.core.DefaultDockerClientConfig;
import com.github.dockerjava.core.DockerClientConfig;
import com.github.dockerjava.core.DockerClientImpl;
import com.github.dockerjava.core.command.EventsResultCallback;
import com.github.dockerjava.httpclient5.ApacheDockerHttpClient;
import com.github.dockerjava.transport.DockerHttpClient;import java.io.Closeable;
import java.io.IOException;
import java.time.Duration;
import java.util.List;/*** @Author: Insight* @Description: TODO* @Date: 2024/11/25 21:00* @Version: 1.0*/public class main {public static void main(String[] args) throws InterruptedException {
//        配置Docker连接DockerClientConfig custom = DefaultDockerClientConfig.createDefaultConfigBuilder().withDockerHost("tcp://127.0.0.1:2375").withDockerTlsVerify(true).withDockerCertPath("C:\\Users\\ASUS\\.docker").withRegistryUsername("maisan00").withRegistryPassword("ms04023519.").withRegistryEmail("1684468484@qq.com").withRegistryUrl("https://index.docker.io/v1/").build();//      实例化DockerHttpClient  http客户端DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder().dockerHost(custom.getDockerHost()).sslConfig(custom.getSSLConfig()).maxConnections(100).connectionTimeout(Duration.ofSeconds(30)).responseTimeout(Duration.ofSeconds(30)).build();//        根据提供的配置信息(custom)和HTTP客户端(httpClient),创建一个能够与Docker守护进程进行通信的客户端实例。
//        这个客户端实例可以用来执行各种Docker操作,比如创建、启动、停止容器,拉取和推送镜像等DockerClient dockerClient = DockerClientImpl.getInstance(custom,httpClient);//        获取用户镜像组信息 用于测试是否连接成功Info info = dockerClient.infoCmd().exec();System.out.println(info);//        搜索镜像   这里搜索的是wordpressList<SearchItem> dockerSearch = dockerClient.searchImagesCmd("wordpress").exec();System.out.println("Search returned" + dockerSearch.toString());//          拉取镜像文件dockerClient.pullImageCmd("wordpress:latest").exec(new ResultCallback.Adapter<PullResponseItem>() {@Overridepublic void onNext(PullResponseItem object) {System.out.println(object.getStatus());}}).awaitCompletion();// 创建container 并测试// createtry {
//            创建容器CreateContainerResponse containerResponse = dockerClient.createContainerCmd("wordpress").withName("my-wordpress")    //设置容器名称.withPortBindings(PortBinding.parse("8082:80"))  //将容器80端口映射到主机8082端口.exec();//            启动容器dockerClient.startContainerCmd(containerResponse.getId()).exec();System.out.println("容器id为:" + containerResponse.getId() + "创建成功");} catch (Exception e){e.printStackTrace();}finally {try {
//                关闭docker客户端连接httpClient.close();} catch (IOException e) {e.printStackTrace();}}}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com