Docker Compose: ishlab chiqishdan ishlab chiqarishgacha

Kurs boshlanishi arafasida tayyorlangan podkast transkripsiyasining tarjimasi "Linux administratori"

Docker Compose: ishlab chiqishdan ishlab chiqarishgacha

Docker Compose - bu ish yaratish uchun ajoyib vosita
ilovangizda ishlatiladigan stek uchun muhit. Bu sizga aniqlash imkonini beradi
ilovangizning har bir komponenti aniq va sodda sintaksisga rioya qilgan holda YAML-
fayllar
.

Kelishi bilan docker compose v3 ushbu YAML fayllari bilan ishlashda bevosita ishlab chiqarish muhitida foydalanish mumkin
klaster Docker to'dasi.

Lekin bu xuddi shu docker-compose faylidan foydalanishingiz mumkin degani
rivojlanish jarayoni va ishlab chiqarish muhitida? Yoki bir xil fayldan foydalaning
sahnalashtirish? Umuman olganda, ha, lekin bu funksiya uchun bizga quyidagilar kerak:

  • O'zgaruvchan interpolyatsiya: ba'zilar uchun muhit o'zgaruvchilaridan foydalanish
    har bir muhitda o'zgarib turadigan qadriyatlar.
  • Konfiguratsiyani bekor qilish: ikkinchi (yoki har qanday)ni aniqlash qobiliyati
    boshqa keyingi) docker-compose fayli, u biror narsani o'zgartiradi
    birinchi va docker compose ikkala faylni birlashtirishga g'amxo'rlik qiladi.

Ishlab chiqarish va ishlab chiqarish fayllari o'rtasidagi farqlar

Rivojlanish jarayonida siz koddagi o'zgarishlarni tekshirishni xohlaysiz
haqiqiy vaqt. Buning uchun, odatda, manba kodi bo'lgan hajm o'rnatiladi
ilovangiz uchun ish vaqtini o'z ichiga olgan konteyner. Lekin ishlab chiqarish muhiti uchun
Bu usul mos emas.

Ishlab chiqarishda sizda ko'plab tugunlarga ega klaster mavjud va hajmi mahalliy
konteyneringiz (yoki xizmatingiz) ishlayotgan tugunga nisbatan, shuning uchun siz buni qilmaysiz
o'z ichiga olgan murakkab operatsiyalarsiz manba kodini o'rnatishingiz mumkin
kod sinxronizatsiyasi, signallar va boshqalar.

Buning o'rniga biz odatda kodingizning ma'lum bir versiyasi bilan rasm yaratmoqchimiz.
Uni tegishli teg bilan belgilash odatiy holdir (siz semantikdan foydalanishingiz mumkin
versiya yoki boshqa tizim sizning xohishingizga ko'ra).

Konfiguratsiyani bekor qilish

Farqlarni hisobga olgan holda va sizning bog'liqliklaringiz stsenariylarda farq qilishi mumkin
ishlab chiqish va ishlab chiqarishda bizga turli xil konfiguratsiya fayllari kerak bo'lishi aniq.

Docker compose turli xil yaratish fayllarini birlashtirishni qo'llab-quvvatlaydi
yakuniy konfiguratsiyani oling. Bu qanday ishlashini misolda ko'rish mumkin:

$ cat docker-compose.yml
version: "3.2"

services:
  whale:
    image: docker/whalesay
    command: ["cowsay", "hello!"]
$ docker-compose up
Creating network "composeconfigs_default" with the default driver
Starting composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1  |  ________
whale_1  | < hello! >
whale_1  |  --------
whale_1  |     
whale_1  |      
whale_1  |       
whale_1  |                     ##        .
whale_1  |               ## ## ##       ==
whale_1  |            ## ## ## ##      ===
whale_1  |        /""""""""""""""""___/ ===
whale_1  |   ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
whale_1  |        ______ o          __/
whale_1  |                     __/
whale_1  |           __________/
composeconfigs_whale_1 exited with code 0

Aytganimizdek, docker compose bir nechta kompozitsiyalarni birlashtirishni qo'llab-quvvatlaydi -
fayllar, bu ikkinchi fayldagi turli parametrlarni bekor qilish imkonini beradi. Masalan:

$ cat docker-compose.second.yml
version: "3.2"
services:
  whale:
    command: ["cowsay", "bye!"]

$ docker-compose -f docker-compose.yml -f docker-compose.second.yml up
Creating composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1  |  ______
whale_1  | < bye! >
whale_1  |  ------
whale_1  |     
whale_1  |      
whale_1  |       
whale_1  |                     ##        .
whale_1  |               ## ## ##       ==
whale_1  |            ## ## ## ##      ===
whale_1  |        /""""""""""""""""___/ ===
whale_1  |   ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
whale_1  |        ______ o          __/
whale_1  |                     __/
whale_1  |           __________/
composeconfigs_whale_1 exited with code 0

Bu sintaksis ishlab chiqish paytida juda qulay emas, qachon buyruq
ko'p marta qilish kerak bo'ladi.

Yaxshiyamki, docker compose avtomatik ravishda maxsus faylni qidiradi
docker-compose.override.yml qiymatlarni bekor qilish uchun docker-compose.yml. agar
ikkinchi fayl nomini o'zgartirsangiz, xuddi shu natijaga erishasiz, faqat asl buyruq yordamida:

$ mv docker-compose.second.yml docker-compose.override.yml
$ docker-compose up
Starting composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1  |  ______
whale_1  | < bye! >
whale_1  |  ------
whale_1  |     
whale_1  |      
whale_1  |       
whale_1  |                     ##        .
whale_1  |               ## ## ##       ==
whale_1  |            ## ## ## ##      ===
whale_1  |        /""""""""""""""""___/ ===
whale_1  |   ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
whale_1  |        ______ o          __/
whale_1  |                     __/
whale_1  |           __________/
composeconfigs_whale_1 exited with code 0

OK, buni eslash osonroq.

O'zgaruvchilarning interpolyatsiyasi

Konfiguratsiya fayllarini qo'llab-quvvatlash interpolyatsiya
o'zgaruvchilar
va standart qiymatlar. Ya'ni, siz quyidagilarni qilishingiz mumkin:

services:
  my-service:
    build:
      context: .
    image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
...

Va agar shunday qilsangiz docker-compose Build (yoki surish) muhit o'zgaruvchisisiz
$MY_SERVICE_VERSION, qiymat ishlatiladi eng kechlekin agar siz o'rnatsangiz
qurishdan oldin atrof-muhit o'zgaruvchisining qiymati, u qurish yoki surishda ishlatiladi
reestrga private.registry.mine.

Mening printsiplarim

Men uchun ishlaydigan yondashuvlar siz uchun ham ishlashi mumkin. Men bularga amal qilaman
oddiy qoidalar:

  • Ishlab chiqarish, ishlab chiqish (yoki boshqa muhitlar) uchun barcha steklarim orqali aniqlanadi
    docker-compose fayllar
  • Konfiguratsiya fayllari iloji boricha barcha muhitlarimni qamrab olishi kerak edi
    takrorlashdan saqlaning.
  • Har bir muhitda ishlash uchun menga bitta oddiy buyruq kerak.
  • Asosiy konfiguratsiya faylda aniqlanadi docker-compose.yml.
  • Atrof-muhit o'zgaruvchilari tasvir teglarini yoki boshqa narsalarni aniqlash uchun ishlatiladi
    muhitdan muhitga farq qilishi mumkin bo'lgan o'zgaruvchilar (bosqich, integratsiya,
    ishlab chiqarish).
  • Ishlab chiqarish o'zgaruvchilari qiymatlari qiymat sifatida ishlatiladi
    sukut bo'yicha, agar steksiz ishlab chiqarishda ishga tushirilsa, bu xavflarni kamaytiradi
    muhit o'zgaruvchisini o'rnating.
  • Ishlab chiqarish muhitida xizmatni ishga tushirish uchun buyruqdan foydalaning docker stack deploy - fayl yaratish docker-compose.yml -with-registry-auth my-stack-name.
  • Ish muhiti buyruq yordamida ishga tushiriladi docker-up tashkil-d.

Keling, oddiy misolni ko'rib chiqaylik.

# docker-compose.yml
...
services:
  my-service:
    build:
      context: .
    image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
    environment:
      API_ENDPOINT: ${API_ENDPOINT:-https://production.my-api.com}
...

И

# docker-compose.override.yml
...
services:
  my-service:
    ports: # This is needed for development!
      - 80:80
    environment:
      API_ENDPOINT: https://devel.my-api.com
    volumes:
      - ./:/project/src
...

foydalanishim mumkin docker-compose (docker-compose)stekni ishga tushirish uchun
o'rnatilgan manba kodi bilan ishlab chiqish rejimi /loyiha/src.

Men xuddi shu fayllarni ishlab chiqarishda ishlatishim mumkin! Va men albatta foydalanishim mumkin edi
bir xil fayl docker-compose.yml sahnalashtirish uchun. Buni kengaytirish uchun
ishlab chiqarish, men faqat oldindan belgilangan teg bilan tasvirni qurish va yuborish kerak
CI bosqichida:

export MY_SERVICE_VERSION=1.2.3
docker-compose -f docker-compose.yml build
docker-compose -f docker-compose.yml push

Ishlab chiqarishda buni quyidagi buyruqlar yordamida bajarish mumkin:

export MY_SERVICE_VERSION=1.2.3
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth

Va agar siz sahnada xuddi shunday qilishni xohlasangiz, shunchaki belgilashingiz kerak
sahnalash muhitida ishlash uchun zarur muhit o'zgaruvchilari:

export MY_SERVICE_VERSION=1.2.3
export API_ENDPOINT=http://staging.my-api.com
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth

Natijada biz ikkita turli xil docker-compose fayllaridan foydalandik, ularsiz
Ikki nusxadagi konfiguratsiyalar sizda mavjud bo'lgan har qanday muhit uchun ishlatilishi mumkin!

Kurs haqida ko'proq bilib oling "Linux administratori"

Manba: www.habr.com

a Izoh qo'shish