Docker Compose

ისწავლეთ Docker Compose-ის შესახებ მრავალკონტეინერიანი აპლიკაციების განსაზღვრისა და გაშვებისთვის

Docker Compose

Docker Compose არის ინსტრუმენტი მრავალკონტეინერიანი Docker აპლიკაციების განსაზღვრისა და გაშვებისთვის. ის იყენებს YAML ფაილს აპლიკაციის სერვისების, ქსელებისა და volume-ების კონფიგურაციისთვის, რაც საშუალებას გაძლევთ გაუშვათ და მართოთ მრავალი კონტეინერი ერთი ბრძანებით.

Docker Compose-ით თქვენ განსაზღვრავთ სრულ აპლიკაციის სტეკს დეკლარაციული გზით, რაც ამარტივებს:

  • რთული აპლიკაციების დანერგვას ურთიერთდამოკიდებული სერვისებით
  • თანმიმდევრული development, testing და production გარემოების შენარჩუნებას
  • აპლიკაციის კონფიგურაციისა და დანერგვის სამუშაო პროცესების გამარტივებას
  • ინდივიდუალური სერვისების მასშტაბირებას საჭიროებისამებრ
  • მთელი აპლიკაციის სასიცოცხლო ციკლის მართვას ერთი ფაილიდან

ძირითადი კონცეფციები

სერვისები

  • ინდივიდუალური კონტეინერები, რომლებიც ქმნიან თქვენს აპლიკაციას
  • განისაზღვრება docker-compose.yml-ში საკუთარი კონფიგურაციით
  • შეუძლიათ დამოუკიდებლად მასშტაბირება (მრავალი ინსტანციის გაშვება)
  • იზიარებენ ქსელებს კომუნიკაციისთვის და volume-ებს მონაცემებისთვის
  • თითოეულ სერვისს შეიძლება ჰქონდეს საკუთარი build ინსტრუქციები, გარემოს ცვლადები და runtime კონფიგურაციები
  • ავტომატურად ენიჭებათ DNS სახელები სერვისების აღმოსაჩენად

ქსელები

  • ავტომატური ქსელის შექმნა თითოეული Compose პროექტისთვის
  • ჩაშენებული სერვისების აღმოჩენა (სერვისებს შეუძლიათ კომუნიკაცია სერვისის სახელების გამოყენებით)
  • მორგებული ქსელის კონფიგურაცია (დრაივერები, ქვექსელები, gateway-ები)
  • იზოლირებული გარემოები უსაფრთხოებისა და რესურსების მართვისთვის
  • გარე ქსელებისა და ქსელის alias-ების მხარდაჭერა
  • ქსელთან მიერთების კონტროლი თითოეული სერვისისთვის

Volume-ები

  • მუდმივი მონაცემთა საცავი, რომელიც უძლებს კონტეინერის გადატვირთვას
  • გაზიარებულია სერვისებს შორის მონაცემთა გაცვლისთვის
  • დასახელებული volume-ები მარტივი მართვისა და სარეზერვო ასლებისთვის
  • Bind mount-ების მხარდაჭერა development სამუშაო პროცესებისთვის
  • Volume დრაივერები ღრუბლოვანი და სპეციალიზებული საცავებისთვის
  • კონფიგურაციის ოფციები წარმადობისა და უსაფრთხოებისთვის

Docker Compose ფაილი

docker-compose.yml ფაილი არის ძირითადი კონფიგურაციის ფაილი, რომელიც განსაზღვრავს თქვენს მრავალკონტეინერიან აპლიკაციას. ის იყენებს სტრუქტურირებულ YAML ფორმატს წინასწარ განსაზღვრული გასაღებებითა და იერარქიებით.

docker-compose.yml ფაილის ძირითადი სტრუქტურა:

version: '3.8'
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./www:/usr/share/nginx/html
    depends_on:
      - db
    restart: unless-stopped
    environment:
      - NGINX_HOST=example.com
    networks:
      - frontend
      - backend
  
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: myapp
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - backend
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 30s
      timeout: 10s
      retries: 3

networks:
  frontend:
    # ნაგულისხმევი bridge ქსელი
  backend:
    # ქსელი შიდა კომუნიკაციისთვის
    internal: true

volumes:
  db_data:
    # მუდმივი დასახელებული volume მონაცემთა ბაზისთვის

ეს მაგალითი განსაზღვრავს:

  • ორ სერვისს (web და db) თავისი კონფიგურაციებით
  • ორ ქსელს (frontend და backend), სადაც backend შიდაა
  • ერთ დასახელებულ volume-ს (db_data) მუდმივი შენახვისთვის
  • დამოკიდებულებებს სერვისებს შორის depends_on-ით
  • Health check-ებს სერვისის ხელმისაწვდომობის უზრუნველსაყოფად
  • ქსელის სეგმენტაციას უსაფრთხოებისთვის

გავრცელებული ბრძანებები

Docker Compose გთავაზობთ ბრძანებების მდიდარ ნაკრებს თქვენი მრავალკონტეინერიანი აპლიკაციების სრული სასიცოცხლო ციკლის სამართავად:

# სერვისების გაშვება (ინტერაქტიული რეჟიმი)
docker-compose up
# ეს ბრძანება:
# - აგებს ან იღებს image-ებს საჭიროების შემთხვევაში
# - ქმნის ქსელებსა და volume-ებს
# - იწყებს კონტეინერებს
# - ერთვის კონტეინერების გამომავალ ნაკადს
# - Ctrl+C აჩერებს ყველა კონტეინერს

# გაშვება detached რეჟიმში (ფონურად)
docker-compose up -d
# უშვებს კონტეინერებს ფონურ რეჟიმში

# სერვისების შეჩერება, მაგრამ კონტეინერების, ქსელებისა და volume-ების შენარჩუნება
docker-compose stop

# სერვისების შეჩერება და კონტეინერების, ქსელების წაშლა, მაგრამ volume-ების შენარჩუნება
docker-compose down

# ყველაფრის შეჩერება და წაშლა, volume-ების ჩათვლით
docker-compose down --volumes

# ყველა სერვისის ლოგების ნახვა
docker-compose logs

# კონკრეტული სერვისის ლოგების თვალყურის დევნა
docker-compose logs -f web

# კონკრეტული სერვისის მასშტაბირება მრავალ ინსტანციაზე
docker-compose up -d --scale web=3 --scale worker=2

# მიმდინარე პროექტში კონტეინერების სია
docker-compose ps

# ბრძანების შესრულება გაშვებულ სერვისის კონტეინერში
docker-compose exec web sh

# ერთჯერადი ბრძანების გაშვება ახალ კონტეინერში
docker-compose run --rm web npm test

# სერვისების ხელახლა აგება
docker-compose build

# კონფიგურაციის ფაილის ვალიდურობის შემოწმება
docker-compose config

# გარემოს ცვლადების ჩვენება
docker-compose config --services

# გაშვებული პროცესების სია კონტეინერებში
docker-compose top

ეს ბრძანებები შეიძლება გაერთიანდეს სხვადასხვა ოფციებთან თქვენი აპლიკაციის სტეკის ზუსტი კონტროლისთვის.

გარემოს ცვლადები

გარემოს ცვლადების პრიორიტეტი

Docker Compose-ს აქვს გარემოს ცვლადების კონკრეტული რიგი:

  1. Shell გარემოში განსაზღვრული ცვლადები
  2. --env-file დროშით დაყენებული ცვლადები
  3. .env ფაილში განსაზღვრული ცვლადები
  4. სერვისების environment სექციაში განსაზღვრული ცვლადები
  5. ნაგულისხმევი მნიშვნელობები Compose ფაილში

.env ფაილის მაგალითი:

# .env ფაილი
MYSQL_ROOT_PASSWORD=secret
MYSQL_DATABASE=myapp
MYSQL_USER=user
MYSQL_PASSWORD=password
NGINX_PORT=80
APP_ENV=development

ცვლადების ჩანაცვლება

შეგიძლიათ გამოიყენოთ გარემოს ცვლადები თქვენს compose ფაილში:

version: '3.8'
services:
  web:
    image: nginx:alpine
    ports:
      - "${NGINX_PORT:-80}:80"  # გამოიყენე NGINX_PORT ან ნაგულისხმევად 80
    environment:
      - APP_ENV=${APP_ENV}
      - DEBUG=${DEBUG:-false}
  
  db:
    image: mysql:${MYSQL_VERSION:-8.0}
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}

მრავალი გარემოს ფაილის გამოყენება

# development-ისთვის
docker-compose --env-file .env.development up

# production-ისთვის
docker-compose --env-file .env.production up

სერვისის კონფიგურაცია

Build-ის კონფიგურაცია

services:
  app:
    build:
      context: ./app  # Build კონტექსტი (დირექტორია, რომელიც შეიცავს Dockerfile-ს)
      dockerfile: Dockerfile.dev  # მორგებული Dockerfile-ის სახელი
      args:  # Build არგუმენტები, რომლებიც გადაეცემა Dockerfile-ს
        ENV: development
        VERSION: 1.0
      cache_from:  # Image-ები, რომლებიც გამოიყენება ქეშის წყაროდ
        - myapp:builder
      target: dev-stage  # კონკრეტული ეტაპი მრავალეტაპიან Dockerfile-ში ასაგებად
      network: host  # ქსელი build-დროის ბრძანებებისთვის
      shm_size: '2gb'  # გაზიარებული მეხსიერების ზომა build-ისთვის

ქსელის კონფიგურაცია

services:
  web:
    networks:
      frontend:  # frontend ქსელთან მიერთება
        ipv4_address: 172.16.238.10  # ფიქსირებული IP მისამართი
        aliases:
          - website  # დამატებითი DNS სახელი
      backend:  # ასევე backend ქსელთან მიერთება
        priority: 1000  # ქსელის კავშირის პრიორიტეტი
    dns:
      - 8.8.8.8  # მორგებული DNS სერვერები
    extra_hosts:
      - "somehost:162.242.195.82"  # ჩანაწერის დამატება /etc/hosts-ში
    hostname: web-service  # კონტეინერის ჰოსტის სახელი

networks:
  frontend:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.name: frontend_bridge
    ipam:
      driver: default
      config:
        - subnet: 172.16.238.0/24
          gateway: 172.16.238.1
  backend:
    driver: bridge
    internal: true  # გარე კავშირის გარეშე

Volume-ის კონფიგურაცია

services:
  db:
    volumes:
      - db_data:/var/lib/mysql  # დასახელებული volume
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro  # Bind mount (მხოლოდ წაკითხვადი)
      - type: tmpfs  # მეხსიერებაში tmpfs მიმაგრება
        target: /tmp
        tmpfs:
          size: 100M
          mode: 1777
      - type: volume  # ალტერნატიული სინტაქსი
        source: logs
        target: /var/log
        volume:
          nocopy: true  # არ დააკოპირო არსებული შიგთავსი

volumes:
  db_data:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: '/mnt/db-data'
  logs:
    external: true  # წინასწარ არსებული volume-ის გამოყენება

დამოკიდებულების კონფიგურაცია

services:
  web:
    depends_on:
      db:  # გაძლიერებული დამოკიდებულება პირობით
        condition: service_healthy  # დაელოდე db-ს გამართულობას
      redis:
        condition: service_started  # უბრალოდ დაელოდე redis-ის გაშვებას
    
  worker:
    depends_on:
      - db  # მარტივი დამოკიდებულება (უბრალოდ დაელოდე გაშვებას)
      - redis

გაფართოებული ფუნქციები

Health Checks

Health check-ები ეხმარება Docker-ს განსაზღვროს, მუშაობს თუ არა კონტეინერი გამართულად:

services:
  web:
    image: nginx:alpine
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]  # გასაშვები ბრძანება
      interval: 1m30s  # დრო შემოწმებებს შორის
      timeout: 10s  # პასუხის ლოდინის დრო
      retries: 3  # ზედიზედ წარუმატებლობების რაოდენობა, რომ არაჯანსაღად ჩაითვალოს
      start_period: 40s  # საშეღავათო პერიოდი გაშვებისთვის
      
  db:
    image: postgres:13
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5
      
  redis:
    image: redis:alpine
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]

რესურსების ლიმიტები

აკონტროლეთ რესურსები, რომელთა გამოყენებაც შეუძლია თითოეულ სერვისს:

services:
  app:
    image: myapp:latest
    deploy:
      resources:
        limits:
          cpus: '0.50'  # გამოიყენოს CPU ბირთვის მაქსიმუმ 50%
          memory: 512M  # გამოიყენოს მაქსიმუმ 512MB მეხსიერება
        reservations:
          cpus: '0.25'  # დაარეზერვოს CPU ბირთვის მინიმუმ 25%
          memory: 256M  # დაარეზერვოს მინიმუმ 256MB მეხსიერება
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s

საიდუმლოებების მართვა

უსაფრთხოდ მიაწვდეთ მგრძნობიარე მონაცემები სერვისებს:

services:
  web:
    image: nginx:alpine
    secrets:
      - source: site.key
        target: /etc/nginx/ssl/site.key
        mode: 0400
      - site.crt
      
  db:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD_FILE: /run/secrets/db_password
    secrets:
      - db_password

secrets:
  site.key:
    file: ./certs/site.key
  site.crt:
    file: ./certs/site.crt
  db_password:
    file: ./secrets/db_password.txt
    # ან external: true წინასწარ არსებული Docker საიდუმლოებების გამოსაყენებლად

configs

გაუზიარეთ კონფიგურაციის ფაილები სერვისებს:

services:
  web:
    image: nginx:alpine
    configs:
      - source: nginx_conf
        target: /etc/nginx/nginx.conf
      - source: site_config
        target: /etc/nginx/conf.d/site.conf
        mode: 0440

configs:
  nginx_conf:
    file: ./config/nginx.conf
  site_config:
    file: ./config/site.conf

საუკეთესო პრაქტიკები