Tinklaraštis
„Docker Compose“ valdymas izoliuotam, atkuriamam žiniatinklio prieglobai
Sužinokite, kaip panaudoti „Docker Compose“ kuriant izoliuotas, atkuriamas ir lengvai valdomas žiniatinklio prieglobos aplinkas, sprendžiant įprastas diegimo problemas.
Santrauka
Problema „tai veikia mano mašinoje“ yra nuolatinis galvos skausmas žiniatinklio kūrėjams ir sistemų administratoriams. „Docker“, naudodamas savo konteinerizavimo technologiją, siūlo tvirtą sprendimą, supakuodamas programas ir jų priklausomybes į izoliuotas aplinkas. Tačiau valdyti kelias tarpusavyje susijusias paslaugas, tokias kaip žiniatinklio serveris, duomenų bazė ir talpykla, gali būti sudėtinga. Šiame straipsnyje gilinsimės į „Docker Compose“, galingą įrankį, supaprastinanį kelių konteinerių „Docker“ programų apibrėžimą ir valdymą. Aptarsime, kaip apibrėžti visą jūsų žiniatinklio prieglobos krūvą viename konfigūracijos faile, užtikrinant nuoseklumą tarp kūrimo, paruošimo ir gamybos aplinkų, ir galiausiai pasiekiant patikimesnius ir atkuriamus diegimus.
Už „Tai veikia mano mašinoje“ ribų: „Docker Compose“ valdomas jūsų žiniatinklio prieglobos krūvos
Siaubingas „tai veikia mano mašinoje“ sindromas yra universali programinės įrangos kūrimo problema. Tai rodo atotrūkį tarp kūrėjo vietinės aplinkos ir gamybos serverio, vedantį į varginančias derinimo sesijas ir nepatikimus diegimus. „Docker“, per savo konteinerizavimo technologiją, tapo galingu priešnuodžiu, žadančiu nuoseklias vykdymo aplinkas. Bet kas nutinka, kai jūsų žiniatinklio programa yra ne tik vienas procesas, bet sudėtinga paslaugų ekosistema – žiniatinklio serveris, duomenų bazė, talpykla, galbūt žinučių eilė?
Rankinis šių tarpusavyje susijusių komponentų valdymas skirtingose aplinkose gali greitai peraugti į chaosą. Štai kur „Docker Compose“ spinduliuoja. Tai įrankis, leidžiantis apibrėžti ir paleisti kelių konteinerių „Docker“ programas naudojant paprastą YAML failą. Užuot kovoję su atskirais konteinerių komandais, jūs apibūdinote visos jūsų programos paslaugas, tinklus ir apimtis, o „Docker Compose“ pasirūpina jų orkestravimu.
Šis straipsnis padės jums praktiškai pritaikyti „Docker Compose“ kuriant izoliuotas, atkuriamas ir valdomas žiniatinklio prieglobos aplinkas. Peržengsime pagrindinį „Docker“ naudojimą, kad parodytume, kaip sukurti tvirtą prieglobos sąranką, kuri sumažina diegimo trintį ir padidina patikimumą.
Problema: šiuolaikinių žiniatinklio krūvų sudėtingumas
Šiuolaikinės žiniatinklio programos retai egzistuoja vakuume. Tipiška sąranka gali apimti:
- Žiniatinklio serveris: Jūsų programos sąsajos (pvz., Nginx, Apache) tarnyba.
- Programos serveris/vykdymo aplinka: Jūsų programinės įrangos kodo vykdymas (pvz., Node.js, Python/Gunicorn, PHP-FPM).
- Duomenų bazė: Nuolatinių duomenų saugojimas (pvz., PostgreSQL, MySQL, MongoDB).
- Talpykla: Našumo gerinimas saugant dažnai pasiekiamus duomenis (pvz., Redis, Memcached).
- Kitos paslaugos: Tokios kaip žinučių eilės, paieškos varikliai ar fono užduočių procesoriai.
Kiekvienas iš šių komponentų turi savo priklausomybes, konfigūracijos reikalavimus ir tinklo poreikius. Rankinis kiekvieno nustatymas ir konfigūravimas naujame serveryje ar net kūrėjo nešiojamajame kompiuteryje yra daug laiko reikalaujantis, linkęs į klaidas ir sunkiai atkuriamas nuosekliai. Tai veda prie:
- Ne nuoseklios aplinkos: Skirtumai tarp kūrimo, paruošimo ir gamybos aplinkų.
- Priklausomybių pragaras: Konfliktai tarp skirtingų bibliotekų ar sistemos paketų versijų.
- Rankinės konfigūracijos klaidos: Rašybos klaidos arba praleisti veiksmai nustatymo metu.
- Sudėtingas įtraukimas: Nauji komandos nariai sunkiai paleidžia kūrimo aplinką.
- Lėti diegimo ciklai: Procesas, kaip kodas patenka iš kūrimo į gamybą, yra sudėtingas.
Sprendimas: „Docker Compose“ deklaratyviai infrastruktūrai
„Docker Compose“ sprendžia šiuos iššūkius, leisdamas apibrėžti visą jūsų programos krūvą viename docker-compose.yml faile. Šis failas veikia kaip brėžinys, nurodantis kiekvieną paslaugą, jos vaizdą, prievadus, apimtis, aplinkos kintamuosius ir kaip paslaugos turėtų bendrauti tarpusavyje.
Pagrindinės „docker-compose.yml“ sąvokos:
version: Nurodo „Compose“ failo formato versiją. Rekomenduojama naudoti naujausią versiją.services: Tai pagrindinė skiltis, kurioje apibrėžiate kiekvieną jūsų programos konteinerizuotą komponentą.image: „Docker“ vaizdas, naudojamas paslaugai (pvz.,nginx:latest,postgres:14). Taip pat galite naudotibuild, kad nurodytumėte „Dockerfile“ pasirinktiniams vaizdams.ports: Susieja prievadus iš pagrindinio kompiuterio į konteinerį (pvz.,80:80susieja pagrindinio kompiuterio 80 prievadą su konteinerio 80 prievadu).volumes: Montuoja pagrindinio kompiuterio katalogus arba pavadintus apimtis į konteinerį nuolatiniams duomenims ar konfigūracijai (pvz.,./html:/usr/share/nginx/html).environment: Nustato aplinkos kintamuosius konteineryje (pvz.,POSTGRES_USER=myuser).depends_on: Nurodo paslaugų tarpusavio priklausomybes, užtikrinant, kad jos būtų paleidžiamos tam tikra tvarka (nors tai negarantuoja pasirengimo).networks: Nustato pasirinktinius tinklus, kad paslaugos galėtų bendrauti.
networks: Nustato pasirinktinius tinklus, prie kurių gali prisijungti jūsų paslaugos izoliuotam bendravimui.volumes: Nustato pavadintus apimtis nuolatiniams duomenims saugoti.
Praktiniai veiksmai: pavyzdinės žiniatinklio prieglobos krūvos kūrimas
Sudarykime įprastą žiniatinklio prieglobos scenarijų: statinis žiniatinklio svetainė, aptarnaujama „Nginx“, su „PostgreSQL“ duomenų baze dinamiškam turiniui. Taip pat pridėsime „Redis“ talpyklą našumui gerinti.
1. Projekto struktūra:
Sukurkite savo projekto katalogą, pvz., my-web-app. Viduje turėsite:
my-web-app/
├── docker-compose.yml
├── nginx/
│ └── default.conf
└── html/
└── index.html
2. nginx/default.conf (Pagrindinė Nginx konfigūracija):
Šis failas nurodo „Nginx“, kaip aptarnauti jūsų statinius failus ir galbūt tarpininkauti užklausas programos serveriui (nors dėl paprastumo čia sutelksime dėmesį į statinius failus).
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
3. html/index.html (Jūsų svetainės turinys):
Paprastas HTML failas testavimui.
<!DOCTYPE html>
<html>
<head>
<title>Sveiki atvykę į mano „Docker“ svetainę!</title>
</head>
<body>
<h1>Sveiki iš „Docker Compose“!</h1>
<p>Šią svetainę aptarnauja „Nginx“ konteineryje.</p>
</body>
</html>
4. docker-compose.yml (Sąrankos širdis):
Šis failas apibrėžia tris mūsų paslaugas: „Nginx“, „PostgreSQL“ ir „Redis“.
version: '3.8'
services:
webserver:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- db
- cache
networks:
- app-network
db:
image: postgres:14
environment:
POSTGRES_DB: mydatabase
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mysecretpassword
volumes:
- db_data:/var/lib/postgresql/data
networks:
- app-network
cache:
image: redis:latest
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
db_data:
„docker-compose.yml“ paaiškinimas:
webserverpaslauga: Naudoja oficialų „Nginx“ vaizdą. Ji susieja pagrindinio kompiuterio 80 prievadą su konteinerio 80 prievadu. Ji montuoja mūsų vietinįhtmlkatalogą svetainės turiniui ir mūsų pasirinktinįnginx/default.conf„Nginx“ konfigūracijai. Svarbu, kad jidepends_ondbircache, nurodant, kad šios paslaugos turėtų būti paleidžiamos prieš žiniatinklio serverį. Ji prijungta prie mūsų pasirinktinioapp-network.dbpaslauga: Naudoja oficialų „PostgreSQL“ vaizdą. Nustatome esminius aplinkos kintamuosius duomenų bazės kūrimui, vartotojui ir slaptažodžiui. Pavadintas apimtisdb_datanaudojamas siekiant užtikrinti, kad duomenų bazės duomenys išliktų net ir pašalinus bei iš naujo sukūrus konteinerį. Ji taip pat prijungiama prieapp-network.cachepaslauga: Naudoja oficialų „Redis“ vaizdą. Tai paprasta paslauga, kuriai nereikia nuolatinių duomenų šiam pavyzdžiui, ir ji prijungiama prieapp-network.networks: Mes apibrėžiame vieną tiltinį tinklą pavadinimuapp-network. Tai svarbu izoliacijai ir bendravimui. Pagal numatytuosius nustatymus „Docker Compose“ sukuria tinklą, tačiau jį aiškiai apibrėžiant gauname daugiau kontrolės ir aiškumo. Paslaugos tame pačiame pasirinktiniame tinkle gali pasiekti viena kitą naudodamos savo paslaugų pavadinimus kaip pagrindinius kompiuterius (pvz., žiniatinklio serveris gali pasiektidbperlocalhost:5432arbadb:5432, priklausomai nuo konfigūracijos ir konteksto).volumes: Mes apibrėžiamedb_datapavadintą apimtį. „Docker“ valdo šių apimčių gyvavimo ciklą.
5. Jūsų krūvos paleidimas:
Terminalo komandinėje eilutėje pereikite į savo projekto katalogą (my-web-app/) ir paleiskite:
docker compose up -d
docker compose: Iškviečia „Docker Compose“ komandą.up: Sukuria ir paleidžiadocker-compose.ymlfaile apibrėžtus konteinerius.-d: Paleidžia konteinerius atskirame režime (fone).
6. Patvirtinimas:
Atidarykite savo žiniatinklio naršyklę ir eikite į http://localhost. Turėtumėte matyti savo index.html failo turinį.
Norėdami pamatyti veikiančią duomenų bazę ir talpyklą, galite patikrinti konteinerius:
docker compose ps
Tai parodys jūsų webserver, db ir cache konteinerių būseną.
7. Jūsų krūvos sustabdymas:
Baigę sustabdykite ir pašalinkite konteinerius, tinklus ir apimtis (neprivaloma):
docker compose down
Norėdami pašalinti ir pavadintas apimtis (kurios ištrins jūsų duomenų bazės duomenis), naudokite:
docker compose down -v
Izoliacija ir atkuriamumas veikiant
Izoliacija:
„Docker Compose“ užtikrina izoliaciją keliais būdais:
- Procesų izoliacija: Kiekviena paslauga veikia savo konteineryje, izoliuota nuo pagrindinio kompiuterio ir kitų konteinerių. Jie turi savo failų sistemą, procesų erdvę ir tinklo sąsajas.
- Tinklo izoliacija: Apibrėždami pasirinktinį tinklą (
app-network), mes kontroliuojame, kaip paslaugos bendrauja. Pagal numatytuosius nustatymus skirtinguose tinkluose esantys konteineriai negali bendrauti. Tos pačios tinklo paslaugos gali bendrauti tik tada, jei tai aiškiai leidžiama arba jei jos atidaro prievadus. Mūsų pavyzdyjewebservergali pasiektidbircachepaslaugas naudodamas jų paslaugų pavadinimus, tačiau išorinis priėjimas prie duomenų bazės ir talpyklos prievadų pagal numatytuosius nustatymus nėra atidarytas, o tai didina saugumą. - Priklausomybių valdymas:
depends_onpadeda valdyti paleidimo tvarką, užkertant kelią problemoms, kai paslauga bando prisijungti prie dar nepradėtos priklausomybės.
Atkuriamumas:
docker-compose.yml failas yra vienintelis jūsų programos aplinkos tiesos šaltinis. Kiekvienas, turintis įdiegtą „Docker“ ir „Docker Compose“, gali klonuoti jūsų projektą, paleisti docker compose up -d ir turėti identišką, veikiančią aplinką. Tai pašalina „tai veikia mano mašinoje“ problemą, užtikrinant, kad pati aplinka būtų valdoma versijų kontrolės ir nuosekliai diegiama.
Išplėstiniai svarstymai ir įspėjimai
depends_onprieš paslaugos pasirengimą:depends_ontik užtikrina, kad konteineris yra paleistas. Tai negarantuoja, kad programa viduje konteinerio yra pasirengusi priimti ryšius. Duomenų bazėms tai yra dažna problema. Gali tekti įgyvendinti sveikatos patikrinimus arba bandymo iš naujo mechanizmus jūsų programos kode arba naudoti tokius įrankius kaipwait-for-it.shscenarijai jūsų paleidimo komandoje.- Gamybos diegimai: Nors „Docker Compose“ puikiai tinka kūrimui ir paruošimui, gamybai dažnai norėsite patikimesnio orkestravimo. Įrankiai, tokie kaip Kubernetes ar Docker Swarm, yra skirti valdyti konteinerizuotas programas dideliu mastu, tvarkyti apkrovos balansavimą, savarankišką taisymą ir nuolinius atnaujinimus. Tačiau „Docker Compose“ failai dažnai gali būti pritaikyti arba naudojami kaip pagrindas šiems pažangesniems orkestratoriams.
- Vaizdų valdymas: Gamybai rekomenduojama naudoti konkrečias vaizdų žymas (pvz.,
postgres:14.5), o nelatest, kad būtų užtikrinti prognozuojami diegimai. Taip pat galite kurti savo pasirinktinius vaizdus naudodami „Dockerfiles“ savo programos kodui. - Saugumas: Visada atkreipkite dėmesį į neskelbtiną informaciją, pvz., duomenų bazės slaptažodžius. Naudokite aplinkos kintamuosius ir apsvarstykite galimybę naudoti „Docker“ paslaptis arba išorines paslapčių valdymo priemones gamybos aplinkoms, o ne įrašyti jas tiesiai į
docker-compose.yml. - Išteklių apribojimai: Gamybai norėsite nustatyti išteklių apribojimus (CPU, atmintį) savo konteineriams, kad vienas paslauga nesunaudotų visų pagrindinio kompiuterio išteklių.
- Tinklo sudėtingumas: Didėjant jūsų programai, sudėtingų tinklo konfigūracijų valdymas gali tapti sudėtingas. „Docker“ tinklo galimybės yra galingos, tačiau reikalauja kruopštaus planavimo.
Išvada
„Docker Compose“ pakeičia tai, kaip mes galvojame apie žiniatinklio programų diegimą ir valdymą. Leisdamas apibrėžti visą jūsų krūvą deklaratyviai docker-compose.yml faile, jis suteikia neprilygstamą nuoseklumą, izoliaciją ir atkuriamumą jūsų kūrimo ir diegimo darbo eigoms. Jis tiesiogiai sprendžia „tai veikia mano mašinoje“ problemą, supakuodamas ne tik jūsų programą, bet ir visą jos operacinę aplinką. Nesvarbu, ar esate vienišas kūrėjas, nustatantis asmeninį projektą, ar didesnės komandos dalis, „Docker Compose“ valdymas yra svarbus žingsnis link patikimesnių, lengviau prižiūrimų ir efektyvesnių žiniatinklio prieglobos sprendimų kūrimo. Tai sudaro tvirtą pagrindą suprasti pažangesnes konteinerių orkestravimo technologijas ir galiausiai veda prie sklandesnių kūrimo ciklų ir patikimesnių gamybos sistemų.