← Назад к вопросам

Как работает Docker и для чего он нужен?

1.0 Junior🔥 121 комментариев
#Docker, Kubernetes и DevOps

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Docker: Контейнеризация приложений

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

Как работает Docker

Docker использует технологию контейнеризации на уровне операционной системы:

Приложение + Библиотеки + ОС минимум = Docker образ
                    ↓
            Docker контейнер

Основные компоненты:

  1. Docker Image (образ) — шаблон для создания контейнеров. Содержит:

    • Базовую ОС (Linux)
    • Приложение
    • Все зависимости
    • Переменные окружения
    • Команды запуска
  2. Docker Container (контейнер) — запущенный экземпляр образа. Изолирован от хост-системы и других контейнеров.

  3. Docker Registry — репозиторий образов (Docker Hub, GitLab Registry и т.д.)

Пример Dockerfile

# Базовый образ с Java 17
FROM openjdk:17-slim

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

# Копирование jar файла
COPY target/myapp.jar app.jar

# Порт, который слушает приложение
EXPOSE 8080

# Команда запуска
ENTRYPOINT ["java", "-jar", "app.jar"]

Жизненный цикл Docker

// Аналогия с Java:
// Dockerfile — это как Java класс
// Image — это как скомпилированный .class файл
// Container — это как созданный объект (new MyClass())

Команды Docker:

# Создание образа
docker build -t myapp:1.0 .

# Запуск контейнера
docker run -p 8080:8080 myapp:1.0

# Просмотр контейнеров
docker ps

# Остановка контейнера
docker stop container-id

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

Для чего нужен Docker

1. Консистентность окружения

Программа работает одинаково на локальной машине, в CI/CD, на production. Нет проблем "у меня работает, а на сервере нет".

// До Docker
Разработчик: Java 11, PostgreSQL 12, Redis 5
QA: Java 8, PostgreSQL 13, Redis 4
Production: Java 13, PostgreSQL 14, Redis 6
// Всё ломается!

// С Docker
// Все используют ОДИНАКОВОЕ окружение из контейнера

2. Микросервисная архитектура

docker-compose.yml:
version: 3
services:
  user-service:
    image: user-service:1.0
    ports:
      - "8001:8080"
  order-service:
    image: order-service:1.0
    ports:
      - "8002:8080"
  database:
    image: postgres:14
    environment:
      POSTGRES_PASSWORD: secret

Кажда сервис — отдельный контейнер, которым можно управлять независимо.

3. Развёртывание и масштабирование

# Запустить 3 копии приложения за load balancer
docker run -p 8080:8080 myapp:1.0
docker run -p 8081:8080 myapp:1.0
docker run -p 8082:8080 myapp:1.0

4. CI/CD Pipeline

# Build → Test → Push to Registry → Deploy
docker build -t registry.com/myapp:latest .
docker push registry.com/myapp:latest
# На сервере:
docker pull registry.com/myapp:latest
docker run registry.com/myapp:latest

Изоляция ресурсов

Каждый контейнер имеет собственный:

  • Файловую систему
  • Переменные окружения
  • Сетевые интерфейсы
  • PID namespace (процессы)
# Контейнер видит только свои процессы
docker run myapp ps aux
# Результат: только процессы в контейнере, не хоста

Производительность

В отличие от виртуальных машин, Docker контейнеры:

  • Легче — ОС не дублируется
  • Быстрее — нет гипервизора
  • Экономнее — меньше ресурсов
Окружение          Размер    Запуск
--------------------------------------
Виртуальная машина 2-3 GB   Минуты
Docker контейнер   ~100 MB   Секунды

Применение в Java проектах

Spring Boot приложения отлично подходят для Docker:

@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}
FROM maven:3.8.1-openjdk-17 as build
WORKDIR /app
COPY . .
RUN mvn clean package

FROM openjdk:17-slim
COPY --from=build /app/target/app.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

Данный образ можно одной командой запустить на любой машине, и приложение будет работать идентично.