java - 如何使用docker-java API连接docker?

标签 java docker boot2docker

我是docker新手,我想使用java api来打印我的docker信息。然后我在这个link中找到Api关于 docker-java。我发现我的 boot2docker ip 是 196.168.59.103:2376。我使用这个命令:

docker -H tcp://192.168.59.103:2376 version

它可以成功并向我显示以下信息:

Client version: 1.7.0
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 0baf609
OS/Arch (client): darwin/amd64
Server version: 1.7.0
Server API version: 1.19
Go version (server): go1.4.2
Git commit (server): 0baf609
OS/Arch (server): linux/amd64

然后,我在 Eclipse 中新建一个 Maven 项目,并运行以下代码:

public static void main(String[] args) {
        DockerClient dockerClient = DockerClientBuilder.getInstance("http://192.168.59.103:2376").build();
        Info info = dockerClient.infoCmd().exec();
        System.out.print(info);
    }

但是,它根本不起作用,并抛出异常:

The server failed to respond with a valid HTTP response

并且,我使用命令curl进行连接:

curl -v http://192.168.59.103:2376/info

它显示的信息如下:

* Hostname was NOT found in DNS cache
*   Trying 192.168.59.103...
* Connected to 192.168.59.103 (192.168.59.103) port 2376 (#0)
> GET /info HTTP/1.1
> User-Agent: curl/7.37.1
> Host: 192.168.59.103:2376
> Accept: */*
> 

* Connection #0 to host 192.168.59.103 left intact

遇到这种情况我该怎么办?我想用它来显示一些 docker 信息并使用 java 代码对 docker 做一些事情。 更多java异常详细信息是:

Exception in thread "main" javax.ws.rs.ProcessingException: org.apache.http.client.ClientProtocolException
    at org.glassfish.jersey.apache.connector.ApacheConnector.apply(ApacheConnector.java:513)
    at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:246)
    at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:683)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:424)
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:679)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:408)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:308)
    at com.github.dockerjava.jaxrs.InfoCmdExec.execute(InfoCmdExec.java:26)
    at com.github.dockerjava.jaxrs.InfoCmdExec.execute(InfoCmdExec.java:12)
    at com.github.dockerjava.jaxrs.AbstrDockerCmdExec.exec(AbstrDockerCmdExec.java:57)
    at com.github.dockerjava.core.command.AbstrDockerCmd.exec(AbstrDockerCmd.java:29)
    at org.v11.dm.docker.Demo.main(Demo.java:15)
Caused by: org.apache.http.client.ClientProtocolException
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:188)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:72)
    at org.glassfish.jersey.apache.connector.ApacheConnector.apply(ApacheConnector.java:465)
    ... 14 more
Caused by: org.apache.http.ProtocolException: The server failed to respond with a valid HTTP response
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:151)
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57)
    at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:260)
    at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:161)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.apache.http.impl.conn.CPoolProxy.invoke(CPoolProxy.java:138)
    at com.sun.proxy.$Proxy19.receiveResponseHeader(Unknown Source)
    at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:271)
    at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123)
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:253)
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:194)
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:85)
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108)
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:186)
    ... 16 more

最佳答案

你的代码对我有用。

我有以下设置 -

  1. Docker 守护进程正在使用此命令运行 -

    /usr/bin/docker -d -H fd://-H tcp://0.0.0.0:2375

  2. 我能够 curl -

    curl http://localhost:2375/info

  3. 还能够运行您的代码。

注意

如果您使用 boot2docker,请检查守护进程如何运行以及是否接受 http 请求。如果它正在使用 TLSVerify 运行,请停止它并按照我在第一步中提到的方式运行。

关于java - 如何使用docker-java API连接docker?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31201846/

相关文章:

java.lang.OutOfMemory错误: Java heap space while reading Excel file into java bean using XLSReader

java - 使用双引号组合参数

Docker EXPOSE 使用运行时环境变量

java - 如何访问 Strtus2 OGNL 表达式中的多个操作属性?

java - 在 Eclipse 中识别类的可视化帮助

docker - 在 nvidia docker 中使用 nvenc 运行 ffmpeg

docker - docker 是如何管理容器的 IP 地址的?

Docker Compose 并在启动容器时执行命令

docker - 是否可以在创建 Docker 容器后为其分配静态 IP 地址?

docker - 如何在主机中执行Linux命令并将输出复制到docker文件构建的镜像中?