Docker-java

发布于:2025-02-10 ⋅ 阅读:(44) ⋅ 点赞:(0)

1、什么是Docker

Docker是一个开源的平台 [2],用于开发、交付和运行应用程序。它能够在WindowsmacOSLinux计算机上运行,并将某一应用程序及其依赖项打包至一个容器中,这些容器可以在任何支持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-pip

pip 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.DefaultDockerClientConfig

DockerClientConfig 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>() {

            @Override
            public 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);

//        搜索镜像   这里搜索的是wordpress
        List<SearchItem> dockerSearch = dockerClient.searchImagesCmd("wordpress").exec();
        System.out.println("Search returned" + dockerSearch.toString());

//          拉取镜像文件
        dockerClient.pullImageCmd("wordpress:latest").exec(new ResultCallback.Adapter<PullResponseItem>() {

            @Override
            public void onNext(PullResponseItem object) {
                System.out.println(object.getStatus());
            }
        }).awaitCompletion();


        // 创建container 并测试

        // create

        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();
            }
        }
    }
}