2

在探索 docker-client api (java) 时,建立与在 vm 上运行的 docker 守护进程的连接究竟需要哪些证书。

我在网上找到的代码:

{
// Create a client based on DOCKER_HOST and DOCKER_CERT_PATH env vars
final DockerClient docker = DefaultDockerClient.fromEnv().build();

// Pull an image
docker.pull("busybox");

}

上述示例的链接位于:https ://github.com/spotify/docker-client

我打算做的是访问在我的主节点上运行的 docker-daemon(通过 magnum api 部署)并将我的 java 应用程序 docker-image 推送到注册表,以便我可以使用这些图像在我的集群上创建 pod。

我不确定还需要做什么,因为我是新手。

4

2 回答 2

0

我做了类似的事情,在远程 docker daemon 上创建图像并将其推送到存储库并进一步生成容器。我使用了docker-java客户端,它工作正常。您可能想浏览他们的 wiki,事实证明,问题页面对我非常有帮助。

基本步骤:

  1. 基本上你需要创建一个DockerClientConfig类似于

    public DockerClientConfig dockerClientConfig() {
       return DefaultDockerClientConfig.createDefaultConfigBuilder()
           .withDockerHost("IP_where_docker_daemon_is_running_with_port")
           .withDockerTlsVerify("Transport_Layer_Security_accepts_Boolean")
           .withDockerCertPath("If_tls_is_true")
           .build();
    }
    
  2. 然后你需要创建一个DockerClient

    public DockerClient dockerClient() {
        DockerClient dockerClient = DockerClientBuilder.getInstance(dockerClientConfig())
            .withDockerCmdExecFactory(nettyDockerCmdExecFactory())
            .build();
        return dockerClient;
    }
    
  3. 现在您已准备好调用创建 Image、推送 Image、startContainer 等。

       File baseDir = new File(appImage.getSourceUri());
    
        BuildImageResultCallback callback = new BuildImageResultCallback(){
            @Override
            public void onNext(BuildResponseItem item){
                System.out.println("It's done - > " + item);
                super.onNext(item);
            }
        };
    
        PushImageResultCallback pushImageResultCallback = new PushImageResultCallback(){
            @Override
            public void onNext(PushResponseItem item){
                System.out.println("It's done too - >" + item);
                super.onNext(item);
            }
        };
    
    
        dockerClient.buildImageCmd(baseDir).withTag(appImage.getRegistryEndpoint()+"/apps/test:" + appImage
                               .getName()).exec(callback).awaitImageId();
    
        dockerClient.listImagesCmd().withShowAll(true).exec();
    
        AuthConfig authConfig = new AuthConfig().withUsername("admin").withPassword("admin")
                                                .withRegistryAddress("http://some_ip/v2/");
    
        dockerClient.pushImageCmd(appImage.getName())
                    .withAuthConfig(authConfig)
                    .withName(appImage
                    .getRegistryEndpoint()+ "/apps/test")
                    .withTag(appImage.getName())
                    .exec(pushImageResultCallback).awaitSuccess();
    
        CreateContainerResponse containerResponse = dockerClient.createContainerCmd(appImage
            .getRegistryEndpoint()+ "/apps/test:" + appImage.getName())
            .exec();
    
        dockerClient.startContainerCmd(containerResponse.getId()).exec();
    

这应该足以让你开始。

于 2017-09-28T13:57:23.287 回答
0

也许您也可以简单地使用Jib 核心 API,这是一个简单的 Java 库,不需要docker安装任何东西来构建 + 推送图像!

阅读此 Google 博客文章以了解更多信息。

于 2019-02-05T13:52:00.617 回答