Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Мой уровень знания Docker — Advanced (Продвинутый)
Обладаю глубокими знаниями Docker и контейнеризации Java приложений с 10+ летним опытом архитектуры и разработки. Вот мой профиль компетенций.
1. Основные концепции (базовый уровень)
# Создание и управление контейнерами
docker build -t myapp:1.0 . # построение образа
docker run -d -p 8080:8080 myapp # запуск контейнера
docker ps # список активных контейнеров
docker logs -f container_id # просмотр логов
docker stop container_id # остановка
docker rm container_id # удаление
# Работа с образами
docker images # список образов
docker pull nginx:latest # загрузка из репозитория
docker push myrepo/myapp:1.0 # отправка в репозиторий
docker tag myapp:1.0 myapp:latest # создание тега
2. Docker для Java приложений
Dockerfile для Spring Boot:
# Многоэтапная сборка (Multi-stage build)
FROM maven:3.9-eclipse-temurin-21-jammy AS builder
WORKDIR /app
COPY . .
RUN mvn clean package -DskipTests
# Runtime образ
FROM eclipse-temurin:21-jre-jammy
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
# Оптимизация JVM для контейнеров
ENV JAVA_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:G1NewCollectionHeuristicPercent=35 -XX:G1ReservePercent=20"
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
3. Docker Compose для локальной разработки
version: '3.9'
services:
app:
build: .
container_name: java-app
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/mydb
SPRING_DATASOURCE_USERNAME: user
SPRING_DATASOURCE_PASSWORD: pass
depends_on:
- postgres
- redis
networks:
- app-network
volumes:
- ./logs:/app/logs # для логов
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
interval: 30s
timeout: 10s
retries: 3
postgres:
image: postgres:15-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
ports:
- "5432:5432"
volumes:
- postgres-data:/var/lib/postgresql/data
- ./migrations:/docker-entrypoint-initdb.d
networks:
- app-network
redis:
image: redis:7-alpine
ports:
- "6379:6379"
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
postgres-data:
4. Оптимизация образов Java
Уменьшение размера образа:
# Плохо: базовый образ 400+ МБ
FROM openjdk:21
RUN apt-get update && apt-get install -y curl
COPY app.jar /app.jar
CMD ["java", "-jar", "/app.jar"]
# Хорошо: alpine образ ~50 МБ
FROM eclipse-temurin:21-jre-alpine
RUN apk add --no-cache curl
COPY app.jar /app.jar
CMD ["java", "-jar", "/app.jar"]
# Отлично: distroless образ ~20 МБ
FROM gcr.io/distroless/java21-debian12
COPY --from=builder /app/target/app.jar /app/app.jar
CMD ["app.jar"]
Оптимизация слоёв Dockerfile:
# Плохо: зависимости перестраиваются при изменении кода
FROM maven:3.9
WORKDIR /app
COPY . . # копируем ВСЁ
RUN mvn clean package # перестройка при изменении кода
# Хорошо: кэширование слоёв
FROM maven:3.9
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline # кэшируются зависимости
COPY src ./src # копируем только код
RUN mvn clean package # только сборка, без загрузки зависимостей
5. Production-ready конфигурация
FROM eclipse-temurin:21-jre-alpine
# Пользователь без привилегий root
RUN addgroup -g 1001 -S appgroup && \
adduser -u 1001 -S appuser -G appgroup
WORKDIR /app
# Копируем от builder
COPY --from=builder --chown=appuser:appgroup /app/target/app.jar .
# JVM оптимизация для контейнеров
ENV JAVA_OPTS="\
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+PrintGCDetails \
-XX:+PrintGCDateStamps \
-Xloggc:/app/logs/gc.log \
-XX:+UseStringDeduplication \
-Dspring.jpa.hibernate.ddl-auto=validate"
EXPOSE 8080
USER appuser
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD ["wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/actuator/health"]
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
6. Управление ресурсами контейнеров
services:
app:
build: .
# Ограничение ресурсов
deploy:
resources:
limits:
cpus: '2' # максимум 2 ядра
memory: 2G # максимум 2 GB памяти
reservations:
cpus: '1' # гарантированно 1 ядро
memory: 1G # гарантированно 1 GB
environment:
# JVM память
JAVA_OPTS: "-Xms512m -Xmx1500m" # от 512MB до 1.5GB
7. Сетевое взаимодействие контейнеров
# Создание кастомной сети
docker network create mynet
# Контейнеры в одной сети видят друг друга по hostname
docker run --network mynet --name postgres postgres
docker run --network mynet -e DB_HOST=postgres myapp
# Проверка сети
docker network inspect mynet
8. Volume'ы для персистентности
# Named volume (управляемый Docker)
docker run -v postgres-data:/var/lib/postgresql/data postgres
# Bind mount (локальная папка)
docker run -v $(pwd)/logs:/app/logs myapp
# Read-only volume
docker run -v /config:/app/config:ro myapp
# Volume для разработки (hot reload)
docker run -v $(pwd)/src:/app/src myapp
9. Мониторинг и логирование
# Просмотр ресурсов контейнера
docker stats container_id
# Проверка истории запуска
docker inspect container_id
# Просмотр истории образа
docker history myapp:1.0
docker-compose для ELK стека:
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.0.0
environment:
- discovery.type=single-node
- xpack.security.enabled=false
ports:
- "9200:9200"
kibana:
image: docker.elastic.co/kibana/kibana:8.0.0
ports:
- "5601:5601"
app:
build: .
environment:
LOGGING_LEVEL_ROOT: INFO
LOGGING_FILE_NAME: /var/log/app.log
volumes:
- ./logs:/var/log
10. CI/CD интеграция
# .github/workflows/docker.yml (GitHub Actions)
name: Build and Push
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and Push
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: myrepo/myapp:latest,myrepo/myapp:${{ github.sha }}
cache-from: type=registry,ref=myrepo/myapp:buildcache
cache-to: type=registry,ref=myrepo/myapp:buildcache,mode=max
11. Сложные сценарии
Сетевые политики:
services:
app:
ports:
- "8080:8080" # доступ из вне
internal-service:
expose: # только для других контейнеров
- "8081"
Init процесс для обработки сигналов:
RUN apt-get install -y dumb-init
ENTRYPOINT ["/usr/bin/dumb-init", "--"]
CMD ["java", "-jar", "app.jar"]
Graceful shutdown:
STOPSIGNAL SIGTERM
ENTRYPOINT ["java", "-jar", "app.jar"]
12. Практический уровень
Я умею:
- ✅ Писать production-ready Dockerfile'ы
- ✅ Оптимизировать размер и производительность образов
- ✅ Управлять сетями и volume'ами
- ✅ Настраивать health checks и restart policies
- ✅ Реализовать graceful shutdown
- ✅ Интегрировать в CI/CD pipeline'ы
- ✅ Отлаживать проблемы в контейнерах
- ✅ Работать с Docker registry'ями
- ✅ Оптимизировать JVM для контейнеров
- ✅ Использовать Docker Compose для локальной разработки
Заключение
Мой уровень Docker соответствует профессионалу с опытом:**
- Архитектуры микросервисов
- Production deployment'а
- Контейнеризации Java приложений
- Оптимизации под cloud платформы (Kubernetes, Docker Swarm)
- Полного DevOps цикла от разработки до deployment'а
Я понимаю не только команды Docker, но и философию контейнеризации, особенности работы JVM в контейнерах и best practices production-окружения.