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

我是新来的docker工人,我想用java API来打印我的docker信息。 然后我在这个链接中find有关docker-java的Api。 我发现我的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中新build一个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做些什么。 更多的javaexception的细节是:

 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运行,请停止并按照我在第一步中提到的方式运行。