Как создать и запустить Docker-контейнер с определенным портом, в автономном режиме с помощью docker-java

Я хочу создать и запустить Docker с помощью клиента Java Docker. Я хочу запустить что-то вроде этого:

docker run -d -p 4444:4444 --name selenium-hub selenium/hub:2.53.0

Как реализовать эту команду на клиенте docker-java? Вот мой код до сих пор:

CreateContainerResponse response = dockerClient.createContainerCmd("selenium/hub")
               .withName(name)
               .exec();

Собственно IDK, как указать -d (для работы в фоновом режиме). и -р. Помогите мне, пожалуйста. извините, я новичок в докере.

4 ответа

Решение

Нашел решение... если кто-то найдет лучшее, пожалуйста, напишите здесь. Я уже модифицирую код так, чтобы он был таким:

  ExposedPort tcp4444 = ExposedPort.tcp(4444);
   Ports portBindings = new Ports();
   portBindings.bind(tcp4444,Ports.Binding.bindPort(4444));

   CreateContainerResponse response = dockerClient.
           createContainerCmd("selenium/hub")
           .withName(name)
           .withImage("selenium/hub:"+version)
           .withExposedPorts(tcp4444)
           .withPortBindings(portBindings)
           .withAttachStderr(false)
           .withAttachStdin(false)
           .withAttachStdout(false)
           .exec();`

Docker-Java версии 3.1.0 переместил withPortBindings метод из CreateContainerCmd класс к HostConfig учебный класс.

Вот обновленный способ сделать это:

ExposedPort tcp4444 = ExposedPort.tcp(4444);
Ports portBindings = new Ports();
portBindings.bind(tcp4444, Ports.Binding.bindPort(4444));

// create container from image
CreateContainerResponse container = dockerClient.createContainerCmd("selenium/hub:2.53.0")
            .withExposedPorts(tcp4444)
            .withHostConfig(newHostConfig()
                    .withPortBindings(portBindings))
            .withName("selenium-hub")
            .exec();

// start the container
dockerClient.startContainerCmd(container.getId()).exec();

В качестве примечания я должен был посмотреть на модульные тесты в репозитории docker-java, чтобы найти, как это сделать. Кажется, это то место, где можно найти рабочие примеры.

Вы можете использовать hostconfig, как показано ниже, чтобы указать порт привязки 1234 (эквивалентно -p 1234:1234)

      HostConfig hostConfig = HostConfig.newHostConfig().withPortBindings(PortBinding.parse("1234:1234"));
dockerClient.createContainerCmd(..).withHostConfig(hostConfig);

У docker-java есть хорошая вики на https://github.com/docker-java/docker-java/wiki. Поиск "порт" получил меня это:

Создайте новый контейнер Docker и запустите его с открытыми портами

ExposedPort tcp22 = ExposedPort.tcp(22);
ExposedPort tcp23 = ExposedPort.tcp(23);

Ports portBindings = new Ports();
portBindings.bind(tcp22, Ports.Binding(11022));
portBindings.bind(tcp23, Ports.Binding(11023));

CreateContainerResponse container = dockerClient.createContainerCmd("busybox")
   .withCmd("true")
   .withExposedPorts(tcp22, tcp23)
   .withPortBindings(portBindings)
   .exec();

Я посмотрел на некоторые тесты в docker-java, и похоже, что вы выполнили только половину работы для запуска контейнера, потому что вы только создали контейнер и не запустили его. На основании того, что я вижу в этом тесте ( https://github.com/docker-java/docker-java/blob/069987852c842e3bba85ed3325a8877c36f9e87f/src/test/java/com/github/dockerjava/core/command/ExecStartCmdImplTest.java#L69), ваш код должен выглядеть примерно так:

ExposedPort tcp4444 = ExposedPort.tcp(4444);

Ports portBindings = new Ports();
portBindings.bind(tcp4444, Ports.Binding(4444));

// Create the container (it will not be running)
CreateContainerResponse container = dockerClient.createContainerCmd("selenium/hub")
    .withName(name)
    .withExposedPorts(tcp4444)
    .withPortBindings(portBindings)
    .exec();

// Actually run the container
dockerClient.startContainerCmd(container).exec();

Насколько я могу судить, нет никаких причин явно запускать его в автономном режиме, потому что по умолчанию он будет запускаться асинхронно.

Другие вопросы по тегам