11-bo‘lim
Compose asoslari
Bir nechta konteynerni bitta fayl bilan boshqarish - compose.yaml, up, down, ps, logs va avtomatik tarmoq.
Ushbu bo‘lim mundarijasi
Oldingi boblarda har bir konteynerni qo'lda ishga tushirdik: tarmoq yaratdik, hajm uladik, portni chiqardik. Ikkita xizmat uchun bu bir necha uzun buyruq degani.
Compose shu buyruqlarni bitta faylga yozib qo'yadi.
Birinchi compose.yaml #
services:
veb:
image: nginx:alpine
ports:
- "8099:80"
ishchi:
image: alpine:3.21
command: sh -c "while true; do echo 'ishchi tirik'; sleep 5; done"
Ikkita xizmat: veb va ishchi. Har biri docker run ning
bayroqlariga to'g'ri keladi:
docker run bayrog'i | compose.yaml kaliti |
|---|---|
-p 8099:80 | ports: |
-v nom:/ma | volumes: |
-e NOM=qiymat | environment: |
--network X | networks: |
| Buyruq argumenti | command: |
--restart | restart: |
docker compose version
docker compose config --services | sort
Docker Compose version v5.5.1
ishchi
veb
config --services faylni tekshiradi ham: sintaksis xato
bo'lsa, shu yerda bilasiz.
Ishga tushirish #
docker compose up -d
Chiqish shunday ko'rinadi (tartib har safar boshqacha bo'lishi mumkin, chunki ishlar parallel bajariladi):
Network kompoz_default Created
Container kompoz-veb-1 Created
Container kompoz-ishchi-1 Created
Container kompoz-ishchi-1 Started
Container kompoz-veb-1 Started
Birinchi qatorga e'tibor bering: Compose tarmoqni o'zi yaratdi.
docker compose ps --format 'table {{.Service}}\t{{.Image}}\t{{.State}}'
SERVICE IMAGE STATE
ishchi alpine:3.21 running
veb nginx:alpine running
Compose nimalarni o'zi qiladi #
Tarmoq avtomatik yaratildi:
docker network ls --filter name=kompoz --format '{{.Name}}\t{{.Driver}}'
kompoz_default bridge
Bu o'z tarmog'i, demak 9-bobdagi qoida bo'yicha nom bo'yicha topish ishlaydi:
docker compose exec -T ishchi ping -c1 -W2 veb 2>&1 | head -1
PING veb (172.19.0.3): 56 data bytes
E'tibor bering: veb - bu xizmat nomi, konteyner nomi emas.
Konteyner boshqacha ataladi:
docker compose ps --format '{{.Name}}'
kompoz-ishchi-1
kompoz-veb-1
Nom uch qismdan: <loyiha>-<xizmat>-<raqam>. Loyiha nomi esa
odatda papka nomi.
Papka nomiga tayanish xavfli: papkani ko'chirsangiz yoki qayta nomlasangiz, Compose yangi loyiha deb hisoblaydi va eski konteynerlaringiz yetim qoladi.
compose.yaml boshiga yozing:
name: dokon
Yoki docker compose -p dokon ... bilan bering.
Jurnal va buyruqlar #
sleep 3
docker compose logs ishchi --no-log-prefix | head -2
ishchi tirik
ishchi tirik
docker compose logs barcha xizmat jurnalini birga ko'rsatadi -
-f bilan esa jonli kuzatadi.
Port ishlayotganini tekshiramiz:
curl -s -o /dev/null -w 'HTTP %{http_code}\n' http://127.0.0.1:8099/
HTTP 200
Bitta xizmat bilan ishlash #
Ko'p buyruq xizmat nomini qabul qiladi:
docker compose restart ishchi >/dev/null 2>&1
docker compose ps --format 'table {{.Service}}\t{{.State}}'
SERVICE STATE
ishchi running
veb running
| Buyruq | Nima qiladi |
|---|---|
up -d | Yaratadi va fonda ishga tushiradi |
down | To'xtatadi va o'chiradi (tarmoq bilan birga) |
stop / start | To'xtatadi / boshlaydi, o'chirmaydi |
restart | Qayta ishga tushiradi |
ps | Holatini ko'rsatadi |
logs -f | Jurnalni kuzatadi |
exec | Ishlayotgan xizmatda buyruq bajaradi |
run --rm | Yangi vaqtinchalik konteyner ochadi |
build | Obrazlarni qayta quradi |
config | Yakuniy sozlamani ko'rsatadi va tekshiradi |
Masshtablash #
docker compose up -d --scale ishchi=3 >/dev/null 2>&1
docker compose ps --format '{{.Service}}' | sort | uniq -c
3 ishchi
1 veb
Uchta ishchi nusxasi ishlayapti. Ular bir xil tarmoqda va bir xil
xizmat nomiga ega - DNS so'rovi ularning orasida taqsimlanadi.
veb xizmati 8099:80 ni band qilgan. --scale veb=3 desangiz,
ikkinchi nusxa xato beradi - port allaqachon band.
Bir nechta nusxa kerak bo'lsa, port chiqarishni teskari proksiga topshiring: nusxalar portni chiqarmaydi, proksi esa ularni nom bo'yicha topadi.
Bu 18-bobda batafsil ko'riladi.
To'xtatish va tozalash #
docker compose down >/dev/null 2>&1
docker network ls --filter name=kompoz --format '{{.Name}}' | wc -l
docker ps -a --format '{{.Names}}' | grep -c kompoz || true
0
0
down konteynerlarni ham, tarmoqni ham o'chirdi. Hajmlar esa
saqlanadi - bu ataylab shunday.
Buni tekshiramiz. Hajmli alohida sozlama - compose.baza.yaml:
services:
baza:
image: alpine:3.21
command: sh -c "echo saqlandi > /ma/f; sleep 30"
volumes:
- dokon-ma:/ma
volumes:
dokon-ma:
docker compose -f compose.baza.yaml up -d >/dev/null 2>&1
sleep 2
docker volume ls --filter name=kompoz --format '{{.Name}}'
docker compose -f compose.baza.yaml down >/dev/null 2>&1
echo "down dan keyin:"
docker volume ls --filter name=kompoz --format '{{.Name}}'
kompoz_dokon-ma
down dan keyin:
kompoz_dokon-ma
Hajm joyida. Uni ham o'chirish uchun alohida bayroq kerak:
docker compose -f compose.baza.yaml down -v >/dev/null 2>&1
docker volume ls --filter name=kompoz --format '{{.Name}}' | wc -l
0
down -v - bazangizni o'chiradi-v bayrog'i loyihaga tegishli barcha hajmlarni o'chiradi.
Ishlab chiqish muhitida bu qulay - "toza boshlaymiz" degani. Ishlab chiqarishda esa bu bazangizni yo'q qilish degani.
Odat qiling: down -v ni faqat mahalliy papkada yozing va
serverga ulangan terminalda hech qachon.
Compose qachon kerak emas? #
Bitta konteyner uchun docker run yetarli. Compose ikki va undan
ko'p xizmat bo'lganda, yoki bir xil konfiguratsiyani takror
ishga tushirish kerak bo'lganda foyda beradi.
Boshqa tomondan, Compose bitta mashinada ishlaydi. Bir necha serverga tarqatish kerak bo'lsa, Kubernetes yoki Swarm kabi orkestratorlar kerak bo'ladi.
Xulosa #
- Compose bir nechta konteynerning sozlamasini bitta
compose.yamlfayliga yozadi. - Har bir
services:yozuvi - bitta xizmat; kalitlardocker runbayroqlariga to'g'ri keladi. - Compose loyiha uchun o'z tarmog'ini yaratadi, demak xizmatlar bir-birini nom bo'yicha topadi.
- Konteyner nomi
<loyiha>-<xizmat>-<raqam>; loyiha nomi odatda papka nomi - uniname:bilan aniq belgilagan ma'qul. - Ko'p buyruqlar xizmat nomini oladi:
logs ishchi,restart ishchi. --scalebilan nusxa soni oshiriladi, lekin port chiqargan xizmatni masshtablab bo'lmaydi.downkonteyner va tarmoqni o'chiradi, hajmlarni saqlaydi.down -vhajmlarni ham o'chiradi - ishlab chiqarishda undan uzoq turing.configfaylni tekshiradi va yakuniy sozlamani ko'rsatadi.- Compose bitta mashina uchun; bir necha serverga orkestrator kerak.
- Ikki xizmatli
compose.yamlyozing vaup -dqiling. docker compose psbilan holatini ko'ring.- Yaratilgan tarmoq nomini toping.
- Bir xizmatdan ikkinchisini nom bo'yicha ping qiling.
logsbilan bitta xizmat jurnalini o'qing.--scalebilan nusxa sonini uchga oshiring.- Port chiqargan xizmatni masshtablab, xatoni o'qing.
name:qo'shib, konteyner nomlari o'zgarganini ko'ring.downdan keyin hajm qolganini tasdiqlang.configbilan atayin xato yozib, xabarni o'qing.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.