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

Windows下使用com.github.docker-java操作Docker遇协议不支持错误求助

解决Windows下docker-java 3.3.0版本npipe协议不支持的问题

问题原因

Windows系统中Docker Desktop默认使用npipe:////./pipe/docker_engine套接字与客户端通信,但你当前使用的docker-java 3.3.0版本默认依赖的Jersey HTTP客户端不支持npipe协议,因此抛出Unsupported protocol scheme异常。而Linux系统使用Unix套接字,默认客户端原生支持,所以代码可以正常运行。

解决方案

步骤1:添加npipe传输依赖

在pom.xml中补充docker-java-transport-npipe依赖,该包专门处理Windows下的npipe协议通信:

<dependency>
    <groupId>com.github.docker-java</groupId>
    <artifactId>docker-java</artifactId>
    <version>3.3.0</version>
</dependency>
<!-- 添加npipe传输依赖 -->
<dependency>
    <groupId>com.github.docker-java</groupId>
    <artifactId>docker-java-transport-npipe</artifactId>
    <version>3.3.0</version>
</dependency>

步骤2:修改DockerClient构建代码

显式使用npipe专用的HTTP客户端构建DockerClient,替换原来的默认构建方式:

import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.command.CreateContainerCmd;
import com.github.dockerjava.api.exception.NotFoundException;
import com.github.dockerjava.core.DockerClientBuilder;
import com.github.dockerjava.core.DockerClientConfig;
import com.github.dockerjava.npipe.NpipeDockerHttpClient;

public static void main(String[] args) {
    String containerName = "mycontainer_name";
    String dockerImage = "myimage";

    // 配置Docker客户端参数
    DockerClientConfig config = DockerClientConfig.createDefaultConfigBuilder()
            .withDockerHost("npipe:////./pipe/docker_engine")
            .build();

    // 使用npipe HTTP客户端构建DockerClient
    DockerClient dockerClient = DockerClientBuilder.getInstance(config)
            .withDockerHttpClient(new NpipeDockerHttpClient.Builder()
                    .dockerHost(config.getDockerHost())
                    .build())
            .build();

    // 后续容器操作逻辑保持不变
    if (dockerContainerExists(containerName, dockerClient)) {
        System.out.println("Container already exists");
        dockerStop(containerName, dockerClient);
        DockerRm(containerName, dockerClient);
    }

    CreateContainerCmd createContainer = dockerClient
            .createContainerCmd(dockerImage).withName(containerName);
    createContainer.withTty(true);
    createContainer.exec();

    dockerClient.killContainerCmd(containerName).exec();
    dockerClient.removeContainerCmd(containerName).exec();
}

备选方案:改用TCP协议(仅开发环境临时使用)

如果你不想添加额外依赖,可以在Docker Desktop设置中开启Expose daemon on tcp://localhost:2375 without TLS,然后修改DockerClient的主机地址为TCP格式:

DockerClientConfig config = DockerClientConfig.createDefaultConfigBuilder()
        .withDockerHost("tcp://localhost:2375")
        .build();

注意:该方式关闭了TLS加密,存在安全风险,不建议在生产环境使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 13:48:14