簡體   English   中英

在Docker-Java API中構建映像/容器時如何連接到自定義網絡

[英]How to connect to custom network when building image/container in Docker-Java API

我正在使用https://github.com/docker-java/docker-java中找到的Docker-Java API。

我有一個dockerfile,我必須為其構建3個容器。 我正在嘗試自動化構建3個圖像的過程以及在內部運行Shell時要與它們一起使用的命令。 3個容器必須位於同一局域網中才能進行通信。 我可以手動完成此操作...

因此,首先,使用docker-java API,我使用以下功能構建自定義網絡:

private void createNetwork() {
    CreateNetworkResponse networkResponse = dockerClient.createNetworkCmd()
        .withName("ETH")
        .withDriver("bridge")
        .withAttachable(true)
        .exec();
    System.out.printf("Network %s created...\n", networkResponse.getId());
}

這很好用,如果我運行docker network ls ,可以看到列出的ETH網絡。

下一步是構建圖像。 我正在運行以下功能:

public String buildImage(String tag) {
    String imageID = dockerClient.buildImageCmd()
        .withDockerfile(new File("/Dockerfile"))
        .withPull(true)
        .withNoCache(false)
        .withTags(new HashSet<>(Collections.singletonList(tag)))
        .withNetworkMode("ETH")
        .exec(new BuildImageResultCallback())
        .awaitImageId();
    System.out.println("Built image: " + imageID);
    return imageID;
}

因此,圖像構建良好,並且在終端中運行docker images命令時可以看到該圖像。 我確實希望該映像連接到ETH網絡,但是我看不到。

我以為可能不是在創建容器時就必須連接到網絡,所以我傳遞的命令與通過以下功能在構建容器時手動執行的命令相同:

private String createContainer(String name, String imageID, int port) {
        CreateContainerResponse container = dockerClient
                .createContainerCmd(name)
                .withImage(imageID)
                .withCmd("docker", "run", "--rm", "-i", "-p", port + ":" + port, "--net=ETH", name)
                .withExposedPorts(new ExposedPort(port))
                .exec();
        dockerClient.startContainerCmd(container.getId()).exec();
        return container.getId();
}

不幸的是,當傳遞這樣的參數時,運行命令docker network inspect ETH時,構建的容器不會顯示在ETH網絡中。

我不確定自己在做什么錯。 如果我使用API​​構建映像,然后手動運行以下命令,則docker run --rm -it -p 8545:8545 --net=ETH miner_one一切正常。 任何幫助將不勝感激。 謝謝!

docker-java客戶端支持Docker遠程API的子集。 要在創建容器時連接到網絡,請設置“ NetworkMode字段(請參見“ 容器創建”部分中的 HostConfig-> NetworkMode

用於此容器的網絡模式。 支持的標准值為:網橋,主機,無和容器:。 其他任何值都將用作此容器應連接到的自定義網絡的名稱。

因此,為了使容器連接到自定義網絡,請將網絡模式的值設置為ETH

在Java中,對於較舊版本的Docker-Java客戶端,請使用withNetworkMode()方法:

CreateContainerResponse container = dockerClient
                .createContainerCmd(name)
                .withImage(imageID)
                .withNetworkMode("ETH")
                ...

在最新版本中,已棄用CreateContainerCmd用於在HostConfig中設置字段的方法。 使用withHostConfig()代替:

 CreateContainerResponse container = dockerClient.createContainerCmd(name)
     .withImage(imageID)
     .withHostConfig(HostConfig.newHostConfig().withNetworkMode("ETH"))
     ...

這是一個基本示例:

List<Network> networks = dockerClient.listNetworksCmd().withNameFilter("ETH").exec();
    if (networks.isEmpty()) {
      CreateNetworkResponse networkResponse = dockerClient
          .createNetworkCmd()
          .withName("ETH")
          .withAttachable(true)
          .withDriver("bridge").exec();
      System.out.printf("Network %s created...\n", networkResponse.getId());
    }

    CreateContainerResponse container = dockerClient
        .createContainerCmd("ubuntu")
        .withName("my-ubuntu")
        .withCmd("sleep", "10")
        .withHostConfig(HostConfig
            .newHostConfig()
            .withNetworkMode("ETH")
            .withAutoRemove(true))
        .exec();

    String containerId = container.getId();
    dockerClient.startContainerCmd(containerId).exec();

    Network ethNetwork = dockerClient.inspectNetworkCmd()
        .withNetworkId("ETH")
        .exec();

    Set<String> containerIds = ethNetwork.getContainers().keySet();
    if(containerIds.contains(containerId)) {
      System.out.printf("Container with id:%s is connected to network %s%n", containerId, ethNetwork.getName());
    } 

它從ubuntu映像創建一個名為ETH的網絡和一個容器my-ubuntu 容器已連接到ETH網絡。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM