Показаны различия между двумя версиями страницы.
— |
методология_devops:создание_и_сборка_docker_контейнеров:start [2025/05/31 20:16] (текущий) kirill создано |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | # Создание и сборка Docker-контейнеров | ||
+ | |||
+ | ## Введение | ||
+ | |||
+ | * **Цель: | ||
+ | * **Основной инструмент: | ||
+ | |||
+ | ## Этапы создания Docker-контейнера (через образ) | ||
+ | |||
+ | 1. **Написание Dockerfile: | ||
+ | 2. **Сборка Docker-образа (`docker build`):** Выполнение инструкций из Dockerfile для создания слоеного образа. | ||
+ | 3. **Запуск Docker-контейнера (`docker run`):** Создание и запуск экземпляра образа. | ||
+ | |||
+ | ## Dockerfile: Подробное рассмотрение инструкций | ||
+ | |||
+ | * **Структура Dockerfile: | ||
+ | * **Основные инструкции (повторение и углубление): | ||
+ | * **`FROM < | ||
+ | * **Обязательная инструкция: | ||
+ | * `< | ||
+ | * `< | ||
+ | * `AS < | ||
+ | * **`RUN < | ||
+ | * **Выполняет команды внутри образа.** Используется для установки программного обеспечения, | ||
+ | * **Shell form:** Команда выполняется в оболочке (`/bin/sh -c` на Linux). | ||
+ | * **Exec form:** Команда выполняется напрямую без оболочки. Рекомендуется для большей предсказуемости. | ||
+ | * **Примеры: | ||
+ | ```dockerfile | ||
+ | RUN apt-get update && apt-get install -y --no-install-recommends python3 python3-pip | ||
+ | RUN [" | ||
+ | ``` | ||
+ | * **`COPY < | ||
+ | * **Копирует файлы и директории с хостовой машины в образ.** | ||
+ | * `< | ||
+ | * `< | ||
+ | * `--from=< | ||
+ | * **Пример: | ||
+ | ```dockerfile | ||
+ | COPY ./app /app | ||
+ | ``` | ||
+ | * **`ADD < | ||
+ | * **Аналогична `COPY`, но имеет дополнительные возможности: | ||
+ | * Может распаковывать локальные tar-архивы. | ||
+ | * Может загружать файлы по URL. | ||
+ | * **Рекомендуется использовать `COPY` для простых операций копирования.** | ||
+ | * **Пример: | ||
+ | ```dockerfile | ||
+ | ADD [https:// | ||
+ | ``` | ||
+ | * **`WORKDIR < | ||
+ | * **Устанавливает рабочую директорию для последующих инструкций `RUN`, `CMD`, `ENTRYPOINT`, | ||
+ | * Если директория не существует, | ||
+ | * **Пример: | ||
+ | ```dockerfile | ||
+ | WORKDIR /app | ||
+ | ``` | ||
+ | * **`ENV < | ||
+ | * **Устанавливает переменные окружения внутри образа.** | ||
+ | * Могут использоваться в последующих инструкциях и доступны в запущенном контейнере. | ||
+ | * **Пример: | ||
+ | ```dockerfile | ||
+ | ENV PYTHON_VERSION 3.9 | ||
+ | RUN apt-get update && apt-get install -y python${PYTHON_VERSION} | ||
+ | ``` | ||
+ | * **`EXPOSE < | ||
+ | * **Объявляет порты, которые приложение внутри контейнера прослушивает.** | ||
+ | * **Не публикует порт автоматически на хостовой машине.** Это делается при запуске контейнера с флагом `-p`. | ||
+ | * **Используется для документирования и взаимодействия между связанными контейнерами.** | ||
+ | * **Пример: | ||
+ | ```dockerfile | ||
+ | EXPOSE 80/tcp 443/tcp | ||
+ | ``` | ||
+ | * **`CMD [" | ||
+ | * **Указывает команду, | ||
+ | * **Может быть переопределена** при запуске контейнера с помощью `docker run < | ||
+ | * **В Dockerfile может быть только одна инструкция `CMD`.** | ||
+ | * **Пример: | ||
+ | ```dockerfile | ||
+ | CMD [" | ||
+ | ``` | ||
+ | * **`ENTRYPOINT [" | ||
+ | * **Указывает исполняемый файл, который будет запущен при старте контейнера.** | ||
+ | * **Аргументы, | ||
+ | * **Часто используется для создания исполняемых образов.** | ||
+ | * **Может быть переопределен** при запуске контейнера с флагом `--entrypoint`. | ||
+ | * **В Dockerfile может быть только одна инструкция `ENTRYPOINT`.** | ||
+ | * **Пример: | ||
+ | ```dockerfile | ||
+ | ENTRYPOINT ["/ | ||
+ | ``` | ||
+ | * **`USER < | ||
+ | * **Устанавливает пользователя (и опционально группу), | ||
+ | * Рекомендуется запускать процессы внутри контейнера от непривилегированного пользователя для безопасности. | ||
+ | * **Пример: | ||
+ | ```dockerfile | ||
+ | USER nobody | ||
+ | ``` | ||
+ | * **`VOLUME ["/ | ||
+ | * **Объявляет именованную или анонимную точку монтирования тома.** | ||
+ | * Позволяет сохранять данные, | ||
+ | * **Пример: | ||
+ | ```dockerfile | ||
+ | VOLUME ["/ | ||
+ | ``` | ||
+ | * **`ARG < | ||
+ | * **Определяет переменные, | ||
+ | * Могут иметь значения по умолчанию. | ||
+ | * **Пример: | ||
+ | ```dockerfile | ||
+ | ARG NODE_VERSION=16 | ||
+ | FROM node: | ||
+ | ``` | ||
+ | * **`ONBUILD < | ||
+ | * **Выполняет указанную инструкцию в дочернем образе, | ||
+ | * Полезно для создания базовых образов, | ||
+ | * **Пример: | ||
+ | ```dockerfile | ||
+ | ONBUILD COPY . /app | ||
+ | ONBUILD WORKDIR /app | ||
+ | ``` | ||
+ | * **`STOPSIGNAL < | ||
+ | * **Устанавливает системный сигнал, | ||
+ | * **Пример: | ||
+ | ```dockerfile | ||
+ | STOPSIGNAL SIGINT | ||
+ | ``` | ||
+ | * **`HEALTHCHECK [--interval=< | ||
+ | * **Определяет команду для проверки работоспособности контейнера.** | ||
+ | * Docker Daemon периодически выполняет эту команду и определяет статус контейнера (`starting`, | ||
+ | * **Пример: | ||
+ | ```dockerfile | ||
+ | HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http:// | ||
+ | ``` | ||
+ | * **`SHELL [" | ||
+ | * **Изменяет стандартную оболочку, | ||
+ | * **Пример: | ||
+ | ```dockerfile | ||
+ | SHELL [" | ||
+ | RUN Get-ChildItem C:\ | ||
+ | ``` | ||
+ | |||
+ | ## Сборка Docker-образа (`docker build`) | ||
+ | |||
+ | * **Команда: | ||
+ | * **Основные опции: | ||
+ | * `-t` или `--tag < | ||
+ | * `-f` или `--file < | ||
+ | * `--build-arg < | ||
+ | * `--no-cache`: | ||
+ | * `--platform < | ||
+ | * `--target < | ||
+ | * **Контекст сборки (Build Context):** Набор файлов и директорий, | ||
+ | * **Примеры: | ||
+ | ```bash | ||
+ | docker build -t myuser/ | ||
+ | docker build -f ./ | ||
+ | docker build --build-arg API_KEY=mysecretkey -t myuser/ | ||
+ | ``` | ||
+ | |||
+ | ## Многоэтапные сборки (Multi-Stage Builds) | ||
+ | |||
+ | * **Идея: | ||
+ | * **Преимущества: | ||
+ | * **Уменьшение размера финального образа: | ||
+ | * **Улучшение безопасности: | ||
+ | * **Ускорение сборки: | ||
+ | * **Пример: | ||
+ | ```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: | ||
+ | WORKDIR /app | ||
+ | COPY --from=builder /app/my-app . | ||
+ | EXPOSE 8080 | ||
+ | CMD [" | ||
+ | ``` | ||
+ | |||
+ | ## Запуск Docker-контейнера (`docker run`) | ||
+ | |||
+ | * **Команда: | ||
+ | * **Основные опции (связанные со сборкой): | ||
+ | * `-d` или `--detach`: Запускает контейнер в фоновом режиме. | ||
+ | * `-p` или `--publish [hostPort: | ||
+ | * `--name < | ||
+ | * `-v` или `--volume [host_path: | ||
+ | * `-e` или `--env < | ||
+ | * `--rm`: Автоматически удаляет контейнер после его остановки. | ||
+ | * `--entrypoint < | ||
+ | * `--cmd < | ||
+ | * **Примеры: | ||
+ | ```bash | ||
+ | docker run -d -p 8080:80 myuser/ | ||
+ | docker run --name my-running-app --rm myorg/ | ||
+ | docker run -v my-data:/ | ||
+ | docker run -e API_URL=[http:// | ||
+ | ``` | ||
+ | |||
+ | ## Лучшие практики при создании Dockerfile | ||
+ | |||
+ | * **Используйте специфичные базовые образы: | ||
+ | * **Минимизируйте количество слоев: | ||
+ | * **Используйте кеш эффективно: | ||
+ | * **Не храните секреты в Dockerfile: | ||
+ | * **Создавайте непривилегированных пользователей: | ||
+ | * **Определяйте `HEALTHCHECK`: | ||
+ | * **Используйте многоэтапные сборки: | ||
+ | * **Следуйте рекомендациям по безопасности Dockerfile: | ||
+ | * **Документируйте Dockerfile: | ||
+ | |||
+ | ## Заключение | ||
+ | |||
+ | * Создание Docker-контейнеров начинается с написания Dockerfile. | ||
+ | * Dockerfile содержит инструкции для сборки Docker-образа. | ||
+ | * Команда `docker build` используется для создания образа из Dockerfile. | ||
+ | * Команда `docker run` используется для запуска контейнеров из созданных образов. | ||
+ | * Следование лучшим практикам позволяет создавать эффективные, | ||
+ | |||