Docker Compose არის ინსტრუმენტი მრავალკონტეინერიანი Docker აპლიკაციების განსაზღვრისა და გაშვებისთვის. ის იყენებს YAML ფაილს აპლიკაციის სერვისების, ქსელებისა და volume-ების კონფიგურაციისთვის, რაც საშუალებას გაძლევთ გაუშვათ და მართოთ მრავალი კონტეინერი ერთი ბრძანებით.
Docker Compose-ით თქვენ განსაზღვრავთ სრულ აპლიკაციის სტეკს დეკლარაციული გზით, რაც ამარტივებს:
რთული აპლიკაციების დანერგვას ურთიერთდამოკიდებული სერვისებით თანმიმდევრული development, testing და production გარემოების შენარჩუნებას აპლიკაციის კონფიგურაციისა და დანერგვის სამუშაო პროცესების გამარტივებას ინდივიდუალური სერვისების მასშტაბირებას საჭიროებისამებრ მთელი აპლიკაციის სასიცოცხლო ციკლის მართვას ერთი ფაილიდან ინდივიდუალური კონტეინერები, რომლებიც ქმნიან თქვენს აპლიკაციას განისაზღვრება docker-compose.yml-ში საკუთარი კონფიგურაციით შეუძლიათ დამოუკიდებლად მასშტაბირება (მრავალი ინსტანციის გაშვება) იზიარებენ ქსელებს კომუნიკაციისთვის და volume-ებს მონაცემებისთვის თითოეულ სერვისს შეიძლება ჰქონდეს საკუთარი build ინსტრუქციები, გარემოს ცვლადები და runtime კონფიგურაციები ავტომატურად ენიჭებათ DNS სახელები სერვისების აღმოსაჩენად ავტომატური ქსელის შექმნა თითოეული Compose პროექტისთვის ჩაშენებული სერვისების აღმოჩენა (სერვისებს შეუძლიათ კომუნიკაცია სერვისის სახელების გამოყენებით) მორგებული ქსელის კონფიგურაცია (დრაივერები, ქვექსელები, gateway-ები) იზოლირებული გარემოები უსაფრთხოებისა და რესურსების მართვისთვის გარე ქსელებისა და ქსელის alias-ების მხარდაჭერა ქსელთან მიერთების კონტროლი თითოეული სერვისისთვის მუდმივი მონაცემთა საცავი, რომელიც უძლებს კონტეინერის გადატვირთვას გაზიარებულია სერვისებს შორის მონაცემთა გაცვლისთვის დასახელებული volume-ები მარტივი მართვისა და სარეზერვო ასლებისთვის Bind mount-ების მხარდაჭერა development სამუშაო პროცესებისთვის Volume დრაივერები ღრუბლოვანი და სპეციალიზებული საცავებისთვის კონფიგურაციის ოფციები წარმადობისა და უსაფრთხოებისთვის 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 მხარს უჭერს გარემოს ცვლადებს რამდენიმე გზით:
.env ფაილი პროექტის დირექტორიაშიShell გარემოს ცვლადები გარემოს ფაილი, მითითებული --env-file-ით environment სექცია compose ფაილშიცვლადების ჩანაცვლება compose ფაილში Docker Compose-ს აქვს გარემოს ცვლადების კონკრეტული რიგი:
Shell გარემოში განსაზღვრული ცვლადები --env-file დროშით დაყენებული ცვლადები.env ფაილში განსაზღვრული ცვლადებისერვისების environment სექციაში განსაზღვრული ცვლადები ნაგულისხმევი მნიშვნელობები 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
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 # გარე კავშირის გარეშე
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 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 საიდუმლოებების გამოსაყენებლად
გაუზიარეთ კონფიგურაციის ფაილები სერვისებს:
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
გამოიყენეთ ვერსიების კონტროლი compose ფაილებისთვის შეინახეთ ყველა compose ფაილი თქვენი პროექტის რეპოზიტორიაში ჩართეთ დოკუმენტაცია კონფიგურაციის ოფციების შესახებ თვალყური ადევნეთ თქვენი აპლიკაციის სტეკის ცვლილებებს დროთა განმავლობაში განიხილეთ git hook-ების გამოყენება compose ფაილების ვალიდაციისთვის გამოყავით development და production კონფიგურაციები გამოიყენეთ საბაზისო და გადამფარავი ფაილები (docker-compose.yml + docker-compose.override.yml) შექმენით გარემო-სპეციფიური ფაილები (docker-compose.prod.yml, docker-compose.dev.yml) გამოიყენეთ --file დროშა კონფიგურაციების მითითებისთვის: docker-compose -f docker-compose.yml -f docker-compose.prod.yml up ცალკე შეინახეთ development-სპეციფიური პარამეტრები (volume-ები კოდისთვის, debug პორტები)