В данной лабораторной работе вам предстоит собрать и запустить готовое клиент-серверное приложение на java в докере. также, сервер использует базу данных PostgreSQL, все инструкции и справки представлены ниже.
разнится от ОСи, на которой вы сидите. По ходу лабы пользуйтесь (оффициальным сайтом)[https://docs.docker.com/], где собраны мануалы/примеры/решения ваших проблем. Если никогда не работали с докером - рекомендую начать с Docker Desktop. Любые проблемы гуглятся, а что не гуглится - решается лично.
Запуск контейнера | docker run [OPTIONS] IMAGE_NAME |
Список активных контейнеров | docker ps |
Просмотр логов контейнера | docker logs CONTAINER_NAME |
Перезапуск контейнера | docker restart CONTAINER_NAME |
Мониторинг ресурсов | docker stats |
Ограничение ресурсов | docker run --memory=256m --cpus=1 IMAGE_NAME |
Для связи между контейнерами рекомендуется использовать внутренние сети Docker:
- Создание сети:
docker network create my_network
- Подключение[Отключение] контейнера к сети:
docker network connect[disconnect] my_network CONTAINER_NAME
- Просмотр списка сетей:
docker network ls
Подробнее о взаимодействии контейнеров с сетью
Dockerfile содержит последовательность команд для создания Docker-образа. Некоторые из них:
FROM
: задаёт базовый образ.COPY
: копирует файлы из хостовой системы внутрь контейнера.WORKDIR
: устанавливает рабочую директорию внутри контейнера.RUN
: выполняет команды на этапе сборки образа.CMD
: задаёт команду, выполняемую при запуске контейнера.EXPOSE
: указывает порты, которые будут открыты для доступа.ENV
: задаёт переменные окружения.
Пример многоступенчатой сборки:
# Этап сборки приложения
FROM img1 as builder
COPY src(on host) target(on image)
RUN ./build.sh
# Этап запуска приложения
FROM img2 as runner
COPY --from=builder /build/file /run/file
CMD ["bash", "/run/run.sh"]
Для работы сервера необходима база данных PostgreSQL. Рекомендуемый образ - postgres:15
. При запуске укажите параметры:
- Имя пользователя (
POSTGRES_USER
). - Пароль (
POSTGRES_PASSWORD
). - Имя базы данных (
POSTGRES_DB
).
Инициализация бд выполняется с помощью SQL-скрипта, который смонтирован по пути /docker-entrypoint-initdb.d/initdb.sql
:
Все параметры расписаны в конфигурации по пути RG_LAB7/src/main/java/p3111/redgry/lab7/Config.java
, в том числе имя контейнера с базой данных.
вы должны прочитать файл конфигурации и понять, как называть сети и контейнеры.
При перезапуске контейнера база данных все внесенные изменения в бд исчезнут - сохраните их.
Официальная документация PostgreSQL Docker Image.
- Исходный код приложения использует систему сборки Maven.
- Используйте базовый образ сборщика:
maven:3.8.5-openjdk-17
. - Исходный java-код находится в RG_LAB7/src
- Команда для сборки jar-файла (далее - джарник):
mvn clean package
- После сборки джарник появится в директории
target
.
- Сервер:
- Базовый образ:
openjdk:17-jdk-slim
. - Контейнер обязан называться
lab7-server
.
- Базовый образ:
- Клиент:
- Базовый образ: тоже
openjdk:17-jdk-slim
.
- Базовый образ: тоже
Клиент и сервер используют одну кодовую базу (ps: конструктивная особенность исходной лабы) и имеют несколько точек входа, поэтому при запуске необходимо ее указать:
java -cp app_name.jar p3111.redgry.lab7.Client(Server)
Разделите процесс на два этапа:
- Сборка (используйте
maven:3.8.5-openjdk-17
). - Запуск (используйте
openjdk:17-jdk-slim
).
- Все команды можно записать в .sh скрипты, но на защите могу попросить воспроизвести их
- Соберите приложение и запустите контейнеры.
- Убедитесь, что:
- Перед сервером вы запускаете базу данных
- Контейнеры работают во внутренней сети.
- База данных сохронит свое состояние после перезапуска
- Проверьте мониторинг ресурсов с помощью
docker stats
.
- Отличия
RUN
отCMD
отENTRYPOINT
- Что такое слои и зачем они кэшируютс
- Многослойная сборка - как и зачем?
- Образ или контейнер?
- Операции с запущенными контейнерами
Если у вас выскакивает проблема вида NoClassDefFoundError: .../log4j/LogManager - значит вы неправильно закинули файлы в образ. спойлер - COPY . .
не сработает! вы должны закинуть в рабочую дирректорию src
и pom.xml
За основу была взята вот эта лаба, вроде как одна из самых популярных на вт. Однако, она имеет ряд веселых конструктивных особенностей, которые заставили меня переписать половину исходников, дабы это чудо стабильно запускалось. Подразумевалось, что после выполнения лабы, вы сможете потыкать сие творение, но, к сожалению, она не работает так как задумано изначально. На выполнение данной лабы это никак не влияет, но если будете тыкаться в само приложение - могут вылетать непонятные ошибки.
Цель лабы - показать, что используя docker или иные технологии контейнеризации в повседневной жизни, можно сильно упрощать себе жизнь и (почти) не зависить от окружения и оси при использовании чего либо - будь то алгосы и mlpack или обучения модели в облаке без изначально настроенного окружения.
В дальнейшем вы будете сталкиваться с контейнеризацией намного чаще, чем можете сейчас себе представить.