Docker контейнеризация

Docker — это инструмент для создания, развертывания и управления контейнерами, которые представляют собой легковесные и изолированные среды для запуска приложений. Контейнеризация позволяет упаковать приложение и все его зависимости в единый объект, который можно запускать на любой системе, где установлен Docker.

Контейнеры — это не виртуальные машины. Они используют ядро операционной системы хоста, что позволяет им быть более легковесными и быстрыми в запуске, в отличие от виртуальных машин, которые требуют собственное ядро. Это делает контейнеры идеальными для разработки, тестирования и развертывания приложений.

Установка Docker

Для начала работы с Docker необходимо установить сам инструмент. Он доступен для всех основных операционных систем: Windows, macOS и Linux. Процесс установки можно разделить на несколько шагов:

  1. Скачивание Docker: Для Windows и macOS Docker предоставляет инсталлятор, который можно загрузить с официального сайта. Для Linux рекомендуется использовать пакетный менеджер соответствующей операционной системы.

  2. Установка: После скачивания инсталлятора для Windows или macOS нужно просто следовать инструкциям на экране. Для Linux, в зависимости от дистрибутива, установка может варьироваться. Например, на Ubuntu установка может быть выполнена с помощью команды:

    sudo apt-get install docker-ce docker-ce-cli containerd.io
  3. Проверка установки: После завершения установки можно проверить, работает ли Docker, с помощью команды:

    docker --version

    Это покажет версию Docker, что подтвердит его успешную установку.

Основные концепции Docker

Контейнеры

Контейнер — это изолированная среда, в которой запускается приложение. Контейнеры обеспечивают:

  • Изоляция: Каждый контейнер работает независимо от других, что позволяет избежать конфликтов между зависимостями различных приложений.
  • Переносимость: Контейнеры можно запускать на любой машине, где установлен Docker, независимо от операционной системы хоста, что делает их идеальными для CI/CD и разработки.

Контейнеры обычно создаются на основе образов. Образ представляет собой набор файлов, метаданных и инструкций, которые описывают, как создать контейнер. Например, образ может содержать все зависимости для запуска веб-приложения.

Docker-образы

Образ Docker — это заготовка, на основе которой создаются контейнеры. Он включает все необходимые файлы и зависимости для приложения. Образы можно создавать вручную с помощью Dockerfile или использовать уже готовые образы из Docker Hub.

Пример Dockerfile для создания образа Node.js приложения:

FROM node:14

WORKDIR /app
COPY . .

RUN npm install
CMD ["npm", "start"]

Этот Dockerfile делает следующее:

  • Использует официальный образ node:14 в качестве базового.
  • Копирует файлы проекта в контейнер.
  • Устанавливает зависимости с помощью npm install.
  • Запускает приложение командой npm start.

Создать образ из этого Dockerfile можно с помощью команды:

docker build -t my-node-app .

Docker Hub

Docker Hub — это публичный репозиторий образов, где можно найти готовые образы для большинства популярных технологий (Node.js, Python, MySQL и других). Для загрузки образа из Docker Hub используется команда:

docker pull node:14

Это загрузит образ Node.js версии 14 с Docker Hub.

Docker Compose

Docker Compose — это инструмент для работы с многоконтейнерными приложениями. Он позволяет описать все контейнеры, их конфигурацию и связи между ними в одном YAML файле.

Пример docker-compose.yml файла для Node.js и базы данных MongoDB:

version: '3'
services:
  web:
    build: .
    ports:
      - "3000:3000"
  db:
    image: mongo
    volumes:
      - ./data/db:/data/db

В этом примере:

  • web — это сервис, который строится на основе Dockerfile в текущем каталоге.
  • db — это сервис, использующий официальный образ MongoDB с монтированием локальной папки для хранения данных.

Запуск всех сервисов в проекте выполняется одной командой:

docker-compose up

Работа с контейнерами

Запуск контейнера

Для того чтобы запустить контейнер из образа, используется команда:

docker run <опции> <образ>

Пример запуска контейнера с веб-приложением:

docker run -d -p 3000:3000 my-node-app

Этот пример запускает контейнер в фоновом режиме (-d), а также пробрасывает порт 3000 контейнера на порт 3000 хоста (-p 3000:3000).

Просмотр запущенных контейнеров

Для просмотра всех запущенных контейнеров используется команда:

docker ps

Если нужно увидеть все контейнеры, включая остановленные, применяется флаг -a:

docker ps -a

Остановка контейнера

Остановить контейнер можно с помощью команды:

docker stop <идентификатор_контейнера>

Удаление контейнера

Чтобы удалить остановленный контейнер, используется команда:

docker rm <идентификатор_контейнера>

Удалить контейнер можно и в процессе его работы, но для этого нужно сначала остановить его.

Работа с сетями и томами

Docker позволяет создавать сети и тома для взаимодействия контейнеров между собой и для хранения данных.

Сети

Docker создает сети для контейнеров, позволяя им общаться друг с другом. Например, можно создать сеть и подключить несколько контейнеров к ней:

docker network create my-network
docker run --network my-network --name container1 my-image
docker run --network my-network --name container2 my-image

Томы

Тома используются для хранения данных, которые должны быть доступны даже после удаления контейнера. Пример создания и использования тома:

docker volume create my-volume
docker run -v my-volume:/data my-image

В этом примере данные из контейнера будут храниться в томе, и они останутся доступными, даже если контейнер будет удален.

Советы по работе с Docker

  1. Оптимизация Dockerfile: Чтобы сократить время сборки и размер образов, следует минимизировать количество слоев и избегать ненужных установок. Например, лучше объединять несколько команд RUN в одну, используя &&:

    RUN apt-get update && apt-get install -y package1 package2
  2. Использование .dockerignore: Подобно .gitignore, файл .dockerignore позволяет исключать из образа файлы, которые не нужны в контейнере (например, node_modules, временные файлы).

  3. Многоступенчатая сборка: Многоступенчатая сборка позволяет создавать образы с меньшим размером, разделяя этапы сборки и деплоя. Пример:

    # Этап сборки
    FROM node:14 AS build
    WORKDIR /app
    COPY . .
    RUN npm install
    RUN npm run build
    
    # Этап продакшн
    FROM node:14
    WORKDIR /app
    COPY --from=build /app/build /app
    CMD ["npm", "start"]

Этот подход помогает избежать включения в конечный образ лишних файлов, таких как исходный код и инструменты для сборки.

  1. Использование переменных окружения: Для конфиденциальной информации или настроек, которые могут меняться в разных средах, полезно использовать переменные окружения. Пример:

    ENV NODE_ENV=production

Управление версиями с помощью Docker

Чтобы работать с конкретными версиями образов, можно указывать их тег, например:

docker pull node:14

Здесь node:14 указывает на образ Node.js версии 14. Без тега будет загружена последняя версия образа.

Для более сложных случаев можно использовать теги и репозитории для управления версиями и создания различных вариантов образов.