Blog
Obvladovanje Docker Compose za izolirano, ponovljivo spletno gostovanje
Naučite se uporabiti Docker Compose za ustvarjanje izoliranih, ponovljivih in enostavno obvladljivih okolij za spletno gostovanje, s čimer boste rešili pogoste težave pri uvajanju.
Povzetek
Problem "pri meni deluje" je stalna težava spletnih razvijalcev in sistemskih skrbnikov. Docker s svojo tehnologijo kontejnerizacije ponuja robustno rešitev s pakiranjem aplikacij in njihovih odvisnosti v izolirana okolja. Vendar pa lahko upravljanje več medsebojno povezanih storitev, kot so spletni strežnik, podatkovna baza in predpomnilnik, postane zapleteno. Ta članek se poglobi v Docker Compose, zmogljivo orodje, ki poenostavi definicijo in upravljanje aplikacij z več kontejnerji Docker. Raziskali bomo, kako definirati celoten vaš spletni gostiteljski sklad v eni konfiguracijski datoteki, kar zagotavlja doslednost med razvojem, testiranjem in proizvodnjo ter s tem vodi do bolj zanesljivih in ponovljivih uvajanj.
Onkraj "Pri meni deluje": Obvladovanje vašega spletnega gostiteljskega sklada z Docker Compose
Neusmiljeni sindrom "pri meni deluje" je univerzalna boleča točka v razvoju programske opreme. Označuje razkorak med lokalnim okoljem razvijalca in produkcijskim strežnikom, kar vodi do frustrirajočih sej odpravljanja napak in nezanesljivih uvajanj. Docker je s svojo tehnologijo kontejnerizacije postal močno protisredstvo, ki obljublja dosledna izvedbena okolja. Kaj pa, ko vaša spletna aplikacija ni le en sam proces, temveč zapleten ekosistem storitev – spletni strežnik, podatkovna baza, predpomnilnik, morda sporočilna vrsta?
Ročno upravljanje teh medsebojno povezanih komponent v različnih okoljih lahko hitro preraste v kaos. Tu Docker Compose zasije. Je orodje, ki vam omogoča definirati in zagnati aplikacije z več kontejnerji Docker s preprosto datoteko YAML. Namesto da bi se ukvarjali z ukazi posameznih kontejnerjev, opišete vse storitve, omrežja in glasnosti vaše aplikacije, Docker Compose pa poskrbi za njihovo orkestracijo.
Ta članek vas bo vodil skozi praktično uporabo Docker Compose za gradnjo izoliranih, ponovljivih in obvladljivih okolij za spletno gostovanje. Premaknili se bomo onkraj osnovne uporabe Dockerja in prikazali, kako zgraditi robustno gostiteljsko nastavitev, ki zmanjšuje trenje pri uvajanju in povečuje zanesljivost.
Problem: Zapletenost sodobnih spletnih skladov
Sodobne spletne aplikacije redko obstajajo v vakuumu. Tipična nastavitev lahko vključuje:
- Spletni strežnik: Postreže sprednji del vaše aplikacije (npr. Nginx, Apache).
- Strežnik/runtime aplikacije: Izvede kodo vašega zalednega dela (npr. Node.js, Python/Gunicorn, PHP-FPM).
- Podatkovna baza: Shranjuje trajne podatke (npr. PostgreSQL, MySQL, MongoDB).
- Predpomnilnik: Izboljša zmogljivost s shranjevanjem pogosto dostopanih podatkov (npr. Redis, Memcached).
- Druge storitve: Kot so sporočilne vrste, iskalni stroji ali procesorji za ozadnja dela.
Vsaka od teh komponent ima svoje odvisnosti, zahteve glede konfiguracije in omrežne potrebe. Ročna nastavitev in konfiguracija vsake na novem strežniku ali celo na prenosnem računalniku razvijalca je zamudna, nagnjena k napakam in težko ponovljiva. To vodi do:
- Nedosledna okolja: Razlike med razvojnimi, testnimi in produkcijskimi okolji.
- Pekel odvisnosti: Konflikti med različnimi različicami knjižnic ali sistemskih paketov.
- Napake pri ročni konfiguraciji: Tipkarske napake ali spregledani koraki med nastavitvijo.
- Težko vključevanje: Novi člani ekipe se težko spopadajo z zagonom razvojnega okolja.
- Počasni cikli uvajanja: Postopek prenosa kode iz razvoja v produkcijo je okoren.
Rešitev: Docker Compose za deklarativno infrastrukturo
Docker Compose rešuje te izzive tako, da vam omogoča definirati celoten sklop aplikacije v eni datoteki docker-compose.yml. Ta datoteka deluje kot načrt, ki določa vsako storitev, njeno sliko, vrata, glasnosti, spremenljivke okolja in kako naj storitve komunicirajo med seboj.
Ključni koncepti v docker-compose.yml:
version: Določa različico formata datoteke Compose. Dobra praksa je uporabiti nedavno različico.services: To je osrednji razdelek, kjer definirate vsako kontejnerizirano komponento vaše aplikacije.image: Docker slika, ki jo želite uporabiti za storitev (npr.nginx:latest,postgres:14). Uporabite lahko tudibuildza določitev Dockerfile za lastne slike.ports: Preslika vrata s gostiteljskega stroja na kontejner (npr.80:80preslika gostiteljska vrata 80 na vrata kontejnerja 80).volumes: Montira gostiteljske mape ali poimenovane glasnosti v kontejner za trajne podatke ali konfiguracijo (npr../html:/usr/share/nginx/html).environment: Nastavi spremenljivke okolja znotraj kontejnerja (npr.POSTGRES_USER=myuser).depends_on: Določa odvisnosti med storitvami, kar zagotavlja, da se začnejo v določenem vrstnem redu (čeprav ne zagotavlja pripravljenosti).networks: Definira omrežja za komunikacijo vaših storitev.
networks: Definira lastna omrežja, ki se jim lahko pridružijo vaše storitve za izolirano komunikacijo.volumes: Definira poimenovane glasnosti za trajno shranjevanje podatkov.
Praktični koraki: Gradnja vzorčnega sklada za spletno gostovanje
Zgradimo pogost scenarij spletnega gostovanja: statično spletno mesto, ki ga postreže Nginx, s podatkovno bazo PostgreSQL za dinamično vsebino. Dodali bomo tudi predpomnilnik Redis za izboljšanje zmogljivosti.
1. Struktura projekta:
Ustvarite mapo za svoj projekt, npr. my-web-app. Znotraj boste imeli:
my-web-app/
├── docker-compose.yml
├── nginx/
│ └── default.conf
└── html/
└── index.html
2. nginx/default.conf (Osnovna konfiguracija Nginxa):
Ta datoteka pove Nginxu, kako postreči vaše statične datoteke in potencialno posredovati zahteve strežniku aplikacije (čeprav se bomo za preprostost osredotočili na statične datoteke).
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 (Vsebina vašega spletnega mesta):
Preprosta HTML datoteka za testiranje.
<!DOCTYPE html>
<html>
<head>
<title>Dobrodošli na mojem Dockeriziranem spletnem mestu!</title>
</head>
<body>
<h1>Pozdravljeni iz Docker Compose!</h1>
<p>To spletno mesto postreže Nginx v kontejnerju.</p>
</body>
</html>
4. docker-compose.yml (Srce nastavitve):
Ta datoteka definira naše tri storitve: Nginx, PostgreSQL in 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:
Razlaga docker-compose.yml:
- Storitev
webserver: Uporablja uradno sliko Nginxa. Preslika vrata 80 gostitelja na vrata 80 kontejnerja. Montira našo lokalno mapohtmlza vsebino spletnega mesta in našo lastno konfiguracijonginx/default.confza konfiguracijo Nginxa. Ključno je, dadepends_onstoritvidbincache, kar pomeni, da naj bi se te storitve začele pred spletnim strežnikom. Povezan je z našim lastnim omrežjemapp-network. - Storitev
db: Uporablja uradno sliko PostgreSQL. Nastavimo bistvene spremenljivke okolja za ustvarjanje podatkovne baze, uporabnika in gesla. Poimenovana glasnostdb_datase uporablja za zagotovitev, da podatki podatkovne baze ostanejo, tudi če je kontejner odstranjen in ponovno ustvarjen. Prav tako se poveže z omrežjemapp-network. - Storitev
cache: Uporablja uradno sliko Redis. To je preprosta storitev, za katero v tem primeru ni potrebnih trajnih podatkov, in se poveže z omrežjemapp-network. networks: Definiramo eno omrežje bridge z imenomapp-network. To je pomembno za izolacijo in komunikacijo. Privzeto Docker Compose ustvari omrežje, vendar nam eksplicitna definicija omogoča večji nadzor in jasnost. Storitve v istem omrežju se lahko dosežejo z uporabo njihovih servisnih imen kot gostiteljskih imen (npr. spletni strežnik se lahko poveže zdbnalocalhost:5432alidb:5432, odvisno od konfiguracije in konteksta).volumes: Definiramo poimenovano glasnostdb_data. Docker upravlja življenjski cikel teh glasnosti.
5. Zagon vašega sklada:
V svojem terminalu se pomaknite v mapo projekta (my-web-app/) in zaženite:
docker compose up -d
docker compose: Pokliče ukaz Docker Compose.up: Ustvari in zažene kontejnerje, definirane vdocker-compose.yml.-d: Zažene kontejnerje v ločenem načinu (v ozadju).
6. Preverjanje:
Odprite svoj spletni brskalnik in pojdite na http://localhost. Videti bi morali vsebino vaše datoteke index.html.
Če želite videti delujočo podatkovno bazo in predpomnilnik, lahko preverite kontejnerje:
docker compose ps
To vam bo pokazalo stanje vaših kontejnerjev webserver, db in cache.
7. Ustavitev vašega sklada:
Ko končate, ustavite in odstranite kontejnerje, omrežja in glasnosti (neobvezno):
docker compose down
Če želite odstraniti tudi poimenovane glasnosti (kar bo izbrisalo podatke vaše podatkovne baze), uporabite:
docker compose down -v
Izolacija in ponovljivost v akciji
Izolacija:
Docker Compose zagotavlja izolacijo na več načinov:
- Izolacija procesov: Vsaka storitev deluje v svojem kontejnerju, izoliranem od gostitelja in drugih kontejnerjev. Imajo lastno datotečni sistem, procesni prostor in omrežne vmesnike.
- Omrežna izolacija: Z definiranjem lastnega omrežja (
app-network) nadzorujemo, kako storitve komunicirajo. Privzeto kontejnerji v različnih omrežjih ne morejo komunicirati. Storitve v istem omrežju lahko komunicirajo le, če je to izrecno dovoljeno ali če odprejo vrata. V našem primeru lahkowebserverdoseže storitvidbincachez uporabo njunih servisnih imen, vendar zunanji dostop do vrat podatkovne baze in predpomnilnika privzeto ni odprt, kar povečuje varnost. - Upravljanje odvisnosti:
depends_onpomaga pri upravljanju vrstnega reda zagona, kar preprečuje težave, kjer storitev poskuša vzpostaviti povezavo z odvisnostjo, ki se še ni zagnala.
Ponovljivost:
Datoteka docker-compose.yml je edini vir resnice za okolje vaše aplikacije. Kdorkoli z nameščenim Dockerjem in Docker Compose lahko klonira vaš projekt, zažene docker compose up -d in dobi identično, delujoče okolje. To odpravlja problem "pri meni deluje" z zagotavljanjem, da je samo okolje pod nadzorom različic in se uvaja dosledno.
Napredna razmatranja in opozorila
depends_onproti pripravljenosti storitve:depends_onzagotavlja le, da se je kontejner zagnal. Ne zagotavlja, da je aplikacija znotraj kontejnerja pripravljena sprejemati povezave. Za podatkovne baze je to pogosta težava. Morda boste morali implementirati zdravstvene preglede ali mehanizme ponovnega poskusa v kodi vaše aplikacije ali uporabiti orodja, kot so skriptiwait-for-it.shznotraj vašega vstopne točke.- Produkcijska uvajanja: Medtem ko je Docker Compose odličen za razvoj in testiranje, boste za produkcijo pogosto želeli robustnejšo orkestracijo. Orodja, kot sta Kubernetes ali Docker Swarm, so zasnovana za upravljanje kontejneriziranih aplikacij v velikem obsegu, obravnavajo uravnoteženje obremenitve, samodejno popravljanje in postopne posodobitve. Vendar pa se datoteke Docker Compose pogosto lahko prilagodijo ali uporabijo kot osnova za te naprednejše orkestratorje.
- Upravljanje slik: Za produkcijo je dobra praksa uporabljati specifične oznake slik (npr.
postgres:14.5) namestolatest, da zagotovite predvidljiva uvajanja. Morda boste tudi zgradili lastne slike z uporabo Dockerfile za kodo vaše aplikacije. - Varnost: Vedno bodite pozorni na občutljive informacije, kot so gesla za podatkovne baze. Uporabite spremenljivke okolja in razmislite o uporabi Dockerjevih skrivnosti ali zunanjih orodij za upravljanje skrivnosti za produkcijska okolja, namesto da bi jih neposredno vpisali v
docker-compose.yml. - Omejitve virov: Za produkcijo boste želeli definirati omejitve virov (CPU, pomnilnik) za svoje kontejnerje, da preprečite, da bi ena storitev porabila vse razpoložljive vire na gostitelju.
- Zapletenost omrežja: Ko vaša aplikacija raste, lahko upravljanje zapletenih omrežnih konfiguracij postane izziv. Dockerjeve omrežne zmogljivosti so zmogljive, vendar zahtevajo skrbno načrtovanje.
Zaključek
Docker Compose spreminja način, kako razmišljamo o uvajanju in upravljanju spletnih aplikacij. Z omogočanjem deklarativne definicije celotnega vašega sklada v datoteki docker-compose.yml prinaša neprimerljivo doslednost, izolacijo in ponovljivost v vaše razvojne in uvajalne delovne tokove. Neposredno rešuje problem "pri meni deluje" s pakiranjem ne le vaše aplikacije, temveč celotnega njenega operativnega okolja. Ne glede na to, ali ste samostojni razvijalec, ki nastavlja osebni projekt, ali del večje ekipe, je obvladovanje Docker Compose ključen korak k gradnji bolj zanesljivih, vzdrževanjih in učinkovitih rešitev za spletno gostovanje. Postavlja trdne temelje za razumevanje naprednejših tehnologij orkestracije kontejnerjev in sčasoma vodi do bolj gladkih razvojnih ciklov in robustnejših produkcijskih sistemov.