Docker — это платформа для разработки, доставки и запуска приложений в контейнерах, которые обеспечивают совместимость, изоляцию и более легкое управление зависимостями.
Это основа Docker — среда выполнения (runtime), которая позволяет создавать и запускать контейнеры. Она состоит из трех частей:
Docker Daemon (dockerd): работает в фоне и управляет контейнерами, образами, сетями и томами Docker.
Docker Client (docker): командная строка, с помощью которой пользователи взаимодействуют с Docker Daemon.
REST API: обеспечивает интерфейс для программирования, позволяя приложениям взаимодействовать с Docker Daemon.
Образ - это неизменяемый файл, содержащий всё необходимое для выполнения приложения: код, библиотеки, зависимости и параметры среды. Образ служит шаблоном для создания контейнеров.
Контейнеры — это изолированные экземпляры, созданные на основе образов. Они имеют собственную файловую систему, процессы и сетевую изоляцию, но используют ядро хостовой ОС, обеспечивая легковесность и высокую скорость запуска.
Это хранилища для Docker-образов. Наиболее известным публичным реестром является Docker Hub, но можно развернуть и собственные приватные реестры. Регистры позволяют пользователям хранить и обмениваться образами.
Инструмент для определения и управления многоконтейнерными приложениями. С помощью файла docker-compose.yml можно определить и запустить приложение, состоящее из нескольких сервисов.
Встроенный в Docker механизм оркестрации, позволяющий управлять кластером Docker-серверов как единым целым. Он обеспечивает автоматическое распределение контейнеров по узлам кластера и балансировку нагрузки.
Механизм для постоянного хранения данных, используемый контейнерами. Тома позволяют отделять данные от жизненного цикла контейнеров, обеспечивая их сохранность даже при удалении контейнеров.
Dockerfile — это текстовый файл с инструкциями для создания образа Docker
Ключевые инструкции: FROM, RUN, CMD, COPY, ENTRYPOINT, EXPOSE и т.д.
Docker Compose используется для определения и управления многоконтейнерными Docker-приложениями. Он позволяет управлять несколькими контейнерами с помощью единого YAML файла (docker-compose.yml).
Образ — это шаблон или слепок, который используется для создания контейнеров.
Контейнер, в свою очередь, это запущенный экземпляр образа, который содержит все необходимые компоненты приложения и его зависимости.
Команда | Описание |
---|---|
docker pull |
Загружает образ из Docker Hub или другого Docker Registry на локальную машину Раздел: Образы Пример: docker pull ubuntu |
docker ps |
Показывает список запущенных контейнеров Раздел: Контейнеры Пример: docker ps |
docker build |
Создает Docker-образ из Dockerfile Раздел: Создание образов Пример: docker build -t my_image . |
docker run |
Запускает контейнер из указанного образа Раздел: Запуск контейнеров Пример: docker run -d -p 80:80 nginx |
docker compose |
Управляет многоконтейнерными Docker-приложениями с помощью Docker Compose Раздел: Оркестрация Пример: docker-compose up |
Dockerfile - это текстовый файл со скриптами, который содержит инструкции для сборки Docker-образа. Он определяет, как создавать образ, включая базовые образы, копирование файлов, установку пакетов и выполнение команд.
Команда | Описание |
---|---|
FROM |
Задает базовый образ для сборки нового образа. Это первая инструкция, используемая в Dockerfile. Пример: FROM python:3.9-slim |
LABEL |
Для добавления метаданных к образу, таких как автор или версия. Пример: LABEL maintainer="maintainer@example.com" |
RUN |
Выполняет команды в контейнере на стадии сборки образа. Используется для установки пакетов и настройки окружения. Пример: RUN apt-get update && apt-get install -y python3-pip |
COPY |
Копирует файлы и каталоги из контекста сборки на файл-систему образа. Пример: COPY . /app |
ADD |
Похожая на COPY команда, но с дополнением: может извлекать файлы из архивов и загружать файлы по URL. Пример: ADD package.tar.gz /app |
CMD |
Задает команду по умолчанию, которая выполняется при запуске контейнера. Может быть переопределена при запуске контейнера. Пример: CMD ["python", "app.py"] |
ENTRYPOINT |
Устанавливает основную команду и параметры, которые нельзя переопределить из командной строки при запуске контейнера, если не использовать специальные флаги (--entrypoint). Пример: ENTRYPOINT ["python", "app.py"] |
ENV |
Устанавливает переменные окружения в контейнере. Пример: ENV APP_ENV=production |
EXPOSE |
Документирует, что контейнер слушает на указанных портах в протоколе TCP или UDP. Это больше используется для информации и никак не настраивает сетевые правила. Пример: EXPOSE 80 |
VOLUME |
Создает точку монтирования для хранения данных, которые должны сохраняться между перезапусками контейнера. Пример: VOLUME ["/data"] |
WORKDIR |
Устанавливает рабочую директорию для следующих инструкций (например, RUN, CMD, ENTRYPOINT). Пример: WORKDIR /app |
ARG |
Определяет переменные, которые могут быть переданы на этапе сборки, например, через команду docker build. Пример: ARG VERSION=1.0 |
Да. можно
В Dockerfile, каждая инструкция FROM начинает новую стадию сборки, и это известный способ создания многоступенчатых сборок (multi-stage builds). Каждая стадия сборки начинается с FROM, и все инструкции, указанные после FROM, применяются к этой стадии до следующей инструкции FROM.
Использование нескольких FROM может иметь следующие последствия и преимущества:
Пример использования многоступенчатой сборки:
# Стадия сборки FROM golang:1.20 AS builder WORKDIR /app COPY . . RUN go build -o myapp# Финальная стадия FROM ubuntu:22.04 WORKDIR /app COPY --from=builder /app/myapp . CMD ["./myapp"]