Docker для разработчиков: образы, контейнеры и Compose

DevOps2026-10-10TryQuickToolBox

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

Почему Docker для разработчиков?

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

Образы: чертеж

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

Вот простой Dockerfile для приложения на Node.js:

FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

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

Контейнеры: запущенный экземпляр

Контейнер — это запускаемый экземпляр образа. Он изолирован, но использует ядро хост-ОС, что делает его легковесным. Вы запускаете контейнер с помощью docker run.

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

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

Ключевые команды:

Docker Compose: многоконтейнерные приложения

Реальные приложения часто требуют нескольких сервисов: веб-сервер, база данных, кэш. Docker Compose позволяет определять и запускать многоконтейнерные приложения с помощью одного YAML-файла.

Вот docker-compose.yml для приложения на Node.js с PostgreSQL:

version: '3.8'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgres://user:pass@db:5432/mydb
    depends_on:
      - db
  db:
    image: postgres:15
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
      - POSTGRES_DB=mydb
    volumes:
      - pgdata:/var/lib/postgresql/data
volumes:
  pgdata:

Запустите docker compose up, чтобы запустить оба сервиса. Compose управляет сетью, поэтому web может достичь db по имени сервиса.

Когда использовать Docker Compose, а когда обычный Docker

СценарийИспользование
Один контейнерdocker run
Несколько сервисов (приложение + БД)Docker Compose
Оркестрация в продакшенеKubernetes, Swarm

Лучшие практики для разработчиков

Распространенные ошибки

Конфликты портов: Если порт 3000 занят, сопоставьте с другим портом хоста: -p 3001:3000.

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

Медленные сборки: Упорядочивайте инструкции Dockerfile от наименее к наиболее часто изменяемым, чтобы использовать кэш.

Часто задаваемые вопросы

В чем разница между образом и контейнером?

Образ — это шаблон только для чтения; контейнер — это запущенный экземпляр этого образа. Вы можете запустить несколько контейнеров из одного образа.

Нужен ли Docker Compose для одного сервиса?

Нет. Compose раскрывается, когда у вас несколько сервисов. Для одного контейнера docker run проще.

Как сохранить данные в Docker?

Используйте тома. Определите именованный том в Compose или используйте -v с docker run, чтобы смонтировать директорию хоста или именованный том.

Готовы оптимизировать ваш рабочий процесс с Docker? Воспользуйтесь нашим JSON Formatter, чтобы быстро проверить и отформатировать файлы конфигурации JSON, такие как docker-compose.yml или package.json.