Что такое Docker и почему разработчикам его нужно изучить?
Практический разбор Docker для разработчиков: контейнеры против ВМ, основные команды, Dockerfile и как начать использовать его в реальных проектах.
Docker постоянно встречается в объявлениях о вакансиях и инструкциях по настройке, и если вы никогда не работали с контейнерами, это может казаться стеной, которую нужно преодолеть, прежде чем писать полноценный код. На самом деле это не так сложно, если разобраться с терминологией.
Что такое контейнер на самом деле
Контейнер упаковывает ваше приложение со всем, что ему нужно для работы: код, runtime, системные библиотеки и файлы конфигурации. Это не виртуальная машина. Виртуальная машина виртуализирует всю операционную систему, включая ядро, что означает, что её запуск может занять минуту и использовать несколько гигабайт оперативной памяти. Контейнер использует ядро хост-машины и изолирует только процесс, поэтому он запускается менее чем за секунду и обычно потребляет десятки мегабайт вместо гигабайт.
Эта разница — причина, по которой Docker так быстро захватил локальную разработку и CI pipelines. Вы можете запустить базу данных Postgres, кэш Redis и сервер приложения на одном ноутбуке без их прямой установки на вашу ОС.
Основные компоненты, которые вам нужно знать
Есть четыре термина, которые охватывают большую часть того, с чем вы будете иметь дело каждый день:
- Image: read-only шаблон, построенный из Dockerfile. Думайте о нём как о снимке файловой системы плюс метаданные о том, как его запустить.
- Container: работающий экземпляр image. Вы можете запускать, останавливать и удалять контейнеры без влияния на image, из которого они были созданы.
- Dockerfile: текстовый файл с инструкциями по построению image, строка за строкой.
- Registry: место, где хранятся и откуда загружаются image, чаще всего Docker Hub.
Минимальный Dockerfile для приложения Node.js выглядит так:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Соберите его командой docker build -t my-app . и запустите docker run -p 3000:3000 my-app. Флаг -p пробрасывает порт на вашей машине на порт внутри контейнера, что позволяет вам доступить к приложению из браузера.
Команды, которые вы будете использовать постоянно
Несколько команд покрывают большинство повседневных задач:
docker ps— список запущенных контейнеровdocker ps -a— список всех контейнеров, включая остановленныеdocker images— список образов на вашей машинеdocker logs <container>— проверить вывод запущенного или упавшего контейнераdocker exec -it <container> sh— открыть shell внутри запущенного контейнераdocker rm/docker rmi— удалить контейнеры и образы, которые больше не нужны
Последняя пара важнее, чем думают люди. Docker с удовольствием позволит месту на диске исчезнуть в старых образах и остановленных контейнерах. Периодическое выполнение docker system prune освобождает неожиданно много места.
Почему docker-compose меняет рабочий процесс
Большинство реальных проектов требуют более одного контейнера: сервер приложения, базу данных, может быть, кэш. Писать docker run команды для каждого — надоедает быстро. docker-compose.yml позволяет определить весь stack в одном файле:
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: devpassword
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
Запустите docker compose up и оба сервиса запустятся вместе, находясь в одной сети, так что web может достичь db по имени сервиса. Это настройка, которую вы увидите почти в каждом README открытого проекта, и её понимание означает, что вы можете клонировать проект и запустить его за минуты вместо того, чтобы вручную устанавливать Postgres, Redis и всё остальное, что нужно приложению.
Где люди спотыкаются в самом начале
Volumes сбивают с толку почти всех поначалу. Без volume всё, что написано внутри контейнера, исчезает при его удалении, что проблематично для баз данных. Секция volumes в файле compose выше связывает именованный volume с путём внутри контейнера, так что данные сохраняются после перезагрузок.
Ещё одна частая ошибка — копирование node_modules или .git в образ потому, что нет файла .dockerignore. Добавьте его, как .gitignore:
node_modules
.git
.env
Это ускоряет сборки и уменьшает размер образов, что важно, когда вы загружаете образы в registry или развёртываете на Kubernetes.
Что изучать после основ
Когда построение и запуск контейнеров станут привычными, следующие полезные навыки — multi-stage builds для более компактных production образов, понимание режимов Docker networking и чтение выхода docker inspect когда что-то не подключается правильно. Ничего сложного, просто непривычно в первый раз.
Для подробнее об упаковке реальных приложений и их подключении к облачным pipeline развёртывания, смотрите разделы DevOps и Cloud на Korra Studio.
Написано с помощью ИИ, проверено и опубликовано Михалом Пильхом (CISSP), Korra Studio.
Это одна заметка из базы знаний Korra Studio — платформа сочетает каждую тему с наставничеством один на один.
Начать бесплатноarrow_forward