【问题标题】:Apache Connection Refused when running Docker-client Java API运行 Docker 客户端 Java API 时 Apache 连接被拒绝
【发布时间】:2015-07-07 09:37:14
【问题描述】:

我正在尝试安装 Docker 客户端远程 API 库 (https://github.com/spotify/docker-client) 来进行一些图像搜索和检查图像数据(全部在公共存储库中)。我已经下载、安装并运行了 boot2docker 虚拟机。诸如“Docker pull ubuntu”之类的命令可以正常工作,但我现在想通过 Java 程序来执行此操作。我使用 Eclipse IDE Egit 插件导入 github 项目,并从现有的 Master 分支创建了一个 Maven/Java 项目。源代码完全导入,没有报错。然后我尝试编写一个简单的测试:

    final DockerClient docker = DefaultDockerClient.fromEnv().build();
    //docker.pull("busybox");
    List<ImageSearchResult> results = docker.searchImages("ubuntu");
    for (ImageSearchResult res : results) {
        System.out.println(res.getName());
    }

但是,在 Eclipse 中运行代码时,出现以下错误:

Exception in thread "main" com.spotify.docker.client.DockerException: java.util.concurrent.ExecutionException: javax.ws.rs.ProcessingException: org.apache.http.conn.HttpHostConnectException: Connect to localhost:2375 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect
at com.spotify.docker.client.DefaultDockerClient.propagate(DefaultDockerClient.java:1109)
at com.spotify.docker.client.DefaultDockerClient.request(DefaultDockerClient.java:1028)
at com.spotify.docker.client.DefaultDockerClient.searchImages(DefaultDockerClient.java:653)
at com.spotify.docker.client.main.Test.main(Test.java:28)

我尝试在该端口上设置 apache 服务器,但随后我得到:

Exception in thread "main" com.spotify.docker.client.DockerRequestException: Request error: GET http://localhost:2375/v1.12/images/search?term=ubuntu: 404
at com.spotify.docker.client.DefaultDockerClient.propagate(DefaultDockerClient.java:1100)
at com.spotify.docker.client.DefaultDockerClient.request(DefaultDockerClient.java:1028)
at com.spotify.docker.client.DefaultDockerClient.searchImages(DefaultDockerClient.java:653)
at com.spotify.docker.client.main.Test.main(Test.java:28)

谁能告诉我我应该在这里做什么才能使我的搜索/拉取呼叫工作?这是我第一次尝试使用 Docker,我搜索了文档并搜索了问题,但找不到任何有类似问题的人。

谢谢!

编辑:我通过预构建的 VM Boot2Docker 在 Windows 7 中运行 docker。也许运行在内部的 Docker 守护进程无法从 VM 外部的程序(例如 Eclipse)访问?

编辑:通过升级到 v1.6 而不是 v1.5 解决了这个问题,这使得守护程序在 Windows 主机中可用。当前的问题是我所有的 API 调用都返回“服务器未能以有效的 HTTP 响应响应”

【问题讨论】:

  • 您是否在 boot2docker TinyCore VM Linux 主机上运行了您的 Java 程序?
  • 不,我在 Eclipse 的 Windows 7 中运行它。我刚刚开始意识到:在 VM 之外无法访问 Docker 守护进程,是吗?我什至如何才能让我的 Java 程序在 VM 中运行?我想最简单的选择是在 linux 上安装 docker 并从那里开始工作。
  • 完全正确:您需要在 docker 引擎所在的位置运行您的 java 程序(执行 docker search):在 Linux 主机(boot2docker VM)中

标签: java eclipse git maven docker


【解决方案1】:

我遇到了类似的问题,我通过以下方式解决了这个问题,构建了 DockerClient:

final DockerClient docker = DefaultDockerClient.builder()
                    .uri(URI.create("unix:///var/run/docker.sock"))
                    .build();

我遇到了同样的异常,但添加上面的 URI 部分帮助我解决了这个问题。 以下问题跟踪器中提供了对与上述类似的问题以及如何解决该问题的更好解释。

https://github.com/spotify/docker-maven-plugin/issues/61

【讨论】:

    【解决方案2】:

    Java 程序本质上做了一个docker search: 只能在存在 docker 引擎的环境中工作。

    在 boot2docker 虚拟机中。
    或者在完整的 Linux 主机中。

    【讨论】:

    • 现在有适用于 windows 的 docker 客户端 - 所以另一种选择是安装它并配置为在 vm 中使用 docker 服务器。
    • @ISanych 不太可能:TinyCore VM 中没有持久性:stackoverflow.com/a/29507588/6309
    • 它与持久化无关,docker客户端只需要与服务器的socket连接,可以在环境变量中指定:docs.docker.com/installation/windows
    • @Isanych 我尝试按照“从 Windows 命令行提示符 (cmd.exe) 使用 docker”,但它只是说“boot2docker 现在不适用于 Windows,请使用 ssh 登录到 VM "
    • @user134589 你输入了什么命令? (来自docs.docker.com/installation/windows/…
    【解决方案3】:

    我在 Mac 上使用 eclipse 和 Docker 版本 1.10.3 时确实遇到了同样的问题,我确实在找到解决方法之前搜索了一个解决方案 - 使用 docker CLI docker-manager 创建一个新的虚拟机并获得DOCKER_HOSTDOCKER_CERT_PATH 该虚拟框的值并创建一个新的构建器。

    在我的例子中:我使用 docker CLI 命令docker-machine create -d virtualbox default2创建了一个虚拟框 default2

    Docker CLI

    $ docker-machine env
    export DOCKER_TLS_VERIFY="1"
    export DOCKER_HOST="tcp://192.168.99.103:2376"
    export DOCKER_CERT_PATH="/Users/XXXX/.docker/machine/machines/default2"
    export DOCKER_MACHINE_NAME="default2"
    

    Docker 客户端 JAVA

    DockerCertificates defaultCertificates = new DockerCertificates(Paths.get("/Users/XXXX/.docker/machine/machines/default2"));    
    DockerClient docker = DefaultDockerClient.builder()
                    .uri("https://192.168.99.103:2376")
                    .dockerCertificates(defaultCertificates)
                    .build();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 2017-07-22
      • 2019-02-28
      相关资源
      最近更新 更多