2017-08-03 142 views
0

我在Windows 10上安裝了virtualbox併爲docker主機創建了一個Ubuntu實例。然後在Ubuntu上安裝docker。我想用碼頭工人的Java API連接泊塢窗(我用的碼頭工人的Java 3.0.12),代碼如下:Docker-java API在windows 10上的Eclipse中連接virtualbox ubuntu docker

DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder() 
        .withDockerHost("tcp://192.168.5.31:2375").build(); 
DockerClient dockerClient = DockerClientBuilder.getInstance(config).build(); 

CreateContainerResponse container1 = 
dockerClient.createContainerCmd("tomcat:latest").withCmd("sleep", "9999") .withName("mytomcat3").exec(); 

dockerClient = DockerClientBuilder.getInstance().build(); 
dockerClient.startContainerCmd(container1.getId()).exec(); 

我已經得到了如下信息:

java.lang.RuntimeException: Library 'junixsocket-native-2.0.4.dll' not found! 
    at org.newsclub.net.unix.NarSystem.getLibPath(NarSystem.java:132) 
    at org.newsclub.net.unix.NarSystem.loadLibrary(NarSystem.java:36) 
    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:498) 
    at org.newsclub.net.unix.NativeUnixSocket.<clinit>(NativeUnixSocket.java:35) 
    at org.newsclub.net.unix.AFUNIXSocket.<init>(AFUNIXSocket.java:36) 
    at org.newsclub.net.unix.AFUNIXSocket.newInstance(AFUNIXSocket.java:54) 
    at com.github.dockerjava.jaxrs.ApacheUnixSocket.<init>(ApacheUnixSocket.java:51) 
    at com.github.dockerjava.jaxrs.UnixConnectionSocketFactory.createSocket(UnixConnectionSocketFactory.java:66) 
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:118) 
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353) 
    at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380) 
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) 
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184) 
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88) 
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) 
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) 
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:71) 
    at org.glassfish.jersey.apache.connector.ApacheConnector.apply(ApacheConnector.java:435) 
    at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:252) 
    at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:684) 
    at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:681) 
    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:444) 
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:681) 
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:437) 
    at org.glassfish.jersey.client.JerseyInvocation$Builder.post(JerseyInvocation.java:343) 
    at com.github.dockerjava.jaxrs.StartContainerCmdExec.execute(StartContainerCmdExec.java:29) 
    at com.github.dockerjava.jaxrs.StartContainerCmdExec.execute(StartContainerCmdExec.java:12) 
    at com.github.dockerjava.jaxrs.AbstrSyncDockerCmdExec.exec(AbstrSyncDockerCmdExec.java:23) 
    at com.github.dockerjava.core.command.AbstrDockerCmd.exec(AbstrDockerCmd.java:35) 
    at com.github.dockerjava.core.command.StartContainerCmdImpl.exec(StartContainerCmdImpl.java:46) 
    at docker.MyDocker.main(MyDocker.java:53)... 

我無法下載該DLL。你能告訴我如何解決這個問題嗎?

非常感謝!

回答

0

我找到了使用其他Java API的解決方案。那是spotify/docker-client。我使用這樣的API:

import java.net.URI; 
import java.util.Arrays; 

import com.google.common.collect.ImmutableMap; 
import com.spotify.docker.client.DefaultDockerClient; 
import com.spotify.docker.client.DockerClient; 
import com.spotify.docker.client.LogStream; 
import com.spotify.docker.client.messages.ContainerConfig; 
import com.spotify.docker.client.messages.ContainerCreation; 
import com.spotify.docker.client.messages.ExecCreation; 
import com.spotify.docker.client.messages.HostConfig; 
import com.spotify.docker.client.messages.HostConfig.Bind; 
import com.spotify.docker.client.messages.PortBinding; 

public class MyDocker { 

public static void main(String[] args) { 
    try { 
     DockerClient dockerClient = DefaultDockerClient.builder() 
        .uri(URI.create("http://192.168.5.31:2375")) 
        .build(); 
     // Pull an image 
     //docker.pull("tomcat"); 

     String p = PortBinding.randomPort("192.168.5.31").hostPort(); 

     final HostConfig hostConfig = HostConfig.builder() 
       .appendBinds(Bind.from("/home/cdh/test") 
          .to("/usr/local/tomcat/webapps/test").readOnly(false) 
          .build()) 
       .portBindings(ImmutableMap.of("8080/tcp", Arrays.asList(PortBinding.of("0.0.0.0", p)))).build();  



     final ContainerConfig containerConfig = ContainerConfig.builder() 
       .hostConfig(hostConfig) 
       .image("tomcat:latest").exposedPorts("8080/tcp") 
       .build(); 

     final ContainerCreation creation = dockerClient.createContainer(containerConfig); 
     final String id = creation.id(); 

     // Start container 
     dockerClient.startContainer(id); 
     // Exec command inside running container with attached STDOUT and STDERR 
     final String[] command = {"bash", "-c", "ls"}; 
     final ExecCreation execCreation = dockerClient.execCreate(
      id, command, DockerClient.ExecCreateParam.attachStdout(), 
      DockerClient.ExecCreateParam.attachStderr()); 
     final LogStream output = dockerClient.execStart(execCreation.id()); 
     final String execOutput = output.readFully(); 

     // Kill container 
     dockerClient.killContainer(id); 

     // Remove container 
     dockerClient.removeContainer(id); 

     // Close the docker client 
     dockerClient.close(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

它完美地工作。現在我建議你可以使用下面的代碼來訪問docker。

乾杯!

相關問題