You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot集成Docker Java API创建DockerClient Bean报错求助

解决Spring Boot中Docker Java API的依赖冲突与DockerClient配置方案

问题根源分析

你遇到的两个错误本质都是依赖版本冲突:

  • NoClassDefFoundError:Docker Java API默认使用JAX-RS作为传输层,但Spring Boot默认不包含JAX-RS相关类;
  • LinkageError:手动添加javax.ws.rs-api后,与Docker Java API依赖的JAX-RS实现(如Jersey)版本不匹配,导致类转换异常。

解决步骤

1. 修正依赖配置(核心)

放弃手动引入javax.ws.rs-api,改用Docker Java API的HTTP Client 5传输层实现,彻底规避JAX-RS依赖冲突。

Maven配置(pom.xml)

<dependencies>
    <!-- Docker Java API核心依赖 -->
    <dependency>
        <groupId>com.github.docker-java</groupId>
        <artifactId>docker-java</artifactId>
        <version>3.3.3</version> <!-- 使用最新稳定版,需与transport版本一致 -->
    </dependency>
    <!-- HTTP Client 5传输层,替代默认JAX-RS实现 -->
    <dependency>
        <groupId>com.github.docker-java</groupId>
        <artifactId>docker-java-transport-httpclient5</artifactId>
        <version>3.3.3</version>
    </dependency>
</dependencies>

Gradle配置(build.gradle)

dependencies {
    implementation 'com.github.docker-java:docker-java:3.3.3'
    implementation 'com.github.docker-java:docker-java-transport-httpclient5:3.3.3'
}

2. 正确创建DockerClient Bean

在Spring Boot配置类中构建DockerClient,确保配置与Docker环境匹配:

import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.core.DefaultDockerClientConfig;
import com.github.dockerjava.core.DockerClientImpl;
import com.github.dockerjava.httpclient5.ApacheDockerHttpClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.time.Duration;

@Configuration
public class DockerConfig {

    @Bean
    public DockerClient dockerClient() {
        // 加载默认配置(读取环境变量、Docker配置文件等)
        DefaultDockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
                // 手动指定Docker主机,本地默认unix:///var/run/docker.sock,远程可用tcp://host:2375
                // .withDockerHost("unix:///var/run/docker.sock")
                .build();

        // 构建HTTP客户端
        ApacheDockerHttpClient httpClient = new ApacheDockerHttpClient.Builder()
                .dockerHost(config.getDockerHost())
                .sslConfig(config.getSSLConfig())
                .maxConnections(100)
                .connectionTimeout(Duration.ofSeconds(30))
                .responseTimeout(Duration.ofSeconds(45))
                .build();

        return DockerClientImpl.getInstance(config, httpClient);
    }
}

3. 控制器中使用DockerClient创建容器

以下是创建并启动Nginx容器的示例:

import com.github.dockerjava.api.command.CreateContainerResponse;
import com.github.dockerjava.api.model.HostConfig;
import com.github.dockerjava.api.model.PortBinding;
import com.github.dockerjava.api.model.Ports;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;

@RestController
public class DockerController {

    @Resource
    private DockerClient dockerClient;

    @PostMapping("/create-nginx")
    public String createNginxContainer() {
        // 拉取镜像(本地不存在时自动下载)
        dockerClient.pullImageCmd("nginx:alpine").exec();

        // 创建容器:映射本地8080端口到容器80端口
        CreateContainerResponse container = dockerClient.createContainerCmd("nginx:alpine")
                .withName("demo-nginx")
                .withHostConfig(HostConfig.newHostConfig()
                        .withPortBindings(new PortBinding(Ports.Binding.bindPort(8080), new com.github.dockerjava.api.model.ExposedPort(80))))
                .exec();

        // 启动容器
        dockerClient.startContainerCmd(container.getId()).exec();

        return "容器创建成功,ID:" + container.getId();
    }
}

额外注意事项

  • Docker权限:确保运行Spring Boot的用户拥有访问Docker Socket的权限,可执行sudo usermod -aG docker $USER添加用户到docker组,重启后生效;
  • 远程Docker主机:若连接远程Docker daemon,需在daemon配置中开启远程访问(如编辑/etc/docker/daemon.json添加"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]),并在DockerConfig中指定withDockerHost("tcp://remote-ip:2375"),生产环境建议启用TLS加密;
  • 版本一致性:docker-java与docker-java-transport-httpclient5的版本必须完全一致,否则会出现新的依赖问题。

内容的提问来源于stack exchange,提问作者macgood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 16:40:36