11-bo‘lim

Compose asoslari

Bir nechta konteynerni bitta fayl bilan boshqarish - compose.yaml, up, down, ps, logs va avtomatik tarmoq.

🕑 17 daqiqa o‘qish 📄 725 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Birinchi compose.yaml
  2. Ishga tushirish
  3. Compose nimalarni o'zi qiladi
  4. Jurnal va buyruqlar
  5. Bitta xizmat bilan ishlash
  6. Masshtablash
  7. To'xtatish va tozalash
  8. Compose qachon kerak emas?
  9. Xulosa

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 #

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'icompose.yaml kaliti
-p 8099:80ports:
-v nom:/mavolumes:
-e NOM=qiymatenvironment:
--network Xnetworks:
Buyruq argumenticommand:
--restartrestart:
Terminal
docker compose version
docker compose config --services | sort
Natija
Docker Compose version v5.5.1
ishchi
veb

config --services faylni tekshiradi ham: sintaksis xato bo'lsa, shu yerda bilasiz.

Ishga tushirish #

Natija
docker compose up -d

Chiqish shunday ko'rinadi (tartib har safar boshqacha bo'lishi mumkin, chunki ishlar parallel bajariladi):

Natija
 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.

Terminal
docker compose ps --format 'table {{.Service}}\t{{.Image}}\t{{.State}}'
Natija
SERVICE   IMAGE          STATE
ishchi    alpine:3.21    running
veb       nginx:alpine   running

Compose nimalarni o'zi qiladi #

Compose loyihasi kompoz_default (avtomatik yaratilgan tarmoq) veb nginx:alpine kompoz-veb-1 ishchi alpine:3.21 kompoz-ishchi-1 nom bo'yicha 8099 -> 80 host Papka nomi loyiha nomiga aylanadi: /tmp/kompoz -> kompoz Konteyner nomi: <loyiha>-<xizmat>-<raqam> Tarmoq nomi: <loyiha>_default
Bitta fayl - tarmoq, nomlar va bog'lanishlar avtomatik

Tarmoq avtomatik yaratildi:

Terminal
docker network ls --filter name=kompoz --format '{{.Name}}\t{{.Driver}}'
Natija
kompoz_default    bridge

Bu o'z tarmog'i, demak 9-bobdagi qoida bo'yicha nom bo'yicha topish ishlaydi:

Terminal
docker compose exec -T ishchi ping -c1 -W2 veb 2>&1 | head -1
Natija
PING veb (172.19.0.3): 56 data bytes

E'tibor bering: veb - bu xizmat nomi, konteyner nomi emas. Konteyner boshqacha ataladi:

Terminal
docker compose ps --format '{{.Name}}'
Natija
kompoz-ishchi-1
kompoz-veb-1

Nom uch qismdan: <loyiha>-<xizmat>-<raqam>. Loyiha nomi esa odatda papka nomi.

Loyiha nomini aniq belgilang

Papka nomiga tayanish xavfli: papkani ko'chirsangiz yoki qayta nomlasangiz, Compose yangi loyiha deb hisoblaydi va eski konteynerlaringiz yetim qoladi.

compose.yaml boshiga yozing:

Natija
name: dokon

Yoki docker compose -p dokon ... bilan bering.

Jurnal va buyruqlar #

Terminal
sleep 3
docker compose logs ishchi --no-log-prefix | head -2
Natija
ishchi tirik
ishchi tirik

docker compose logs barcha xizmat jurnalini birga ko'rsatadi - -f bilan esa jonli kuzatadi.

Port ishlayotganini tekshiramiz:

Terminal
curl -s -o /dev/null -w 'HTTP %{http_code}\n' http://127.0.0.1:8099/
Natija
HTTP 200

Bitta xizmat bilan ishlash #

Ko'p buyruq xizmat nomini qabul qiladi:

Terminal
docker compose restart ishchi >/dev/null 2>&1
docker compose ps --format 'table {{.Service}}\t{{.State}}'
Natija
SERVICE   STATE
ishchi    running
veb       running
BuyruqNima qiladi
up -dYaratadi va fonda ishga tushiradi
downTo'xtatadi va o'chiradi (tarmoq bilan birga)
stop / startTo'xtatadi / boshlaydi, o'chirmaydi
restartQayta ishga tushiradi
psHolatini ko'rsatadi
logs -fJurnalni kuzatadi
execIshlayotgan xizmatda buyruq bajaradi
run --rmYangi vaqtinchalik konteyner ochadi
buildObrazlarni qayta quradi
configYakuniy sozlamani ko'rsatadi va tekshiradi

Masshtablash #

Terminal
docker compose up -d --scale ishchi=3 >/dev/null 2>&1
docker compose ps --format '{{.Service}}' | sort | uniq -c
Natija
      3 ishchi
      1 veb

Uchta ishchi nusxasi ishlayapti. Ular bir xil tarmoqda va bir xil xizmat nomiga ega - DNS so'rovi ularning orasida taqsimlanadi.

Portli xizmatni masshtablab bo'lmaydi

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 #

Terminal
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
Natija
0
0

down konteynerlarni ham, tarmoqni ham o'chirdi. Hajmlar esa saqlanadi - bu ataylab shunday.

Buni tekshiramiz. Hajmli alohida sozlama - compose.baza.yaml:

YAML
services:
  baza:
    image: alpine:3.21
    command: sh -c "echo saqlandi > /ma/f; sleep 30"
    volumes:
      - dokon-ma:/ma

volumes:
  dokon-ma:
Terminal
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}}'
Natija
kompoz_dokon-ma
down dan keyin:
kompoz_dokon-ma

Hajm joyida. Uni ham o'chirish uchun alohida bayroq kerak:

Terminal
docker compose -f compose.baza.yaml down -v >/dev/null 2>&1
docker volume ls --filter name=kompoz --format '{{.Name}}' | wc -l
Natija
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.yaml fayliga yozadi.
  • Har bir services: yozuvi - bitta xizmat; kalitlar docker run bayroqlariga 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 - uni name: bilan aniq belgilagan ma'qul.
  • Ko'p buyruqlar xizmat nomini oladi: logs ishchi, restart ishchi.
  • --scale bilan nusxa soni oshiriladi, lekin port chiqargan xizmatni masshtablab bo'lmaydi.
  • down konteyner va tarmoqni o'chiradi, hajmlarni saqlaydi.
  • down -v hajmlarni ham o'chiradi - ishlab chiqarishda undan uzoq turing.
  • config faylni tekshiradi va yakuniy sozlamani ko'rsatadi.
  • Compose bitta mashina uchun; bir necha serverga orkestrator kerak.
Amaliy topshiriq
  1. Ikki xizmatli compose.yaml yozing va up -d qiling.
  2. docker compose ps bilan holatini ko'ring.
  3. Yaratilgan tarmoq nomini toping.
  4. Bir xizmatdan ikkinchisini nom bo'yicha ping qiling.
  5. logs bilan bitta xizmat jurnalini o'qing.
  6. --scale bilan nusxa sonini uchga oshiring.
  7. Port chiqargan xizmatni masshtablab, xatoni o'qing.
  8. name: qo'shib, konteyner nomlari o'zgarganini ko'ring.
  9. down dan keyin hajm qolganini tasdiqlang.
  10. config bilan atayin xato yozib, xabarni o'qing.

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.