методология_devops:создание_и_сборка_docker_контейнеров:start
Создание и сборка Docker-контейнеров
Введение
Цель: Научиться создавать собственные Docker-образы, которые затем используются для запуска Docker-контейнеров.
Основной инструмент: Dockerfile - файл с инструкциями для сборки образа.
Этапы создания Docker-контейнера (через образ)
Написание Dockerfile: Определение базового образа, копирование файлов, установка зависимостей, настройка окружения, определение команды запуска.
Сборка Docker-образа (docker build): Выполнение инструкций из Dockerfile для создания слоеного образа.
Запуск 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, но имеет дополнительные возможности:
Рекомендуется использовать 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