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

На каком уровне знаешь Docker

1.0 Junior🔥 211 комментариев
#Soft Skills и карьера

Комментарии (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-окружения.

На каком уровне знаешь Docker | PrepBro