💻

docker_compose_ru

Docker: образы, контейнеры, сети, volumes, Dockerfile. Docker Compose: микросервисы, оркестрация, best practices

Системный промпт

<skill_instructions creator="a4f8cc09-f7ff-41e8-8b94-0d3e6173b7af">

Docker и Docker Compose — Полное руководство

1. ОСНОВЫ DOCKER

Базовые концепции

  • Image — шаблон (образ), из которого создаётся контейнер
  • Container — запущенный экземпляр образа
  • Registry — хранилище образов (Docker Hub, GitLab Registry)
  • Volume — персистентное хранилище данных
  • Network — изоляция и коммуникация контейнеров

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

# Образы
docker images
docker pull nginx:1.21
docker build -t myapp:1.0 .
docker rmi nginx:1.21
docker prune

# Контейнеры
docker ps -a
docker run -d nginx:1.21
docker run -it ubuntu bash
docker start <container>
docker stop <container>
docker rm <container>
docker logs -f <container>
docker exec -it <container> sh

# Volumes
docker volume ls
docker volume create mydata

# Сети
docker network ls
docker network create mynet

2. DOCKERFILE

Базовый Dockerfile

FROM python:3.11-slim

LABEL maintainer="dev@example.com"
WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

Multi-stage build

# Stage 1: Build
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Stage 2: Production
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules

USER node
EXPOSE 3000
CMD ["node", "dist/index.js"]

.dockerignore

__pycache__
*.pyc
.git
.env
node_modules
Dockerfile
docker-compose.yml

3. DOCKER COMPOSE

Базовый docker-compose.yml

version: '3.8'

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8000:8000"
    environment:
      - DEBUG=1
      - DATABASE_URL=postgres://user:pass@db:5432/myapp
    depends_on:
      - db
      - redis
    volumes:
      - ./app:/app
    restart: unless-stopped

  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: myapp
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user -d myapp"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    depends_on:
      - web

volumes:
  postgres_data:

networks:
  default:
    driver: bridge

Запуск и управление

docker-compose up -d
docker-compose up -d --build
docker-compose logs -f
docker-compose logs -f web
docker-compose down
docker-compose down -v
docker-compose up -d --scale web=3
docker-compose restart

Переменные окружения

# .env файл
COMPOSE_PROJECT_NAME=myapp
DATABASE_URL=postgres://user:pass@db:5432/myapp

# docker-compose.yml
services:
  web:
    env_file:
      - .env
    environment:
      - DATABASE_URL=${DATABASE_URL}

Зависимости и healthcheck

services:
  web:
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started

4. МИКРОСЕРВИСЫ С DOCKER COMPOSE

version: '3.8'

services:
  api-gateway:
    build: ./api-gateway
    ports:
      - "8080:8080"
    depends_on:
      - user-service
      - order-service

  user-service:
    build: ./services/user
    depends_on:
      postgres:
        condition: service_healthy

  order-service:
    build: ./services/order
    environment:
      - KAFKA_BROKERS=kafka:9092
    depends_on:
      - postgres
      - kafka

  postgres:
    image: postgres:15-alpine
    healthcheck:
      test: ["CMD-SHELL", "pg_isready"]
      interval: 10s

  kafka:
    image: confluentinc/cp-kafka:7.4.0
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
    depends_on:
      - zookeeper

  zookeeper:
    image: confluentinc/cp-zookeeper:7.4.0

  redis:
    image: redis:7-alpine
    volumes:
      - redis_data:/data

volumes:
  postgres_data:
  redis_data:

Nginx для микросервисов

upstream user_service {
    server user-service:8001;
}

upstream order_service {
    server order-service:8002;
}

server {
    listen 80;

    location /api/users {
        proxy_pass http://user_service;
    }

    location /api/orders {
        proxy_pass http://order_service;
    }
}

5. СЕТИ И VOLUMES

Типы сетей

docker network create my-bridge
docker network create --driver overlay my-overlay
networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true

Volumes

volumes:
  db_data:
  
services:
  db:
    volumes:
      - db_data:/var/lib/postgresql/data
      - /host/path:/container/path

Резервное копирование

docker run --rm -v volume_name:/data -v $(pwd):/backup alpine tar czf /backup/backup.tar.gz -C /data .
docker run --rm -v volume_name:/data -v $(pwd):/backup alpine tar xzf /backup/backup.tar.gz -C /data

6. ОПТИМИЗАЦИЯ И BEST PRACTICES

Безопасность

RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

# Сканирование уязвимостей
trivy image myapp:latest

Ограничение ресурсов

services:
  web:
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 256M

Структура проекта

project/
├── docker-compose.yml
├── Dockerfile
├── .dockerignore
├── nginx.conf
├── .env
└── services/
    ├── api/
    │   ├── Dockerfile
    └── worker/
        ├── Dockerfile

7. TROUBLESHOOTING

Частые проблемы

ПроблемаРешение
Container exits immediatelydocker logs, проверь CMD
Port already allocatedИзмените порт
Volume permissionsUSER в Dockerfile
Network unreachableПроверьте networks
Image not founddocker pull или build

Диагностика

docker ps -a
docker stats
docker-compose logs --tail=100
docker-compose exec web sh
docker-compose build --no-cache

8. CI/CD С DOCKER

GitLab CI

build:
  stage: build
  image: docker:20.10.16
  services:
    - docker:20.10.16-dind
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

deploy:
  stage: deploy
  script:
    - docker-compose up -d
  only:
    - main

9. DOCKER SWARM

docker swarm init
docker stack deploy -c docker-compose.yml myapp
docker service ls
docker service scale myapp_web=5
docker service update --image myapp:2.0 myapp_web

</skill_instructions>

Категория
💻 Разработка
Автор
ya
Платформа
Сам Решу

Попробуйте этот навык

Зарегистрируйтесь и используйте навык «docker_compose_ru» бесплатно.