Челлендж по многоэтапной сборке Docker

DockerBeginner
Практиковаться сейчас

Введение

Многоэтапная сборка Docker (Multi-stage Build) — это мощная функция, позволяющая использовать несколько инструкций FROM в одном Dockerfile. Каждый этап может использовать свой базовый образ, что позволяет отделить процесс компиляции и сборки приложения от финального образа, предназначенного для запуска. В этом челлендже вы на практике примените этот метод для создания оптимизированного Docker-образа.

Создание Dockerfile с многоэтапной сборкой

В этом разделе вам необходимо подготовить Dockerfile, реализующий концепцию многоэтапной сборки.

Задачи

  • Создайте новый Dockerfile, состоящий из двух этапов. На первом этапе должна происходить сборка приложения: установка необходимых зависимостей и запуск скрипта сборки. На втором этапе формируется финальный образ: в него копируется только скомпилированный код из первого этапа, устанавливаются зависимости, необходимые исключительно для работы (production), и открывается нужный порт.

Пример

Ниже описана последовательность действий, которую вам нужно выполнить:

  1. Создайте новую директорию myapp и перейдите в нее.

    mkdir myapp
    cd myapp
    
  2. Загрузите исходный код NodeJS из репозитория https://github.com/labex-labs/nodejs-example.git.

    git clone https://github.com/labex-labs/nodejs-example.git
    

    Переместите загруженные файлы непосредственно в корень директории myapp.

    mv nodejs-example/* .
    rm -rf nodejs-example
    
  3. Создайте в директории myapp файл с именем Dockerfile со следующим содержимым:

    ## Stage 1: Build the application
    FROM node:14-alpine AS base
    WORKDIR /app
    COPY . ./
    RUN npm install
    
    ## Stage 2: Create the final image
    FROM node:14-alpine
    WORKDIR /app
    COPY --from=base /app/ .
    EXPOSE 3000
    CMD [ "npm", "start" ]
    

Требования

Для успешного прохождения этого этапа необходимо:

  • Создать директорию myapp по пути /home/labex/project.
  • Клонировать исходный код NodeJS в директорию myapp.
  • Создать Dockerfile в директории myapp с указанным выше содержанием.

Сборка Docker-образа

На этом этапе вам предстоит собрать образ, используя подготовленный ранее Dockerfile.

Задачи

  • Соберите новый образ с именем myapp.

Пример

Вот как это должно выглядеть:

  1. Используйте команду docker build для создания образа с тегом myapp.

    docker build -t myapp .
    
  2. Проверьте, что образ был успешно создан, с помощью команды docker images.

Требования

Для выполнения этой задачи необходимо:

  • Выполнить команду docker build внутри директории /home/labex/project/myapp.
  • Присвоить образу имя myapp.

Запуск Docker-контейнера

Теперь пришло время запустить контейнер на основе созданного образа.

Задачи

  • Запустите контейнер из образа myapp. Контейнер должен пробрасывать порт 3000 (внутри контейнера) на порт 3030 (на хост-машине). После запуска проверьте доступность приложения через браузер.

Пример

Пример выполнения задачи:

  1. Запустите новый контейнер с именем my-app.

    docker run --name my-app -p 3030:3000 myapp
    
  2. Откройте веб-браузер и перейдите по адресу http://localhost:3030, чтобы увидеть работающее приложение.

Требования

Для завершения челленджа необходимо:

  • Запустить контейнер с именем my-app.
  • Настроить маппинг портов: порт 3000 контейнера на порт 3030 хоста.

Резюме

Поздравляем! В этом испытании вы научились использовать многоэтапную сборку Docker для создания компактных и эффективных образов. Разделяя среду сборки и среду выполнения в одном Dockerfile, вы можете значительно уменьшить размер итогового образа и повысить безопасность приложения. Теперь вы готовы применять технологию Multi-stage Build в своих собственных проектах.

✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться