Докер это инструмент контейнеризации: зачем он нужен

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

Образ и контейнер Docker: в чём разница

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

Контейнер, или container, это экземпляр образа со своими параметрами запуска и записываемым слоем. Он может работать или быть остановленным. Из общего шаблона можно создавать независимые экземпляры приложения.

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

Образ и контейнер Docker: в чём разница
ПонятиеЧто означаетКогда используется
ОбразПодготовленная файловая система и настройкиПередача приложения между средами
КонтейнерЭкземпляр образа с отдельным состояниемЗапуск программы и выполнение задач
DockerfileИнструкции сборкиИзменение состава будущего образа
RegistryРеестр образовХранение и получение сборок

Контейнеризация и виртуализация: сравнение

Виртуальная машина имеет гостевую операционную систему со своим ядром. Linux-контейнер использует ядро среды, где работает движок контейнеров. Поэтому ему не требуется загружать отдельную ОС для каждого приложения.

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

Контейнеризация и виртуализация: сравнение
КритерийКонтейнерВиртуальная машина
Ядро системыОбщее с хостом контейнерного движкаСобственное гостевое
Основная задачаПовторяемый запуск приложенияОтдельная операционная система
ИзоляцияПроцессы и настройки средыГостевая система через гипервизор
ОбслуживаниеОбновление образов и хостаОбновление гостевой ОС и приложений

Как работает Docker: архитектура и основные компоненты

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

В Linux пространства имён, namespaces, отделяют процессы и сеть контейнера. Группы управления, cgroups, позволяют учитывать и ограничивать ресурсы. Лимиты нужно настраивать: изоляция сама по себе не защищает от нехватки памяти.

  • Docker Engine: движок, который обеспечивает создание и запуск контейнеров.
  • Docker daemon, или dockerd: фоновая служба, которую также называют демоном; управляет контейнерами, образами, сетями и томами.
  • Docker client: интерфейс командной строки для отправки команд движку.
  • Docker Hub: реестр с публичными и приватными репозиториями; используется по умолчанию, если другой реестр не указан.
  • Docker Compose: инструмент описания и запуска связанных сервисов приложения.

Для каких задач используют контейнеры

  • Разработка: можно изолировать приложение от других программ и тестировать изменения отдельно от рабочей базы.
  • CI/CD: автоматическая сборка и проверки, передача готового образа на сервер. Инструкции хранят с кодом, например в GitHub.
  • Микросервисы: сайт, база и очередь работают отдельно. Дополнительные экземпляры помогут, если приложение поддерживает распределение нагрузки.

Установка Docker: с чего начать

Для рабочего компьютера подойдёт Docker Desktop с графическим интерфейсом, для Linux-сервера используйте Docker Engine. Установщик скачивайте с официального сайта.

Docker Desktop доступен для Windows, macOS и Linux. Для Linux-контейнеров он использует виртуальную машину, в Windows возможен запуск через WSL 2. На Linux Docker Engine можно устанавливать напрямую, без Desktop. Проверьте требования к системе в инструкции для вашей ОС.

Запустите Desktop либо службу Engine. На Linux команды могут требовать sudo. Группа docker даёт права уровня root: добавляйте только доверенных пользователей.

Как установить Docker Engine на Ubuntu

Ниже последовательность для Ubuntu с официальным репозиторием Docker. Сверьте поддерживаемый выпуск с документацией и удалите конфликтующие пакеты по её инструкции.

  1. Подготовьте apt и средства загрузки. Сохраните официальный ключ подписи пакетов в каталоге /etc/apt/keyrings.
  2. Добавьте описание репозитория в /etc/apt/sources.list.d/docker.sources. Одного скачивания ключа недостаточно: apt должен знать адрес источника пакетов.
  3. Обновите список пакетов и установите движок, клиент, containerd.io, Buildx и плагин Compose.
  4. Запустите hello-world. Подтверждающее сообщение означает, что движок смог получить образ и выполнить тестовый контейнер.
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo docker run hello-world

Первый контейнер и команды для работы

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

hello-world завершается после вывода сообщения. Пустой docker ps после теста ожидаем: для просмотра остановленных контейнеров добавьте -a.

В таблице demo обозначает учебный образ или контейнер из следующего раздела. На Ubuntu при необходимости добавляйте sudo. Для работающего веб-сервера выполните пример с Nginx ниже.

Первый контейнер и команды для работы
КомандаРезультат
docker build -t demo .Собирает образ demo из текущего каталога
docker run --name demo demoСоздаёт и запускает контейнер с именем demo
docker psПоказывает работающие контейнеры
docker ps -aПоказывает также остановленные контейнеры
docker logs demoВыводит журнал контейнера
docker stop demoОстанавливает работающий контейнер
docker start demoЗапускает остановленный контейнер
docker rm demoУдаляет остановленный контейнер
docker run -d --name web-demo -p 127.0.0.1:8080:80 nginx
docker logs web-demo
docker stats --no-stream web-demo

Dockerfile: как создать свой образ

Для учебного примера создайте пустой каталог. Добавьте туда текстовый файл message.txt с произвольным сообщением и Dockerfile из примера. Затем выполните docker build -t demo . в этом каталоге.

После сборки команда docker run --rm demo выведет сообщение и удалит завершившийся контейнер. Здесь образ Ubuntu служит основой для запуска стандартной команды cat. Это демонстрация сборки, а не конфигурация рабочего сайта.

Образ без тега, как ubuntu в примере, использует тег latest. Это имя не гарантирует новейшую версию, а его содержимое может измениться. Для повторяемой сборки закрепляйте базовый образ по digest и отдельно планируйте обновления.

  • FROM выбирает базовый образ.
  • WORKDIR задаёт рабочий каталог для последующих инструкций.
  • COPY добавляет файл в образ из контекста сборки.
  • RUN выполняет действие при сборке, например установку библиотек.
  • CMD задаёт команду по умолчанию при запуске.
  • EXPOSE описывает предполагаемый порт приложения, но не публикует его на хосте.
FROM ubuntu
WORKDIR /app
COPY message.txt .
CMD cat /app/message.txt

Docker Hub: как передать образ на сервер

Команда docker images показывает локальные образы, docker pull nginx загружает образ из реестра. Для публикации своего образа сначала создайте репозиторий и войдите командой docker login. Затем присвойте образу тег командой docker tag demo USER/demo:practice и отправьте его через docker push USER/demo:practice. Замените USER именем своего пространства в Docker Hub.

На сервере выполните docker pull USER/demo:practice. Реестр передаёт образ, но не данные томов и не конфигурацию окружения. Перед отправкой проверьте содержимое сборки и настройки видимости репозитория.

Docker Compose: запуск связанных сервисов

Compose нужен, когда приложение состоит из нескольких контейнеров. В YAML-файле вы описываете сервисы, сети и постоянные данные. Можно задать разные образы для сайта и базы, сохранив общую конфигурацию запуска.

Предпочтительное имя файла: compose.yaml. Поддерживается также compose.yml, а имена docker-compose.yaml и docker-compose.yml сохранены для совместимости. Поместите файл в каталог проекта и запускайте команды из него.

Для начала сохраните этот compose.yaml в пустой папке и выполните docker compose up -d. Откройте http://localhost:8081 на компьютере с Docker. Здесь один сервис: так проще проверить запуск перед добавлением базы или очереди.

В файле image выбирает образ, ports публикует порт, volumes подключает именованный том. Том nginx-cache хранится отдельно от контейнера. docker compose ps показывает состояние, docker compose logs выводит журнал. docker compose down удаляет контейнеры и созданные сети, сохраняя именованные тома; флаг -v удалит и их.

depends_on задаёт порядок запуска, но сам по себе не ждёт готовности базы принимать запросы. Для ожидания используйте healthcheck и условие service_healthy.

services:
  web:
    image: nginx
    ports:
      - '127.0.0.1:8081:80'
    volumes:
      - nginx-cache:/var/cache/nginx
volumes:
  nginx-cache: {}

Хранение данных: тома и каталоги хоста

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

Для постоянных данных используйте том, или volume. Он существует отдельно от контейнера. Удаление самого тома уничтожает его данные.

Bind mount подключает каталог хоста: вы редактируете файлы снаружи, приложение видит их внутри. При переносе учитывайте расположение каталогов.

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

Сеть контейнеров и доступ к приложению

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

Чтобы сайт был доступен через хост, публикуют порт контейнера. Параметр -p связывает порт хоста с портом приложения. EXPOSE в Dockerfile только документирует ожидаемый порт и сам по себе доступ не открывает.

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

Ограничения и частые ошибки

Образ должен соответствовать ОС и архитектуре процессора. Для другой платформы нужна отдельная сборка или эмуляция. Многоплатформенный образ объединяет подходящие варианты.

Изоляция приложений помогает разделять процессы, но не даёт абсолютной защиты. Безопасность зависит от прав, подключённых каталогов, сетевых настроек и обновлений. Доступ к управлению движком следует давать только доверенным пользователям.

  • Лимиты ресурсов нужно задавать: по умолчанию контейнер не имеет собственного ограничения памяти.
  • Не копируйте весь рабочий каталог без проверки. Файл .dockerignore позволяет исключить ненужные файлы из контекста сборки.
  • Не выдавайте приложению права root без необходимости. Определите, какие действия ему действительно нужны.
  • Не храните пароли в Dockerfile и коде. Для Linux-контейнеров Compose поддерживает secrets с доступом на уровне сервиса.
  • Не считайте переменные окружения защищённым хранилищем: значения могут попасть в диагностический вывод.
  • Не меняйте приложение вручную внутри контейнера вместо исправления образа. Иначе после пересоздания правки исчезнут.

Как найти ошибку и когда нужна оркестрация

Начните с docker ps -a: проверьте состояние контейнера. Затем прочитайте docker logs web-demo. Команда docker stats --no-stream web-demo показывает текущую загрузку ресурсов. docker events помогает проследить события создания, запуска и остановки; для выхода нажмите Ctrl+C.

Если порт занят, выберите другой порт хоста. Если имя web-demo уже существует, остановите и удалите именно учебный контейнер либо задайте новое имя. Ошибка подключения к демону требует проверки запущенной службы и прав пользователя.

Compose описывает сервисы приложения. Для распределения между серверами применяют оркестраторы: Kubernetes или встроенный в Engine режим Swarm. Они управляют размещением и числом экземпляров. Для первого локального проекта кластер не требуется.

Когда обсудить контейнеры при поддержке сайта

Перед переносом перечислите компоненты сайта, подключения и данные. Определите, кто отвечает за восстановление.

В seosite1 можно заказать поддержку и обслуживание сайтов. Поддержка стоит от 30 тыс. ₽ в месяц, итоговую цену называем после брифа. Работаем удалённо по России и отвечаем по будням с 10 до 19.

При обращении опишите хостинг, проблему и порядок обновления сайта. Сроки называем после брифа.

Источники

  1. Docker Docs: платформа, архитектура и компоненты
  2. Docker Docs: установка Docker Engine на Ubuntu
  3. Docker Docs: справочник Dockerfile
  4. Docker Docs: Docker Desktop и виртуальная машина на Linux
  5. Docker Docs: устройство и команды Compose
  6. Docker Docs: хранение данных
  7. Docker Docs: сети и публикация портов
  8. Docker Docs: справочник команд Docker