Показаны различия между двумя версиями страницы.
| — |
методология_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` используется для запуска контейнеров из созданных образов. | ||
| + | * Следование лучшим практикам позволяет создавать эффективные, | ||
| + | |||