Инструменты пользователя

Инструменты сайта


методология_devops:создание_и_сборка_docker_контейнеров:start

Создание и сборка Docker-контейнеров

Введение

  • Цель: Научиться создавать собственные Docker-образы, которые затем используются для запуска Docker-контейнеров.
  • Основной инструмент: Dockerfile - файл с инструкциями для сборки образа.

Этапы создания Docker-контейнера (через образ)

  1. Написание Dockerfile: Определение базового образа, копирование файлов, установка зависимостей, настройка окружения, определение команды запуска.
  2. Сборка Docker-образа (docker build): Выполнение инструкций из Dockerfile для создания слоеного образа.
  3. Запуск Docker-контейнера (docker run): Создание и запуск экземпляра образа.

Dockerfile: Подробное рассмотрение инструкций

  • Структура Dockerfile: Последовательность инструкций, выполняемых Docker Daemon. Обычно одна инструкция - один слой в образе.
  • Основные инструкции (повторение и углубление):
    • FROM <image>[:<tag>] [AS <name>]:
      • Обязательная инструкция: Определяет базовый образ, на основе которого будет строиться новый образ.
      • <image>: Имя образа (например, ubuntu, python, node).
      • <tag>: Конкретная версия образа (например, 18.04, 3.9-slim, latest). Если не указан, используется latest.
      • AS <name>: Присваивает псевдоним базовому образу для использования в многоэтапных сборках (multi-stage builds).
    • RUN <command> (shell form) или RUN ["executable", "param1", "param2"] (exec form):
      • Выполняет команды внутри образа. Используется для установки программного обеспечения, настройки системы и выполнения других действий.
      • Shell form: Команда выполняется в оболочке (/bin/sh -c на Linux).
      • Exec form: Команда выполняется напрямую без оболочки. Рекомендуется для большей предсказуемости.
      • Примеры: dockerfile RUN apt-get update && apt-get install -y --no-install-recommends python3 python3-pip RUN ["pip3", "install", "-r", "requirements.txt"]
    • COPY <src>... <dest> или COPY --from=<name> <src>... <dest>:
      • Копирует файлы и директории с хостовой машины в образ.
      • <src>: Путь к файлу или директории на хосте. Может быть несколько источников.
      • <dest>: Абсолютный путь внутри образа, куда будут скопированы файлы.
      • --from=<name>: Используется в многоэтапных сборках для копирования артефактов из предыдущего этапа сборки.
      • Пример: dockerfile COPY ./app /app
    • ADD <src>... <dest> или ADD --from=<name> <src>... <dest>:
      • Аналогична COPY, но имеет дополнительные возможности:
        • Может распаковывать локальные tar-архивы.
        • Может загружать файлы по URL.
      • Рекомендуется использовать COPY для простых операций копирования.
      • Пример: dockerfile ADD [https://example.com/app.tar.gz](https://example.com/app.tar.gz) /app/
    • WORKDIR <path>:
      • Устанавливает рабочую директорию для последующих инструкций RUN, CMD, ENTRYPOINT, COPY, ADD.
      • Если директория не существует, она будет создана.
      • Пример: dockerfile WORKDIR /app
    • ENV <key>=<value> ...:
      • Устанавливает переменные окружения внутри образа.
      • Могут использоваться в последующих инструкциях и доступны в запущенном контейнере.
      • Пример: dockerfile ENV PYTHON_VERSION 3.9 RUN apt-get update && apt-get install -y python${PYTHON_VERSION}
    • EXPOSE <port> [<port>/<protocol>...]:
      • Объявляет порты, которые приложение внутри контейнера прослушивает.
      • Не публикует порт автоматически на хостовой машине. Это делается при запуске контейнера с флагом -p.
      • Используется для документирования и взаимодействия между связанными контейнерами.
      • Пример: dockerfile EXPOSE 80/tcp 443/tcp
    • CMD ["executable", "param1", "param2"] (exec form, рекомендуется) или CMD command param1 param2 (shell form) или CMD ["param1", "param2"] (как аргументы для ENTRYPOINT):
      • Указывает команду, которая будет выполнена при запуске контейнера из образа.
      • Может быть переопределена при запуске контейнера с помощью docker run <image> <command> [arguments].
      • В Dockerfile может быть только одна инструкция CMD.
      • Пример: dockerfile CMD ["python", "app.py"]
    • ENTRYPOINT ["executable", "param1", "param2"] (exec form, рекомендуется) или ENTRYPOINT command param1 param2 (shell form):
      • Указывает исполняемый файл, который будет запущен при старте контейнера.
      • Аргументы, переданные в docker run <image> [arguments], будут добавлены к команде ENTRYPOINT.
      • Часто используется для создания исполняемых образов.
      • Может быть переопределен при запуске контейнера с флагом --entrypoint.
      • В Dockerfile может быть только одна инструкция ENTRYPOINT.
      • Пример: dockerfile ENTRYPOINT ["/bin/my-app"]
    • USER <uid>[:<gid>] или USER <username>[:<groupname>]:
      • Устанавливает пользователя (и опционально группу), под которым будут выполняться последующие инструкции RUN, CMD и ENTRYPOINT.
      • Рекомендуется запускать процессы внутри контейнера от непривилегированного пользователя для безопасности.
      • Пример: dockerfile USER nobody
    • VOLUME ["/data"]:
      • Объявляет именованную или анонимную точку монтирования тома.
      • Позволяет сохранять данные, созданные внутри контейнера, вне его файловой системы.
      • Пример: dockerfile VOLUME ["/var/lib/mysql"]
    • ARG <variable>[=<value>]:
      • Определяет переменные, которые могут быть переданы во время сборки образа с помощью флага --build-arg.
      • Могут иметь значения по умолчанию.
      • Пример: dockerfile ARG NODE_VERSION=16 FROM node:${NODE_VERSION}-slim
    • ONBUILD <instruction>:
      • Выполняет указанную инструкцию в дочернем образе, созданном на основе текущего.
      • Полезно для создания базовых образов, которые ожидают определенной настройки в производных образах.
      • Пример: dockerfile ONBUILD COPY . /app ONBUILD WORKDIR /app
    • STOPSIGNAL <signal>:
      • Устанавливает системный сигнал, который будет отправлен контейнеру для его корректного завершения. По умолчанию SIGTERM.
      • Пример: dockerfile STOPSIGNAL SIGINT
    • HEALTHCHECK [--interval=<duration> --timeout=<duration> --start-period=<duration> --retries=<number>] CMD <command>:
      • Определяет команду для проверки работоспособности контейнера.
      • Docker Daemon периодически выполняет эту команду и определяет статус контейнера (starting, healthy, unhealthy).
      • Пример: dockerfile HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost:8080/health || exit 1
    • SHELL ["executable", "parameters"]:
      • Изменяет стандартную оболочку, используемую для инструкции RUN (shell form). По умолчанию ["/bin/sh", "-c"] на Linux.
      • Пример: dockerfile SHELL ["powershell", "-Command"] RUN Get-ChildItem C:\

Сборка Docker-образа (`docker build`)

  • Команда: docker build [OPTIONS] PATH | URL | -
  • Основные опции:
    • -t или --tag <repository>[:<tag>]: Присваивает имя и опциональный тег образу. Рекомендуется указывать имя пользователя/организации перед именем образа (например, myuser/my-app:latest).
    • -f или --file <path/to/Dockerfile>: Указывает путь к Dockerfile (по умолчанию ищется файл с именем Dockerfile в контексте сборки).
    • --build-arg <var>=<value>: Передает аргументы сборки, определенные в Dockerfile с помощью ARG.
    • --no-cache: Отключает использование кеша при сборке. Полезно для отладки или принудительной перестройки слоев.
    • --platform <os/arch>: Указывает целевую платформу для сборки (полезно для создания мультиархитектурных образов).
    • --target <stage>: Используется в многоэтапных сборках для сборки только определенного этапа.
  • Контекст сборки (Build Context): Набор файлов и директорий, доступных Docker Daemon во время сборки. Обычно это текущая директория (.), если не указан другой PATH.
  • Примеры: bash docker build -t myuser/my-web-app:v1 . docker build -f ./dockerfiles/api.Dockerfile -t myorg/my-api-service:latest ./api docker build --build-arg API_KEY=mysecretkey -t myuser/secure-app .

Многоэтапные сборки (Multi-Stage Builds)

  • Идея: Использование нескольких инструкций FROM в одном Dockerfile для создания промежуточных «строительных» образов, из которых копируются только необходимые артефакты в финальный, более легкий образ.
  • Преимущества:
    • Уменьшение размера финального образа: Исключение ненужных инструментов разработки, библиотек и промежуточных файлов.
    • Улучшение безопасности: Меньше установленных пакетов означает меньшую поверхность атаки.
    • Ускорение сборки: Кеширование промежуточных этапов.
  • Пример: Сборка Go-приложения dockerfile # Этап сборки FROM golang:1.17 AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download -x COPY . . RUN go build -o my-app # Финальный образ FROM alpine:latest WORKDIR /app COPY --from=builder /app/my-app . EXPOSE 8080 CMD ["./my-app"]

Запуск Docker-контейнера (`docker run`)

  • Команда: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • Основные опции (связанные со сборкой):
    • -d или --detach: Запускает контейнер в фоновом режиме.
    • -p или --publish [hostPort:]containerPort[/tcp|udp|sctp]: Публикует порт контейнера на хостовой машине.
    • --name <container_name>: Присваивает имя контейнеру.
    • -v или --volume [host_path:]container_path[:ro|rw]: Монтирует тома (bind mounts или named volumes).
    • -e или --env <KEY=VALUE>: Устанавливает переменные окружения для контейнера.
    • --rm: Автоматически удаляет контейнер после его остановки.
    • --entrypoint <executable>: Переопределяет ENTRYPOINT, определенный в Dockerfile.
    • --cmd <command> [args...]: Переопределяет CMD, определенный в Dockerfile.
  • Примеры: bash docker run -d -p 8080:80 myuser/my-web-app:v1 docker run --name my-running-app --rm myorg/my-api-service docker run -v my-data:/data my-database-image docker run -e API_URL=[http://api.example.com](http://api.example.com) my-app

Лучшие практики при создании Dockerfile

  • Используйте специфичные базовые образы: Выбирайте минимально необходимые образы.
  • Минимизируйте количество слоев: Объединяйте несколько команд RUN в одну с помощью &&.
  • Используйте кеш эффективно: Располагайте инструкции, которые редко меняются, в начале Dockerfile.
  • Не храните секреты в Dockerfile: Используйте --build-arg или переменные окружения во время запуска.
  • Создавайте непривилегированных пользователей: Используйте инструкцию USER.
  • Определяйте HEALTHCHECK: Для мониторинга работоспособности контейнера.
  • Используйте многоэтапные сборки: Для уменьшения размера финального образа.
  • Следуйте рекомендациям по безопасности Dockerfile: Проверяйте базовые образы, обновляйте пакеты.
  • Документируйте Dockerfile: Комментируйте важные шаги.

Заключение

  • Создание Docker-контейнеров начинается с написания Dockerfile.
  • Dockerfile содержит инструкции для сборки Docker-образа.
  • Команда docker build используется для создания образа из Dockerfile.
  • Команда docker run используется для запуска контейнеров из созданных образов.
  • Следование лучшим практикам позволяет создавать эффективные, безопасные и легко поддерживаемые Docker-образы.
методология_devops/создание_и_сборка_docker_контейнеров/start.txt · Последнее изменение: 2025/05/31 20:16 — kirill

DokuWiki Appliance - Powered by TurnKey Linux