Emuārs
Docker Compose apgūšana izolētai, atkārtojamiem tīmekļa mitināšanas risinājumiem
Uzziniet, kā izmantot Docker Compose, lai izveidotu izolētas, atkārtojamas un viegli pārvaldāmas tīmekļa mitināšanas vides, atrisinot izvietošanas problēmas.
Kopsavilkums
Problēma "tas darbojas manā mašīnā" ir pastāvīgs šķērslis tīmekļa izstrādātājiem un sistēmas administratoriem. Docker ar savu konteinerizācijas tehnoloģiju piedāvā spēcīgu risinājumu, iepakojot lietojumprogrammas un to atkarības izolētās vidēs. Tomēr vairāku savstarpēji savienotu pakalpojumu, piemēram, tīmekļa servera, datubāzes un kešošanas slāņa, pārvaldīšana var kļūt sarežģīta. Šis raksts padziļināti aplūko Docker Compose, jaudīgu rīku, kas vienkāršo daudzkonteineru Docker lietojumprogrammu definēšanu un pārvaldīšanu. Mēs izpētīsim, kā definēt visu jūsu tīmekļa mitināšanas steku vienā konfigurācijas failā, nodrošinot konsekvenci izstrādes, testēšanas un ražošanas vidēs, un galu galā nodrošinot uzticamāku un atkārtojamāku izvietošanu.
Tālāk par "Tas darbojas manā mašīnā": Savu tīmekļa mitināšanas steku savaldīšana ar Docker Compose
Šausminošais "tas darbojas manā mašīnā" sindroms ir universāla sāpju punkts programmatūras izstrādē. Tas norāda uz neatbilstību starp izstrādātāja lokālo vidi un ražošanas serveri, radot neapmierinošas atkļūdošanas sesijas un neuzticamu izvietošanu. Docker, izmantojot savu konteinerizācijas tehnoloģiju, ir kļuvis par spēcīgu pretlīdzekli, solot konsekventas izpildes vides. Bet kas notiek, ja jūsu tīmekļa lietojumprogramma nav tikai viens process, bet gan sarežģīta pakalpojumu ekosistēma – tīmekļa serveris, datubāze, kešošanas slānis, varbūt ziņojumu rinda?
Šo savstarpēji savienoto komponentu manuāla pārvaldīšana dažādās vidēs var ātri pārvērsties par haosu. Šeit Docker Compose izceļas. Tas ir rīks, kas ļauj definēt un palaist daudzkonteineru Docker lietojumprogrammas ar vienkāršu YAML failu. Tā vietā, lai cīnītos ar atsevišķām konteineru komandām, jūs aprakstāt visas savas lietojumprogrammas pakalpojumus, tīklus un apjomus, un Docker Compose tos orķestrē jūsu vietā.
Šis raksts palīdzēs jums praktiski izmantot Docker Compose, lai izveidotu izolētas, atkārtojamas un pārvaldāmas tīmekļa mitināšanas vides. Mēs pārsniegsim pamata Docker lietojumu, lai parādītu, kā izveidot stabilu mitināšanas iestatījumu, kas samazina izvietošanas sarežģītību un palielina uzticamību.
Problēma: Mūsdienu tīmekļa steku sarežģītība
Mūsdienu tīmekļa lietojumprogrammas reti pastāv vakuumā. Tipisks iestatījums var ietvert:
- Tīmekļa serveris: Jūsu lietojumprogrammas priekšgala apkalpošana (piemēram, Nginx, Apache).
- Lietojumprogrammas serveris/runtime: Jūsu aizmugures koda izpilde (piemēram, Node.js, Python/Gunicorn, PHP-FPM).
- Datubāze: Pastāvīgu datu glabāšana (piemēram, PostgreSQL, MySQL, MongoDB).
- Kešs: Veiktspējas uzlabošana, saglabājot bieži lietotus datus (piemēram, Redis, Memcached).
- Citi pakalpojumi: Piemēram, ziņojumu rindas, meklētājprogrammas vai fona darbu procesori.
Katram no šiem komponentiem ir savas atkarības, konfigurācijas prasības un tīkla vajadzības. Manuāla katra iestatīšana un konfigurēšana jaunā serverī vai pat izstrādātāja klēpjdatorā ir laikietilpīga, kļūdaina un grūti konsekventi atkārtojama. Tas noved pie:
- Neatbilstošas vides: Atšķirības starp izstrādes, testēšanas un ražošanas vidēm.
- Atkarību elle: Konflikti starp dažādām bibliotēku vai sistēmas pakešu versijām.
- Manuālas konfigurācijas kļūdas: Rakstīšanas kļūdas vai izlaisti soļi iestatīšanas laikā.
- Grūta iesācēju integrācija: Jauni komandas locekļi saskaras ar grūtībām, lai palaistu izstrādes vidi.
- Lēni izvietošanas cikli: Koda pārvietošanas process no izstrādes uz ražošanu ir apgrūtinošs.
Risinājums: Docker Compose deklaratīvai infrastruktūrai
Docker Compose risina šīs problēmas, ļaujot jums definēt visu savu lietojumprogrammas steku vienā docker-compose.yml failā. Šis fails darbojas kā plāns, norādot katru pakalpojumu, tā attēlu, portus, apjomus, vides mainīgos un to, kā pakalpojumiem vajadzētu savienoties savā starpā.
Galvenie jēdzieni docker-compose.yml:
version: Norāda Compose faila formāta versiju. Ir laba prakse izmantot nesenu versiju.services: Šī ir galvenā sadaļa, kurā definējat katru savas lietojumprogrammas konteinerizēto komponenti.image: Docker attēls, ko izmantot pakalpojumam (piemēram,nginx:latest,postgres:14). Varat arī izmantotbuild, lai norādītu Dockerfile pielāgotiem attēliem.ports: Kartē portus no resursdatora mašīnas uz konteineri (piemēram,80:80kartē resursdatora 80. portu uz konteinera 80. portu).volumes: Montē resursdatora direktorijas vai nosauktus apjomus konteinerī pastāvīgai datu vai konfigurācijas glabāšanai (piemēram,./html:/usr/share/nginx/html).environment: Iestata vides mainīgos konteinerī (piemēram,POSTGRES_USER=myuser).depends_on: Norāda atkarības starp pakalpojumiem, nodrošinot, ka tie tiek palaisti noteiktā secībā (lai gan tas negarantē gatavību).networks: Definē pielāgotus tīklus, lai jūsu pakalpojumi varētu sazināties.
networks: Definē pielāgotus tīklus, kuriem jūsu pakalpojumi var pievienoties izolētai saziņai.volumes: Definē nosauktus apjomus pastāvīgai datu glabāšanai.
Praktiskie soļi: Izveidojot paraugu tīmekļa mitināšanas steku
Izveidosim izplatītu tīmekļa mitināšanas scenāriju: statisku tīmekļa vietni, ko apkalpo Nginx, ar PostgreSQL datubāzi dinamiskam saturam. Veiktspējas uzlabošanai pievienosim arī Redis kešu.
1. Projekta struktūra:
Izveidojiet direktoriju savam projektam, piemēram, my-web-app. Iekšpusē būs:
my-web-app/
├── docker-compose.yml
├── nginx/
│ └── default.conf
└── html/
└── index.html
2. nginx/default.conf (Pamata Nginx konfigurācija):
Šis fails norāda Nginx, kā apkalpot jūsu statiskos failus un potenciāli starpniekot pieprasījumus lietojumprogrammas serverim (lai gan vienkāršības labad mēs koncentrēsimies uz statiskiem failiem).
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ūsu tīmekļa vietnes saturs):
Vienkāršs HTML fails testēšanai.
<!DOCTYPE html>
<html>
<head>
<title>Welcome to My Dockerized Site!</title>
</head>
<body>
<h1>Hello from Docker Compose!</h1>
<p>This site is served by Nginx in a container.</p>
</body>
</html>
4. docker-compose.yml (Iestatījuma sirds):
Šis fails definē mūsu trīs pakalpojumus: Nginx, PostgreSQL un 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 skaidrojums:
webserverpakalpojums: Izmanto oficiālo Nginx attēlu. Tas kartē resursdatora 80. portu uz konteinera 80. portu. Tas montē mūsu lokālohtmldirektoriju tīmekļa vietnes saturam un mūsu pielāgotonginx/default.confNginx konfigurācijai. Būtiski, ka tasdepends_ondbuncache, norādot, ka šiem pakalpojumiem ideālā gadījumā vajadzētu tikt palaistiem pirms tīmekļa servera. Tas ir savienots ar mūsu pielāgotoapp-network.dbpakalpojums: Izmanto oficiālo PostgreSQL attēlu. Iestatām svarīgus vides mainīgos datubāzes izveidei, lietotājam un parolei. Nosauktais apjomsdb_datatiek izmantots, lai nodrošinātu, ka datubāzes dati saglabājas pat tad, ja konteiners tiek noņemts un izveidots atkārtoti. Tas arī savienojas arapp-network.cachepakalpojums: Izmanto oficiālo Redis attēlu. Tas ir vienkāršs pakalpojums, kam šajā piemērā nav nepieciešami pastāvīgi dati, un tas savienojas arapp-network.networks: Mēs definējam vienu tiltu tīklu ar nosaukumuapp-network. Tas ir svarīgi izolācijai un saziņai. Pēc noklusējuma Docker Compose izveido tīklu, taču tā skaidra definēšana sniedz mums lielāku kontroli un skaidrību. Pakalpojumi vienā pielāgotā tīklā var sasniegt viens otru, izmantojot to pakalpojumu nosaukumus kā resursdatoru vārdus (piemēram, tīmekļa serveris var savienoties ardbuzlocalhost:5432vaidb:5432atkarībā no konfigurācijas un konteksta).volumes: Mēs definējam nosaukto apjomudb_data. Docker pārvalda šo nosaukto apjomu dzīves ciklu.
5. Jūsu steka palaišana:
Terminālī pārejiet uz savu projekta direktoriju (my-web-app/) un palaidiet:
docker compose up -d
docker compose: Izsauc Docker Compose komandu.up: Izveido un palaida konteinerus, kas definētidocker-compose.yml.-d: Palaida konteinerus atvienotā režīmā (fonā).
6. Pārbaude:
Atveriet savu tīmekļa pārlūkprogrammu un dodieties uz http://localhost. Jums vajadzētu redzēt jūsu index.html faila saturu.
Lai redzētu datubāzi un kešu, kas darbojas, varat pārbaudīt konteinerus:
docker compose ps
Tas parādīs jūsu webserver, db un cache konteineru statusu.
7. Jūsu steka apturēšana:
Kad esat pabeiguši, apturiet un noņemiet konteinerus, tīklus un apjomus (pēc izvēles):
docker compose down
Lai noņemtu arī nosauktos apjomus (kas izdzēsīs jūsu datubāzes datus), izmantojiet:
docker compose down -v
Izolācija un atkārtojamība darbībā
Izolācija:
Docker Compose nodrošina izolāciju vairākos veidos:
- Procesu izolācija: Katrs pakalpojums darbojas savā konteinerī, izolēts no resursdatora un citiem konteineriem. Viņiem ir savs failu sistēma, procesu telpa un tīkla saskarnes.
- Tīkla izolācija: Definējot pielāgotu tīklu (
app-network), mēs kontrolējam, kā pakalpojumi sazinās. Pēc noklusējuma konteineri dažādos tīklos nevar sazināties. Pakalpojumi vienā tīklā var sazināties tikai tad, ja tas ir skaidri atļauts vai ja tie atklāj portus. Mūsu piemērāwebservervar sasniegtdbuncachepakalpojumus, izmantojot to pakalpojumu nosaukumus, taču piekļuve datubāzes un keša portiem no ārpuses pēc noklusējuma nav atklāta, tādējādi uzlabojot drošību. - Atkarību pārvaldība:
depends_onpalīdz pārvaldīt palaišanas secību, novēršot problēmas, kad pakalpojums mēģina izveidot savienojumu ar atkarību, kas vēl nav palaista.
Atkārtojamība:
docker-compose.yml fails ir vienīgais patiesības avots jūsu lietojumprogrammas videi. Ikviens ar instalētu Docker un Docker Compose var klonēt jūsu projektu, palaist docker compose up -d un iegūt identisku, strādājošu vidi. Tas novērš problēmu "tas darbojas manā mašīnā", nodrošinot, ka pati vide ir versiju kontrolēta un konsekventi izvietota.
Papildu apsvērumi un brīdinājumi
depends_onpret pakalpojumu gatavību:depends_ontikai nodrošina, ka konteiners ir sācis darboties. Tas negarantē, ka lietojumprogramma konteinerī ir gatava pieņemt savienojumus. Datubāzēm tā ir izplatīta problēma. Iespējams, jums būs jāievieš veselības pārbaudes vai atkārtošanas mehānismi jūsu lietojumprogrammas kodā vai jāizmanto tādi rīki kāwait-for-it.shskripti jūsu starta punktā.- Ražošanas izvietošana: Lai gan Docker Compose ir lieliski piemērots izstrādei un testēšanai, ražošanai bieži vien vēlēsities izmantot stabilākus orķestrēšanas rīkus. Tādi rīki kā Kubernetes vai Docker Swarm ir paredzēti konteinerizētu lietojumprogrammu mērogošanai, apkalpojot slodzes balansēšanu, pašdziedināšanu un pakāpeniskus atjauninājumus. Tomēr Docker Compose failus bieži var pielāgot vai izmantot kā pamatu šiem progresīvākajiem orķestrētājiem.
- Attēlu pārvaldība: Ražošanai ir laba prakse izmantot konkrētas attēlu birkas (piemēram,
postgres:14.5), nevislatest, lai nodrošinātu paredzamas izvietošanas. Varat arī izveidot savus pielāgotos attēlus, izmantojot Dockerfile jūsu lietojumprogrammas kodam. - Drošība: Vienmēr pievērsiet uzmanību sensitīvai informācijai, piemēram, datubāzes parolēm. Izmantojiet vides mainīgos un apsveriet Docker noslēpumu vai ārēju noslēpumu pārvaldības rīku izmantošanu ražošanas vidēs, nevis kodējot tos tieši
docker-compose.yml. - Resursu ierobežojumi: Ražošanai vēlēsities definēt resursu ierobežojumus (CPU, atmiņu) saviem konteineriem, lai neviens pakalpojums nepatērētu visus pieejamos resursus resursdatorā.
- Tīkla sarežģītība: Jūsu lietojumprogrammai augot, sarežģītu tīkla konfigurāciju pārvaldīšana var kļūt par izaicinājumu. Docker tīkla iespējas ir jaudīgas, taču prasa rūpīgu plānošanu.
Secinājums
Docker Compose maina veidu, kā mēs domājam par tīmekļa lietojumprogrammu izvietošanu un pārvaldīšanu. Ļaujot jums deklaratīvi definēt visu savu steku docker-compose.yml failā, tas nodrošina nepārspējamu konsekvenci, izolāciju un atkārtojamību jūsu izstrādes un izvietošanas darba plūsmās. Tas tieši risina problēmu "tas darbojas manā mašīnā", iepakojot ne tikai jūsu lietojumprogrammu, bet arī visu tās operacionālo vidi. Neatkarīgi no tā, vai esat viens izstrādātājs, kas iestata personīgo projektu, vai daļa no lielākas komandas, Docker Compose apgūšana ir svarīgs solis, lai izveidotu uzticamākus, uzturējamākus un efektīvākus tīmekļa mitināšanas risinājumus. Tas veido stabilu pamatu progresīvāku konteineru orķestrēšanas tehnoloģiju izpratnei un galu galā noved pie vienmērīgākiem izstrādes cikliem un stabilākām ražošanas sistēmām.