Примеры использования Java в контейнерах Docker: основные принципы и руководство

Примеры использования Java в контейнерах Docker: основные принципы и руководство
На чтение
56 мин.
Просмотров
15
Дата обновления
26.02.2025
#COURSE##INNER#

Java является одним из самых популярных языков программирования, широко используемых для разработки различных приложений. Однако, с развитием технологии контейнеризации, все больше разработчиков начинают использовать Java в контейнерах Docker для создания гибких и масштабируемых приложений.

Контейнеры Docker предоставляют среду выполнения, которая изолирует приложение и все его зависимости от хост-системы. Это обеспечивает легкость в развертывании приложений, возможность портативности и масштабируемости, что делает их особенно привлекательными для разработчиков Java.

В данной статье мы рассмотрим основные принципы использования Java в контейнерах Docker и предоставим руководство по созданию и запуску Java-приложения в Docker-контейнере. Мы также рассмотрим примеры использования Docker для развертывания многомодульных Java-приложений и для эффективного масштабирования таких приложений.

Пример: Приведем пример использования Docker для развертывания Spring Boot приложения. Мы создадим Docker-контейнер, который будет содержать все необходимые зависимости, а затем развернем приложение в контейнере. Таким образом, мы сможем легко переносить приложение между различными окружениями разработки, тестирования и продукции, и обеспечить его масштабируемость.

Java в контейнерах Docker: основные принципы и руководство

Java является одним из самых популярных языков программирования, используемых для создания веб-приложений и микросервисов. Для развертывания Java-приложений можно использовать контейнеры Docker, которые облегчают процесс разработки, тестирования и развертывания программного обеспечения. В этом руководстве мы рассмотрим основные принципы использования Java в контейнерах Docker и предоставим пошаговую инструкцию по созданию и запуску контейнера с Java-приложением.

1. Установка Docker

Прежде чем начать использовать Docker, необходимо установить его на своей системе. Для этого следуйте инструкциям для вашей операционной системы, которые можно найти на официальном сайте Docker: https://www.docker.com/get-started. После установки убедитесь, что Docker успешно запущен и готов к использованию.

2. Создание Docker-образа

Для создания контейнера с Java-приложением необходимо сначала создать Docker-образ. Docker-образ содержит все необходимые зависимости и конфигурации для работы приложения. Для создания Docker-образа с Java-приложением создайте файл с именем "Dockerfile" в корневой директории вашего проекта и добавьте следующий код:

FROM openjdk:8-jdk-alpine
COPY ./app.jar /app/app.jar
WORKDIR /app
ENTRYPOINT ["java", "-jar", "app.jar"]

Этот Dockerfile основан на базовом образе "openjdk:8-jdk-alpine", который содержит установленную Java Development Kit (JDK) версии 8. Во второй строке мы копируем файл "app.jar" из текущей директории в директорию "/app" внутри контейнера. Далее, устанавливаем рабочую директорию в "/app" и указываем, что при запуске контейнера должно выполняться Java-приложение командой "java -jar app.jar".

После создания Dockerfile выполните следующую команду в терминале, находясь в директории с Dockerfile:

docker build -t my-java-app .

Эта команда создаст Docker-образ с именем "my-java-app" на основе Dockerfile в текущей директории. В результате вы получите готовый образ, готовый к запуску в контейнере.

3. Запуск контейнера с Java-приложением

После создания Docker-образа можно запустить контейнер с Java-приложением. Для этого выполните следующую команду:

docker run -it my-java-app

Приложение будет запущено внутри контейнера и вы сможете видеть вывод приложения в терминале. Если ваше приложение работает веб-сервером и использует определенный порт, вы также можете указать соответствующий флаг при запуске контейнера:

docker run -it -p 8080:8080 my-java-app

В этом примере мы привязываем порт 8080 в контейнере к порту 8080 на нашей основной системе. Теперь приложение будет доступно по адресу "http://localhost:8080".

4. Управление контейнером

Когда контейнер запущен, вы можете управлять им с помощью Docker команд. Некоторые полезные команды:

  • docker ps - список запущенных контейнеров
  • docker stop - остановить контейнер
  • docker rm - удалить контейнер

Вы также можете использовать графический интерфейс пользовательской программы Docker или утилиты командной строки третьих сторон для управления контейнером.

В этом руководстве мы рассмотрели основные принципы использования Java в контейнерах Docker и предоставили простую инструкцию по созданию и запуску контейнера с Java-приложением. Docker позволяет легко и эффективно управлять развертыванием Java-приложений, упрощает их масштабирование и поддержку. Это делает Docker отличным выбором для разработчиков Java, которые хотят сэкономить время и усилия при работе с контейнерами.

Что такое Docker

Docker - это платформа с открытым исходным кодом, которая позволяет автоматизировать процесс развёртывания и управления приложениями в контейнерах. Контейнеры - это изолированные среды, в которых приложения могут работать независимо от конкретной операционной системы и аппаратного обеспечения.

Docker использует концепцию контейнеризации для упаковки приложений и их зависимостей в образы, которые могут быть запущены в любой совместимой с Docker среде. Docker образы легковесны, портативны и могут быть легко переданы между разными средами или хостами.

Основные преимущества Docker:

  • Изолированность: Контейнеры предоставляют полную изоляцию для приложений и их зависимостей, что позволяет избежать конфликтов между разными приложениями и сделать всю среду более устойчивой.
  • Стандартизация: Docker образы являются стандартизованным форматом для упаковки приложений и их зависимостей, что упрощает процесс разработки, тестирования и развёртывания приложений.
  • Портативность: Docker образы могут быть легко переданы между разными средами или хостами, что обеспечивает высокую портативность приложений.
  • Масштабируемость: Docker позволяет легко масштабировать приложения в зависимости от нагрузки, запуская несколько экземпляров контейнеров и балансируя нагрузку между ними.
  • Отказоустойчивость: Docker позволяет автоматически восстанавливать контейнеры в случае сбоев или ошибок, что делает приложения более надежными.

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

Для использования Docker с Java приложениями необходимо создать Docker образ, который будет содержать все необходимые зависимости, включая JVM и само приложение. Затем этот образ можно запустить в контейнере. Это позволяет разработчикам работать в одинаковой среде, а также упрощает процесс развёртывания и масштабирования Java приложений.

Преимущества использования Docker для разработки на Java

Docker - это платформа для контейнеризации приложений, которая позволяет упаковывать и запускать приложения и их зависимости в изолированных контейнерах. Использование Docker для разработки на Java предоставляет множество преимуществ:

  1. Портативность и обеспечение совместимости: Docker контейнеры являются независимыми от операционной системы и железа, что позволяет запускать Java приложения в контейнерах на различных платформах, в том числе на разных дистрибутивах Linux, Windows или macOS. Это обеспечивает высокую степень портативности и обеспечивает совместимость приложения на разных средах разработки и развертывания.
  2. Упрощение конфигурации и развертывания: Docker использует Dockerfile, где можно описать необходимую конфигурацию среды для разработки на Java, включая установку Java Development Kit (JDK), библиотек, зависимостей и других ресурсов. Это позволяет быстро создавать готовые к работе контейнеры с минимальными усилиями и обеспечивает последовательность развертывания Java приложения на разных средах разработки и развертывания.
  3. Изоляция и безопасность: Контейнеры в Docker обеспечивают высокую степень изоляции, что позволяет запускать приложения в изолированных и контролируемых окружениях. Это помогает избежать взаимного влияния приложений, обеспечивает безопасность и стабильную работу Java приложений в различных средах разработки и развертывания.
  4. Масштабирование: Docker позволяет запускать и масштабировать Java приложения в горизонтальном масштабе, добавляя или удаляя контейнеры в зависимости от нагрузки и требований. Это обеспечивает гибкость и возможность эффективного управления ресурсами приложения.
  5. Управление зависимостями: Docker позволяет управлять зависимостями Java приложений, включая установку, обновление и удаление библиотек и других зависимостей. Это упрощает управление и обновление приложений, а также обеспечивает согласованность версий зависимостей в разных средах разработки и развертывания.
  6. Разработка в однородной среде: Docker позволяет создавать однородные среды разработки, которые можно легко переносить между различными сотрудниками и командами разработчиков. Это обеспечивает согласованность среды для разработки приложений на Java и помогает избежать проблем совместимости и непредвиденных ошибок.

Использование Docker для разработки на Java является эффективным способом управления средой разработки, упрощения развертывания приложений и обеспечения портативности и совместимости приложений на разных платформах и средах разработки.

Применение Java в контейнерах Docker

Контейнеры Docker являются популярным средством для развертывания и управления приложениями. Они предоставляют среду выполнения, которая изолирует приложение и его зависимости от операционной системы хоста, обеспечивая тем самым максимальную портативность и надежность.

Java является одним из самых распространенных языков программирования, который активно применяется в различных сферах разработки. Применение Java в контейнерах Docker позволяет упростить процесс развертывания и масштабирования приложений, а также обеспечивает надежность и удобство управления.

Вот некоторые примеры использования Java в контейнерах Docker:

  • Развертывание Java-приложений: Docker позволяет создавать образы контейнеров, которые содержат необходимые зависимости и настройки для запуска Java-приложений. Вместе со средой выполнения Java, такой как OpenJDK или Oracle JDK, в контейнер можно добавить все необходимые библиотеки и настройки приложения. Такой образ контейнера может быть легко развернут и масштабирован на любом хосте, где установлен Docker.
  • Обновление Java-приложений: Контейнеры Docker позволяют легко обновлять Java-приложения, не затрагивая операционную систему хоста или другие контейнеры. После создания новой версии образа контейнера, достаточно просто запустить новую версию контейнера, а старую - остановить. Это значительно упрощает процесс обновления и минимизирует время простоя приложения.
  • Создание микросервисов: Микросервисная архитектура стала популярным подходом в разработке приложений. Docker обеспечивает идеальную среду для создания и управления микросервисами, а Java, благодаря своей объектно-ориентированной природе, хорошо подходит для разработки небольших, автономных сервисов. Контейнеризация делает возможным размещение каждого микросервиса в отдельном контейнере, что обеспечивает высокую гибкость и масштабируемость.

Важно отметить, что применение Java в контейнерах Docker требует некоторых сведений о конфигурации и оптимизации процесса работы с Docker. Необходимо учесть особенности работы с памятью, процессором и другими ресурсами, чтобы обеспечить эффективную и стабильную работу Java-приложения в контейнере.

В заключение, применение Java в контейнерах Docker является мощным инструментом для разработчиков, позволяющим значительно упростить и улучшить процесс развертывания, обновления и масштабирования Java-приложений. Контейнеры Docker обеспечивают высокую степень изолированности и портативности, а Java обладает широкими возможностями для создания надежных и масштабируемых приложений.

Основные шаги использования Java в Docker

Java является одним из наиболее популярных языков программирования в мире разработки ПО. Контейнеризация с помощью Docker позволяет упаковывать приложения и их зависимости в изолированные контейнеры, что упрощает развертывание и масштабирование.

Для использования Java в Docker необходимо выполнить следующие шаги:

  1. Установить Docker: загрузите и установите Docker для вашей операционной системы. После установки вы сможете использовать команду Docker в командной строке.
  2. Создать Dockerfile: Dockerfile - это текстовый файл, который содержит инструкции для создания образа Docker. Вам нужно создать файл с именем "Dockerfile" в корневой папке вашего проекта Java.
  3. Определить базовый образ: в Dockerfile необходимо указать базовый образ, на основе которого будет создан ваш контейнер. Для использования Java обычно используются официальные образы, например "openjdk:8-jdk-alpine".
  4. Установить зависимости: вам может потребоваться установить дополнительные зависимости для вашего Java-приложения. Инструкции RUN в Dockerfile позволяют выполнить команды внутри контейнера. Например, для установки пакета "maven" можно добавить следующую инструкцию: RUN apk add --no-cache maven.
  5. Скопировать исходный код: используйте инструкцию COPY в Dockerfile, чтобы скопировать исходный код вашего Java-приложения в контейнер.
  6. Собрать Docker-образ: выполните команду "docker build" в командной строке, чтобы собрать Docker-образ на основе вашего Dockerfile. Например, команда может выглядеть так: docker build -t my-java-app .. Здесь "-t" указывает тег (имя) образа, а точка означает текущую директорию, где находится Dockerfile.
  7. Запустить контейнер: после создания Docker-образа вы можете запустить контейнер с помощью команды "docker run". Например, команда может выглядеть так: docker run my-java-app. Здесь "my-java-app" - это имя Docker-образа, который вы хотите запустить.

После выполнения этих шагов вы должны увидеть запущенное Java-приложение в контейнере Docker. Вы можете настроить дополнительные параметры запуска контейнера, такие как проброс портов, установку переменных среды и т. д.

Использование Java в Docker позволяет легко распространять и развертывать ваши приложения Java в различных окружениях, обеспечивая изоляцию и надежность. Это также упрощает процесс автоматизации развертывания приложений и интеграцию с другими инструментами DevOps.

Конфигурирование Java приложений в контейнерах Docker

Java является одним из самых распространенных языков программирования, используемых для разработки веб-приложений и микросервисов. Контейнеры Docker предоставляют удобное и эффективное окружение для запуска и развертывания Java приложений. В этом разделе рассмотрим основные принципы и руководство по конфигурированию Java приложений в контейнерах Docker.

Dockerfile: Работа с образом Java

Для создания контейнера Docker с Java приложением, необходимо создать Dockerfile. Dockerfile - это текстовый файл, который содержит инструкции для сборки образа контейнера. В случае Java приложений, необходимо начать с установки JDK (Java Development Kit) в контейнере.

Ниже приведен пример Dockerfile для создания образа контейнера с Java 11:

```dockerfile

FROM openjdk:11

WORKDIR /app

COPY . .

CMD ["java", "-jar", "my-app.jar"]

```

В этом примере используется базовый образ openjdk:11, который содержит установленную JDK версии 11. В директиве WORKDIR задается рабочая директория внутри контейнера. Директива COPY копирует файлы проекта внутрь контейнера. Наконец, директива CMD указывает команду для запуска Java приложения.

Переменные окружения

Для удобного и гибкого конфигурирования Java приложений в контейнерах Docker, можно использовать переменные окружения. Переменные окружения позволяют передавать параметры конфигурации, такие как адрес базы данных, порт приложения или уровень логирования, внутрь контейнера.

В Dockerfile можно определить переменные окружения с использованием директивы ENV. Например:

```dockerfile

FROM openjdk:11

WORKDIR /app

ENV DB_URL=jdbc:mysql://localhost:3306/mydb

ENV APP_PORT=8080

COPY . .

CMD ["java", "-jar", "my-app.jar"]

```

В этом примере задаются две переменные окружения: DB_URL и APP_PORT. Значения переменных можно изменить при запуске контейнера с помощью параметра -e. Например:

```shell

docker run -e DB_URL=jdbc:mysql://db-server:3306/mydb -e APP_PORT=8080 my-app

```

Таким образом, можно легко изменять параметры конфигурации Java приложений без необходимости внесения изменений в сам контейнер. Это позволяет повысить гибкость и переносимость приложений.

Внешние ресурсы и файлы конфигурации

Часто Java приложения требуют доступа к внешним ресурсам, таким как базы данных или файлы конфигурации. В контейнерах Docker можно легко настроить доступ к этим ресурсам.

Для доступа к базе данных, необходимо указать правильный адрес и порт в переменной окружения, как показано в предыдущем примере. Также можно предоставить доступ к внешним файлам конфигурации путем монтирования томов или сетевых директорий в контейнере.

Например, для монтирования локальной директории с файлами конфигурации в контейнере можно использовать параметр -v при запуске контейнера. Например:

```shell

docker run -v /path/to/config:/app/config my-app

```

В этом примере директория /path/to/config на хосте монтируется в директорию /app/config внутри контейнера. Таким образом, Java приложение может обращаться к файлам конфигурации, находящимся в монтированной директории.

Такой подход позволяет изменять файлы конфигурации без необходимости перезапуска контейнера, что удобно при проведении деплоя или настройке приложения.

Распределенные системы и сетевое взаимодействие

Java приложения часто работают в распределенных системах и взаимодействуют с другими компонентами через сетевые протоколы, такие как HTTP, gRPC или Apache Kafka. В контейнерах Docker нет необходимости менять код приложений для их использования в распределенных системах.

Для работы с сетевыми протоколами можно настроить порты в контейнере с помощью параметров -p и -P. Например:

```shell

docker run -p 8080:8080 my-app

```

В этом примере порт 8080 в контейнере проксируется на порт 8080 на хосте. Теперь можно обращаться к приложению по адресу http://localhost:8080. Аналогично, можно настроить межконтейнерное взаимодействие с использованием сетевых алиасов или Docker Compose.

Таким образом, Java приложения в контейнерах Docker легко интегрируются в распределенные системы и могут взаимодействовать с другими компонентами как внутри контейнеров, так и за их пределами.

Заключение

Контейнеры Docker предоставляют удобное и эффективное окружение для развертывания Java приложений. В этом разделе мы рассмотрели основные принципы и руководство по конфигурированию Java приложений в контейнерах Docker. Мы рассмотрели создание Dockerfile, работу с переменными окружения, доступ к внешним ресурсам и сетевое взаимодействие. Использование Java в контейнерах Docker позволяет легко масштабировать и развертывать приложения, повышая их гибкость и переносимость.

Оптимизация работы Java в контейнерах Docker

Java является одним из наиболее популярных языков программирования, который широко применяется для создания масштабируемых и надежных приложений. Сочетание Java и Docker позволяет еще больше улучшить производительность и эффективность приложений.

Однако, при использовании Java в контейнерах Docker могут возникнуть определенные проблемы, связанные с потреблением ресурсов, настройкой JVM и оптимизацией работы. В этой статье мы рассмотрим несколько основных принципов и рекомендаций для оптимизации работы Java в контейнерах Docker.

1. Выбор оптимального образа Java

При выборе образа Java для использования в контейнерах Docker рекомендуется обратить внимание на следующие факторы:

  • Размер образа: выбирайте образы Java, которые имеют минимальный размер, чтобы уменьшить время загрузки и потребление ресурсов.
  • Основной дистрибутив: выберите подходящий дистрибутив Java для вашего приложения, например, OpenJDK или Oracle JDK.
  • Версия Java: выберите актуальную стабильную версию Java, которая поддерживает требуемые функциональные возможности и исправления безопасности.

2. Настройка JVM

Для обеспечения оптимального функционирования Java в контейнерах Docker рекомендуется установить оптимальные настройки JVM. Вот некоторые рекомендации:

  • Определение размера памяти: установите параметры -Xms и -Xmx для определения начального и максимального размера памяти, необходимого для вашего приложения.
  • Сборка мусора: настройте параметры сборки мусора (-XX:+UseG1GC, -XX:+UseParallelGC и т.д.) в зависимости от требований вашего приложения.
  • Размер и количество потоков: настройте параметры, связанные с количеством потоков, такие как -XX:ParallelGCThreads, -XX:ConcGCThreads и т.д., в зависимости от архитектуры и размера сервера.

3. Оптимизация работы с Docker

Для оптимизации работы Java в контейнерах Docker можно применить следующие рекомендации:

  • Использование многоэтапной сборки: разделите процесс сборки вашего Docker-образа на несколько этапов, чтобы уменьшить размер и улучшить производительность.
  • Уменьшение размера образа: убедитесь, что ваш Docker-образ содержит только необходимые файлы и зависимости, чтобы уменьшить размер образа и время загрузки.
  • Версионирование образов: для облегчения развертывания и обновления приложений, рекомендуется использовать версионирование Docker-образов.
  • Масштабирование приложения: для обеспечения масштабируемости вашего приложения в контейнерах Docker, используйте возможности горизонтального и вертикального масштабирования.

Соблюдение данных принципов и рекомендаций поможет улучшить производительность и эффективность работы Java в контейнерах Docker, а также обеспечит более стабильное и масштабируемое развертывание приложений.

Руководство по использованию Java в контейнерах Docker

Java является одним из самых популярных языков программирования, и его комбинация с Docker открывает новые возможности для разработчиков. Docker позволяет создавать контейнеры, которые являются независимыми и легковесными ячейками, содержащими все необходимое для работы приложения.

Использование Java в контейнерах Docker имеет множество преимуществ. Во-первых, содержание приложения в контейнере обеспечивает его портативность, которая позволяет запускать его на любом компьютере с установленным Docker без необходимости устанавливать и настраивать Java и все зависимости заново. Во-вторых, контейнеры могут быть масштабируемыми, что позволяет разрабатывать приложения, способные динамически управлять нагрузкой и обеспечивать высокую отзывчивость.

Вот несколько шагов, которые помогут вам начать использовать Java в контейнерах Docker:

  1. Установите Docker на свой компьютер. Для этого вы можете посетить официальный сайт Docker и загрузить образ для вашей операционной системы.
  2. Создайте файл Dockerfile в корневом каталоге вашего проекта. Dockerfile - это текстовый файл, в котором описываются все шаги, необходимые для создания Docker-образа, основанного на Java.
  3. В Dockerfile укажите базовый образ, который будет использоваться для создания вашего образа Java. Например:
FROM openjdk:11
  1. Укажите все зависимости и настройки, необходимые для вашего приложения, в Dockerfile. Например, вам может понадобиться скопировать JAR-файл вашего приложения в контейнер и установить порт, который будет использоваться для взаимодействия с приложением:
COPY target/my-app.jar /app/my-app.jar
EXPOSE 8080
  1. Соберите Docker-образ, выполнив команду docker build в каталоге вашего проекта. Например:
docker build -t my-app .
  1. Запустите контейнер, выполнив команду docker run. Укажите порт, на котором должно работать ваше приложение, и имя образа, созданного на предыдущем шаге.
docker run -p 8080:8080 my-app

Это простое руководство позволит вам начать использовать Java в контейнерах Docker. Однако, помимо основных шагов, есть множество дополнительных функций, которые вы можете использовать, такие как монтирование томов, установка переменных среды и настройка сети. Эти возможности позволяют еще глубже интегрировать Java и Docker и создавать более сложные и гибкие приложения.

Необходимые зависимости можно указать, использовав официальные образы контейнеров, уже содержащие Java и другие необходимые инструменты, или создать свой собственный образ, в котором уже будет установлена Java и настроены все зависимости. Выбор зависит от вашего проекта и конкретной задачи.

В итоге, сочетание Java и Docker дает разработчикам мощный инструмент, с помощью которого можно создавать надежные, портативные и масштабируемые приложения. Используйте это руководство, чтобы погрузиться в мир Java и Docker, и извлечь максимум из их возможностей для вашего проекта.

Вопрос-ответ:

Какие преимущества дает использование Java в контейнерах Docker?

Использование Java в контейнерах Docker позволяет упростить развертывание и масштабирование приложений, обеспечивает независимость от конкретной ОС или аппаратного обеспечения, а также позволяет эффективно использовать ресурсы хостовой системы.

Как запустить Java приложение в контейнере Docker?

Для запуска Java приложения в контейнере Docker необходимо создать Dockerfile, в котором указывается базовый образ, на основе которого будет создан контейнер, и указывается команда для запуска приложения с использованием Java. Затем необходимо выполнить команду `docker build` для создания образа и команду `docker run` для запуска контейнера.

Какие инструменты можно использовать для управления Java контейнерами в Docker?

Для управления Java контейнерами в Docker можно использовать различные инструменты, например, Docker Compose, Kubernetes или Apache Mesos. Они позволяют управлять развертыванием и масштабированием контейнеров, управлять сетью и хранилищем данных, а также мониторить работу приложений.

Какие основные принципы разработки Java приложений для контейнеров Docker?

При разработке Java приложений для контейнеров Docker следует учитывать несколько принципов. Во-первых, приложение должно быть максимально независимым от конкретной ОС или аппаратного обеспечения. Во-вторых, следует учитывать ограничения контейнера (например, доступные ресурсы) и оптимизировать приложение под них. В-третьих, необходимо обеспечить возможность горизонтального масштабирования и управления контейнерами.

Каким образом можно использовать Docker для разработки Java приложений?

Для разработки Java приложений можно использовать Docker в нескольких сценариях. Во-первых, можно использовать контейнеры Docker для создания изолированной среды разработки, в которой можно управлять зависимостями и конфигурацией проекта. Во-вторых, можно использовать контейнеры Docker для локального тестирования приложения в разных окружениях. В-третьих, можно использовать Docker для создания образов приложения и их деплоймента на серверы.

Как использовать Java в контейнерах Docker?

Для использования Java в контейнерах Docker, необходимо создать Dockerfile, в котором будет указан базовый образ с установленной Java, а также добавить необходимый код и настройки. Затем Dockerfile необходимо собрать в образ и запустить контейнер на его основе.

Видео:

Введение в Testcontainers. Прокачиваем интеграционные тесты.

Введение в Testcontainers. Прокачиваем интеграционные тесты. by Jama Mahileu Streamed 2 years ago 57 minutes 5,401 views

0 Комментариев
Комментариев на модерации: 0
Оставьте комментарий