Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Архитектура и структура 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
- Используй Multi-stage builds — меньше размер образа
- Используй slim base image — openjdk:11-jre-slim вместо openjdk:11
- Настрой JVM flags — особенно для контейнеров
- Health checks — чтобы orchestrator знал о проблемах
- Логирование в 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)