Как создать и развернуть контейнеры Docker

DockerBeginner
Практиковаться сейчас

Введение

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

Основы Docker

Что такое Docker?

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

Основные понятия контейнеризации

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

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

Архитектура Docker

graph TD
    A[Клиент Docker] --> B[Дэмон Docker]
    B --> C[Выполняющая среда контейнеров]
    B --> D[Репозиторий образов]
    C --> E[Контейнеры]

Установка на Ubuntu 22.04

## Обновить индекс пакетов
sudo apt update

## Установить зависимости
sudo apt install apt-transport-https ca-certificates curl software-properties-common

## Добавить официальный ключ GPG Docker
curl -fsSL | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

## Настроить стабильный репозиторий
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg]  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

## Установить Docker Engine
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io

Проверка установки Docker

## Проверить версию Docker
docker --version

## Протестировать установку Docker
sudo docker run hello-world

Ключевые компоненты Docker

  1. Клиент Docker: Командная строка для взаимодействия с Docker
  2. Дэмон Docker: Фоновый сервис, управляющий контейнерами и образами
  3. Образы Docker: Читаемые шаблоны, используемые для создания контейнеров
  4. Контейнеры Docker: Выполняемые экземпляры образов Docker

Основные команды Docker

## Список запущенных контейнеров
docker ps

## Список всех контейнеров
docker ps -a

## Скачать образ
docker pull ubuntu

## Запустить контейнер
docker run -it ubuntu /bin/bash

Создание образов Docker

Понимание образов Docker

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

Основы Dockerfile

Dockerfile — это текстовый документ, содержащий инструкции для сборки образа Docker. Каждая инструкция создаёт новый слой в образе.

graph TD
    A[Dockerfile] --> B[Базовый образ]
    A --> C[Копирование файлов приложения]
    A --> D[Установка зависимостей]
    A --> E[Настройка среды]
    A --> F[Определение команды запуска]

Пример Dockerfile для приложения Python

## Использование официального образа Python в качестве базового
FROM python:3.9-slim

## Установка рабочей директории в контейнере
WORKDIR /app

## Копирование файла requirements
COPY requirements.txt .

## Установка необходимых пакетов
RUN pip install --no-cache-dir -r requirements.txt

## Копирование кода приложения
COPY . .

## Указание номера порта
EXPOSE 5000

## Определение команды для запуска приложения
CMD ["python", "app.py"]

Стратегии сборки образов

Стратегия Описание Сценарий использования
Одноэтапная сборка Простая, прямая сборка Маленькие, несложные приложения
Многоэтапная сборка Оптимизация размера и безопасности Сложные приложения с зависимостями сборки

Пример многоэтапной сборки

## Этап 1: Этап сборки
FROM maven:3.8.1-openjdk-11 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn package

## Этап 2: Этап выполнения
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=build /app/target/myapp.jar .
EXPOSE 8080
CMD ["java", "-jar", "myapp.jar"]

Сборка и управление образами Docker

## Сборка образа
docker build -t myapp:v1 .

## Список локальных образов
docker images

## Удаление образа
docker rmi myapp:v1

## Добавление тега к образу
docker tag myapp:v1 myregistry/myapp:latest

Техники оптимизации образов

  1. Использование минимальных базовых образов
  2. Минимизация количества слоёв
  3. Использование кэша сборки
  4. Удаление ненужных файлов
  5. Использование файла .dockerignore

Слои образа Docker

graph TD
    A[Базовый слой образа] --> B[Слой установки зависимостей]
    B --> C[Слой кода приложения]
    C --> D[Слой конфигурации]
    D --> E[Слой точки входа]

Управление контейнерами

Управление жизненным циклом контейнеров

Контейнеры Docker имеют сложный жизненный цикл с несколькими состояниями и стратегиями управления. Понимание этих состояний имеет решающее значение для эффективной оркестрации контейнеров.

graph LR
    A[Создан] --> B[Запущен]
    B --> C[Приостановлен]
    B --> D[Остановлен]
    D --> E[Удален]

Основные операции с контейнерами

Операция Команда Описание
Запуск docker start <container> Запуск остановленного контейнера
Остановка docker stop <container> Вежливая остановка работающего контейнера
Перезапуск docker restart <container> Остановка и запуск контейнера
Удаление docker rm <container> Удаление контейнера

Расширенное управление контейнерами

## Запуск контейнера в режиме открепления
docker run -d --name webserver nginx

## Просмотр подробностей о контейнере
docker inspect webserver

## Просмотр логов контейнера
docker logs webserver

## Выполнение команд внутри работающего контейнера
docker exec -it webserver /bin/bash

Управление ресурсами и ограничениями

## Ограничение ЦП и памяти
docker run -d \
  --cpus="1.5" \
  --memory="512m" \
  --name limited-container \
  nginx

Сетевое взаимодействие контейнеров

graph TD
    A[Сеть хоста] --> B[Мостовая сеть]
    B --> C[Пользовательская сеть]
    C --> D[Сеть наложения]

Пример конфигурации сети

## Создание пользовательской сети
docker network create myapp-network

## Запуск контейнеров в пользовательской сети
docker run -d --network=myapp-network --name db postgres
docker run -d --network=myapp-network --name webapp nginx

Масштабирование контейнеров

## Использование Docker Compose для масштабирования
version: '3'
services:
webapp:
image: nginx
deploy:
replicas: 5

Мониторинг производительности

## Статистика контейнеров в реальном времени
docker stats

## Список работающих контейнеров с использованием ресурсов
docker ps -q | xargs docker stats --no-stream

Резервное копирование и миграция контейнеров

## Экспорт контейнера в архив tar
docker export container_name > container.tar

## Импорт контейнера из архива
docker import container.tar new_image_name

Резюме

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