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

Какая структура у Docker?

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

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

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

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

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

Основная архитектура

Docker использует client-server архитектуру с компонентами:

1. Docker Client — инструмент для взаимодействия

docker run myimage
docker ps
docker build -t myimage .

2. Docker Daemon (dockerd) — процесс, который управляет контейнерами

  • Слушает API запросы от Client
  • Создаёт и удаляет контейнеры
  • Управляет образами
  • Работает как background service

3. Docker Registry — хранилище образов

  • Docker Hub (публичный)
  • Приватные реестры (GitLab, Artifactory)

Слои Docker

Docker построен на слоях абстракции:

Application (Java приложение)
    ↓
Container Runtime (containerd)
    ↓
Container Networking
    ↓
Container Storage (overlay2, aufs)
    ↓
Linux Kernel (namespaces, cgroups)
    ↓
Operating System

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

Docker Image — шаблон для создания контейнеров

FROM openjdk:11
WORKDIR /app
COPY target/app.jar .
CMD ["java", "-jar", "app.jar"]

Docker Container — запущенный экземпляр образа

  • Изолированный процесс
  • Собственная файловая система
  • Собственная сеть
  • Собственная памяти и CPU

Dockerfile — набор инструкций для создания образа

Структура файловой системы контейнера

Container Layer (Read-Write)
    ↓
Image Layers (Read-Only)
    ├─ App Layer
    ├─ Library Layer
    ├─ Base OS Layer
    └─ Kernel (shared with host)

Каждый слой — это набор изменений в файловой системе. Docker использует Copy-on-Write для эффективности.

Docker в Java приложениях

Типичный Dockerfile для Spring Boot:

FROM openjdk:11 as builder
WORKDIR /build
COPY . .
RUN ./mvnw clean package -DskipTests

FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=builder /build/target/app.jar .
EXPOSE 8080
CMD ["java", "-jar", "app.jar"]

Жизненный цикл контейнера

image create → container start → running → container stop → exit
  (docker run)     (docker start)        (docker stop)      (remove)

Состояния контейнера:

  • created: контейнер создан, но не запущен
  • running: контейнер работает
  • paused: контейнер приостановлен
  • stopped: контейнер остановлен
  • exited: контейнер завершился

Docker Network

Для взаимодействия контейнеров:

# Создать сеть
docker network create mynetwork

# Подключить контейнер
docker run --network mynetwork --name db postgres
docker run --network mynetwork --name app myappimage

# Внутри приложения: connection to db:5432

Docker Storage (Volumes)

Для сохранения данных:

# Named volume
docker run -v mydata:/data myimage

# Bind mount
docker run -v /host/path:/container/path myimage

# Volume для БД
docker run -v postgres_data:/var/lib/postgresql postgres

Docker в production (Kubernetes)

Когда Docker контейнеров много, используют Kubernetes:

Kubernetes Cluster
├─ Master (Control Plane)
│  ├─ API Server
│  ├─ Scheduler
│  └─ Controller Manager
├─ Worker Node 1
│  └─ Pod (container)
├─ Worker Node 2
│  ├─ Pod (container)
│  └─ Pod (container)
└─ Worker Node 3
   └─ Pod (container)

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

# Образы
docker build -t myimage:1.0 .          # Создать образ
docker push myimage:1.0                # Загрузить в registry
docker pull myimage:1.0                # Скачать из registry
docker images                          # Список образов

# Контейнеры
docker run myimage                     # Создать и запустить
docker ps                              # Список запущенных
docker ps -a                           # Все контейнеры
docker logs container_id               # Логи
docker exec -it container_id bash      # Вход в контейнер
docker stop container_id               # Остановить
docker rm container_id                 # Удалить

# Сеть
docker network ls                      # Список сетей
docker network create mynet            # Создать сеть

# Volumes
docker volume ls                       # Список volumes
docker volume create mydata            # Создать volume

Best Practices для Java

  1. Используй Multi-stage builds — меньше размер образа
  2. Используй slim base image — openjdk:11-jre-slim вместо openjdk:11
  3. Настрой JVM flags — особенно для контейнеров
  4. Health checks — чтобы orchestrator знал о проблемах
  5. Логирование в stdout — Docker собирает логи в STDOUT
# Health check для Kubernetes
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:8080/health || exit 1

Итоговая структура

Docker — это инструмент для containerization. Основная идея: упаковать приложение вместе со всеми зависимостями в image, который можно запустить на любой машине с Docker установленным. Это решает problem "works on my machine".

Для Java разработчиков Docker критичен для:

  • Локальной разработки (docker-compose)
  • CI/CD pipeline (сборка и тестирование в контейнерах)
  • Production deployment (с Kubernetes)
Какая структура у Docker? | PrepBro