Atraskite Docker galią su šiuo išsamiu vadovu. Sužinokite apie konteinerizaciją, jos privalumus, pagrindines sąvokas ir praktinį pritaikymą pasauliniam programinės įrangos kūrimui.
Docker konteinerizacija: išsamus vadovas pasauliniams kūrėjams
Šiandieninėje sparčiai besikeičiančioje technologinėje aplinkoje efektyvus ir nuoseklus programų diegimas yra nepaprastai svarbus. Nesvarbu, ar esate tarptautinės korporacijos ar paskirstyto startuolio dalis, užtikrinti, kad jūsų programos veiktų sklandžiai įvairiose aplinkose, yra didelis iššūkis. Čia į pagalbą ateina Docker konteinerizacija, siūlanti standartizuotą būdą programuoti, platinti ir vykdyti programas. Šiame išsamiame vadove bus nagrinėjamos pagrindinės Docker sąvokos, jos privalumai pasaulinėms kūrimo komandoms ir praktiniai žingsniai, kaip pradėti.
Kas yra Docker ir kodėl jis iš esmės keičia programinės įrangos kūrimą?
Iš esmės Docker yra atvirojo kodo platforma, automatizuojanti programų diegimą, mastelio keitimą ir valdymą lengvuose, perkeliamuose vienetuose, vadinamuose konteineriais. Įsivaizduokite konteinerį kaip savarankišką paketą, kuriame yra viskas, ko reikia programai veikti: kodas, vykdymo laikas, sistemos įrankiai, sistemos bibliotekos ir nustatymai. Ši izoliacija užtikrina, kad programa veiks taip pat, nepriklausomai nuo pagrindinės infrastruktūros, išspręsdama seną problemą „tai veikia mano kompiuteryje“.
Tradiciškai programų diegimas apėmė sudėtingas konfigūracijas, priklausomybių valdymą ir galimus konfliktus tarp skirtingų programinės įrangos versijų. Tai ypač sudėtinga buvo pasaulinėms komandoms, kuriose kūrėjai galėjo naudoti skirtingas operacines sistemas arba turėti skirtingas kūrimo aplinkas. Docker elegantiškai apeina šias problemas atitraukdamas nuo pagrindinės infrastruktūros.
Pagrindiniai Docker privalumai pasaulinėms komandoms:
- Nuoseklumas įvairiose aplinkose: Docker konteineriai supakuoja programą ir jos priklausomybes kartu. Tai reiškia, kad programa, sukurta ir išbandyta konteineryje kūrėjo nešiojamajame kompiuteryje, veiks identiškai testavimo serveryje, gamybos serveryje ar net debesyje, nepriklausomai nuo pagrindinės operacinės sistemos ar iš anksto įdiegtos programinės įrangos. Šis vienodumas keičia žaidimą paskirstytoms komandoms, sumažindamas integracijos galvos skausmus ir diegimo klaidas.
- Nešiojamumas: Docker konteineriai gali veikti bet kurioje sistemoje, kurioje įdiegtas Docker – tiek kūrėjo nešiojamajame kompiuteryje (Windows, macOS, Linux), tiek virtualioje mašinoje, tiek debesies serveryje. Tai neįtikėtinai palengvina programų perkėlimą tarp skirtingų aplinkų ir debesies paslaugų teikėjų be brangių perkonfigūravimų.
- Efektyvumas ir greitis: Konteineriai yra žymiai lengvesni ir greičiau paleidžiami nei tradicinės virtualios mašinos. Jie dalijasi pagrindinės operacinės sistemos branduoliu, o tai reiškia, kad kiekvienai programai nereikia įdiegti visos operacinės sistemos. Tai lemia greitesnį paleidimo laiką, sumažėjusį išteklių suvartojimą ir didesnį programų tankį viename pagrindiniame kompiuteryje.
- Izoliacija: Kiekvienas konteineris veikia izoliuotai nuo kitų konteinerių ir pagrindinės sistemos. Ši izoliacija apsaugo nuo priklausomybių konfliktų ir padidina saugumą, nes vieno konteinerio procesai negali trukdyti kito procesams.
- Supaprastintas priklausomybių valdymas: Dockerfiles (kuriuos aptarsime vėliau) aiškiai apibrėžia visas priklausomybes, užtikrindami, kad konteineryje visada būtų teisingos bibliotekų ir vykdymo aplinkų versijos. Tai pašalina spėliojimą ir „priklausomybių pragarą“ kūrėjams.
- Greitesni kūrimo ciklai: Supaprastindamas kūrimo, testavimo ir diegimo procesą, Docker leidžia greičiau kartoti ir greičiau išleisti. Kūrėjai gali greitai sukurti naujas aplinkas, išbandyti kodą ir įdiegti atnaujinimus su didesniu pasitikėjimu.
- Mastelio keitimas: Docker sklandžiai integruojamas su orkestravimo įrankiais, tokiais kaip Kubernetes, kurie skirti valdyti didelio masto konteinerines programas. Tai leidžia lengvai padidinti arba sumažinti programų mastelį atsižvelgiant į poreikį – tai yra labai svarbi funkcija pasaulinėms paslaugoms, kuriose gali atsirasti svyruojančių vartotojų apkrovų iš skirtingų regionų.
Paaiškintos pagrindinės Docker sąvokos
Norint efektyviai naudoti Docker, būtina suprasti jo pagrindinius komponentus.
1. Docker vaizdas
Docker vaizdas yra tik skaitymui skirtas šablonas, naudojamas Docker konteineriams kurti. Iš esmės tai yra programos ir jos aplinkos momentinė nuotrauka konkrečiu laiko momentu. Vaizdai kuriami sluoksniais, kai kiekviena instrukcija Dockerfile (pvz., paketo įdiegimas, failų kopijavimas) sukuria naują sluoksnį. Šis sluoksniuotas metodas leidžia efektyviai saugoti ir greičiau kurti, nes Docker gali pakartotinai naudoti nepakeistus sluoksnius iš ankstesnių kompiliacijų.
Vaizdai saugomi registruose, o populiariausias viešasis registras yra Docker Hub. Galite galvoti apie vaizdą kaip apie brėžinį, o apie konteinerį – kaip apie to brėžinio egzempliorių.
2. Dockerfile
Dockerfile yra paprastas tekstinis failas, kuriame yra instrukcijų rinkinys Docker vaizdui sukurti. Jame nurodomas bazinis vaizdas, kurį reikia naudoti, komandos, kurias reikia vykdyti, failai, kuriuos reikia kopijuoti, prievadai, kuriuos reikia atidaryti, ir kt. Docker nuskaito Dockerfile ir nuosekliai vykdo šias instrukcijas, kad sukurtų vaizdą.
Paprastas Dockerfile gali atrodyti taip:
# Use an official Python runtime as a parent image
FROM python:3.9-slim
# Set the working directory in the container
WORKDIR /app
# Copy the current directory contents into the container at /app
COPY . /app
# Install any needed packages specified in requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
# Make port 80 available to the world outside this container
EXPOSE 80
# Run app.py when the container launches
CMD ["python", "app.py"]
Šis Dockerfile apibrėžia vaizdą, kuris:
- Pradedamas nuo lengvo Python 3.9 vaizdo.
- Nustato darbinį katalogą į
/app
. - Nukopijuoja programos kodą (iš dabartinio katalogo pagrindiniame kompiuteryje) į
/app
katalogą konteinerio viduje. - Įdiegia Python priklausomybes, išvardytas
requirements.txt
. - Atidaro 80 prievadą tinklo prieigai.
- Nurodo, kad konteineris turi vykdyti
app.py
, kai jis paleidžiamas.
3. Docker konteineris
Docker konteineris yra vykdomas Docker vaizdo egzempliorius. Kai paleidžiate Docker vaizdą, jis sukuria konteinerį. Galite paleisti, sustabdyti, perkelti ir ištrinti konteinerius. Iš to paties vaizdo galima paleisti kelis konteinerius, kurių kiekvienas veikia izoliuotai.
Pagrindinės konteinerių charakteristikos yra:
- Pagal numatytuosius nustatymus efemeriškas: Konteineriai sukurti taip, kad būtų vienkartiniai. Kai konteineris sustoja arba pašalinamas, visi duomenys, įrašyti į jo failų sistemą, prarandami, nebent naudojami nuolatiniai saugojimo mechanizmai.
- Proceso izoliacija: Kiekvienas konteineris turi savo failų sistemą, tinklo sąsajas ir proceso erdvę.
- Bendras branduolys: Konteineriai dalijasi pagrindinio kompiuterio operacinės sistemos branduoliu, todėl jie yra daug efektyvesni nei virtualios mašinos.
4. Docker registras
Docker registras yra saugykla, skirta Docker vaizdams saugoti ir platinti. Docker Hub yra numatytasis viešasis registras, kuriame galite rasti didelę iš anksto sukurtų vaizdų kolekciją įvairioms programavimo kalboms, duomenų bazėms ir programoms. Taip pat galite nustatyti privačius registrus savo organizacijos nuosavybės vaizdams.
Kai vykdote komandą, pvz., docker run ubuntu
, Docker pirmiausia patikrina, ar jūsų vietiniame kompiuteryje yra Ubuntu vaizdas. Jei jis nerastas, jis ištraukia vaizdą iš sukonfigūruoto registro (pagal numatytuosius nustatymus Docker Hub).
5. Docker Engine
Docker Engine yra pagrindinė kliento-serverio technologija, kuri kuria ir vykdo Docker konteinerius. Jį sudaro:
- Demonas (
dockerd
): ilgai veikiantis foninis procesas, valdantis Docker objektus, tokius kaip vaizdai, konteineriai, tinklai ir tomai. - REST API: sąsaja, kurią programos gali naudoti norėdamos bendrauti su demonu.
- CLI (
docker
): komandinės eilutės sąsaja, leidžianti vartotojams bendrauti su demonu ir jo API.
Darbo pradžia su Docker: praktinis vadovas
Atlikime keletą esminių Docker komandų ir dažną naudojimo atvejį.
Įdiegimas
Pirmas žingsnis yra Docker įdiegimas savo kompiuteryje. Apsilankykite oficialioje Docker svetainėje ([docker.com](https://www.docker.com/)) ir atsisiųskite tinkamą diegimo programą savo operacinei sistemai (Windows, macOS arba Linux). Vykdykite diegimo instrukcijas savo platformai.
Pagrindinės Docker komandos
Štai keletas pagrindinių komandų, kurias reguliariai naudosite:
docker pull <image_name>:<tag>
: Atsisiunčia vaizdą iš registro. Pavyzdys:docker pull ubuntu:latest
docker build -t <image_name>:<tag> .
: Sukuria vaizdą iš Dockerfile dabartiniame kataloge. Vėliavėlė-t
pažymi vaizdą. Pavyzdys:docker build -t my-python-app:1.0 .
docker run <image_name>:<tag>
: Sukuria ir paleidžia konteinerį iš vaizdo. Pavyzdys:docker run -p 8080:80 my-python-app:1.0
(Vėliavėlė-p
susieja pagrindinio kompiuterio 8080 prievadą su konteinerio 80 prievadu).docker ps
: Išvardija visus veikiančius konteinerius.docker ps -a
: Išvardija visus konteinerius, įskaitant sustabdytus.docker stop <container_id_or_name>
: Sustabdo veikiantį konteinerį.docker start <container_id_or_name>
: Paleidžia sustabdytą konteinerį.docker rm <container_id_or_name>
: Pašalina sustabdytą konteinerį.docker rmi <image_id_or_name>
: Pašalina vaizdą.docker logs <container_id_or_name>
: Gauna konteinerio žurnalus.docker exec -it <container_id_or_name> <command>
: Vykdo komandą veikiančiame konteineryje. Pavyzdys:docker exec -it my-container bash
, kad gautumėte apvalkalą konteinerio viduje.
Pavyzdys: paprasto žiniatinklio serverio paleidimas
Sukurkime paprastą Python žiniatinklio serverį naudodami Flask sistemą.
1. Projekto sąranka:
Sukurkite katalogą savo projektui. Šiame kataloge sukurkite du failus:
app.py
:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello from a Dockerized Flask App!'
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=80)
requirements.txt
:
Flask==2.0.0
2. Sukurkite Dockerfile:
Tame pačiame projekto kataloge sukurkite failą pavadinimu Dockerfile
(be plėtinio) su šiuo turiniu:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 80
CMD ["python", "app.py"]
3. Sukurkite Docker vaizdą:
Atidarykite terminalą, eikite į projekto katalogą ir paleiskite:
docker build -t my-flask-app:latest .
Ši komanda nurodo Docker sukurti vaizdą naudojant Dockerfile
dabartiniame kataloge ir pažymėti jį kaip my-flask-app:latest
.
4. Paleiskite Docker konteinerį:
Dabar paleiskite konteinerį iš ką tik sukurtą vaizdą:
docker run -d -p 5000:80 my-flask-app:latest
Vėliavėlių paaiškinimas:
-d
: Paleidžia konteinerį atsietu režimu (fone).-p 5000:80
: Susieja 5000 prievadą jūsų pagrindiniame kompiuteryje su 80 prievadu konteinerio viduje.
5. Patikrinkite programą:
Atidarykite žiniatinklio naršyklę ir eikite į http://localhost:5000
. Turėtumėte pamatyti pranešimą: „Hello from a Dockerized Flask App!“. (Sveiki iš Dockerizuotos Flask programos!).
Norėdami pamatyti veikiantį konteinerį, naudokite docker ps
. Norėdami jį sustabdyti, naudokite docker stop <container_id>
(pakeiskite <container_id>
ID, kurį rodo docker ps
).
Išplėstinės Docker sąvokos pasauliniam diegimui
Kai jūsų projektai auga ir jūsų komandos tampa labiau paskirstytos, norėsite ištirti daugiau pažangių Docker funkcijų.
Docker Compose
Programoms, kurias sudaro kelios paslaugos (pvz., žiniatinklio priekinė sąsaja, galinė API ir duomenų bazė), atskirų konteinerių valdymas gali tapti sudėtingas. Docker Compose yra įrankis, skirtas apibrėžti ir vykdyti kelių konteinerių Docker programas. Jūs apibrėžiate savo programos paslaugas, tinklus ir tomus YAML faile (docker-compose.yml
), ir viena komanda galite sukurti ir paleisti visas savo paslaugas.
Pavyzdinis docker-compose.yml
paprastai žiniatinklio programai su Redis talpykla gali atrodyti taip:
version: '3.8'
services:
web:
build: .
ports:
- "5000:80"
volumes:
- .:/app
depends_on:
- redis
redis:
image: "redis:alpine"
Naudodami šį failą galite paleisti abi paslaugas naudodami docker-compose up
.
Tomai nuolatiniams duomenims
Kaip minėta, konteineriai yra efemeriški. Jei vykdote duomenų bazę, norėsite išsaugoti duomenis už konteinerio gyvavimo ciklo ribų. Docker tomai yra pageidaujamas mechanizmas duomenims, sugeneruotiems ir naudojamiems Docker konteinerių, išsaugoti. Tomus valdo Docker ir jie saugomi už konteinerio rašomo sluoksnio ribų.
Norėdami prijungti tomą vykdydami konteinerį:
docker run -v my-data-volume:/var/lib/mysql mysql:latest
Ši komanda sukuria tomą pavadinimu my-data-volume
ir prijungia jį prie /var/lib/mysql
MySQL konteinerio viduje, užtikrindama, kad jūsų duomenų bazės duomenys išliks.
Docker tinklai
Pagal numatytuosius nustatymus kiekvienas Docker konteineris gauna savo tinklo vardų erdvę. Norėdami įgalinti ryšį tarp konteinerių, turite sukurti tinklą ir prijungti savo konteinerius prie jo. Docker pateikia kelis tinklų tvarkykles, o bridge
tinklas yra labiausiai paplitęs vieno pagrindinio kompiuterio diegimams.
Kai naudojate Docker Compose, jis automatiškai sukuria numatytąjį tinklą jūsų paslaugoms, leidžiantį joms bendrauti naudojant savo paslaugų pavadinimus.
Docker Hub ir privatūs registrai
Docker Hub panaudojimas yra labai svarbus dalijantis vaizdais komandos viduje arba su visuomene. Nuosavybės programoms privataus registro nustatymas yra būtinas saugumui ir kontroliuojamai prieigai. Debesies paslaugų teikėjai, tokie kaip Amazon Elastic Container Registry (ECR), Google Container Registry (GCR) ir Azure Container Registry (ACR), siūlo valdomas privačias registro paslaugas.
Saugumo geriausia praktika
Nors Docker suteikia izoliaciją, saugumas yra nuolatinis rūpestis, ypač pasauliniame kontekste:
- Nuolat atnaujinkite Docker ir vaizdus: Reguliariai atnaujinkite savo Docker variklį ir bazinius vaizdus, kad pataisytumėte žinomus pažeidžiamumus.
- Naudokite minimalius bazinius vaizdus: Pasirinkite lengvus vaizdus, tokius kaip Alpine Linux, kad sumažintumėte atakos paviršių.
- Nuskaitykite vaizdus dėl pažeidžiamumų: Įrankiai, tokie kaip Trivy arba integruotas Docker skaitytuvas, gali padėti nustatyti žinomus pažeidžiamumus jūsų vaizduose.
- Vykdykite konteinerius su mažiausiomis privilegijomis: Venkite vykdyti konteinerius kaip root, kai tik įmanoma.
- Saugiai valdykite paslaptis: Niekada nekoduokite konfidencialios informacijos (pvz., API raktų arba slaptažodžių) tiesiogiai į Dockerfiles arba vaizdus. Naudokite Docker paslaptis arba aplinkos kintamuosius, valdomus orkestravimo įrankių.
Docker pasauliniame kontekste: mikropaslaugos ir CI/CD
Docker tapo šiuolaikinės programinės įrangos architektūros kertiniu akmeniu, ypač mikropaslaugų ir nuolatinės integracijos / nuolatinio diegimo (CI/CD) konvejeriuose.
Mikropaslaugų architektūra
Mikropaslaugos suskaido didelę programą į mažesnes, nepriklausomas paslaugas, kurios bendrauja per tinklą. Kiekviena mikropaslauga gali būti kuriama, diegiama ir keičiama masteliu nepriklausomai. Docker idealiai tinka šiai architektūrai:
- Nepriklausomas diegimas: Kiekviena mikropaslauga gali būti supakuota į savo Docker konteinerį, leidžiantį nepriklausomus atnaujinimus ir diegimus, nedarant įtakos kitoms paslaugoms.
- Technologijų įvairovė: Skirtingos mikropaslaugos gali būti kuriamos naudojant skirtingas programavimo kalbas ir sistemas, nes kiekvienas konteineris apima savo priklausomybes. Ši laisvė leidžia pasaulinėms komandoms pasirinkti geriausią įrankį kiekvienam darbui.
- Mastelio keitimas: Atskiras mikropaslaugas galima padidinti arba sumažinti masteliu atsižvelgiant į jų specifinę apkrovą, optimizuojant išteklių naudojimą ir našumą.
CI/CD konvejerius
CI/CD automatizuoja programinės įrangos pristatymo procesą, įgalindama dažnus ir patikimus programų atnaujinimus. Docker atlieka gyvybiškai svarbų vaidmenį CI/CD:
- Nuoseklios kūrimo aplinkos: Docker konteineriai suteikia nuoseklią aplinką kodui kurti ir išbandyti, pašalindami „veikia mano kompiuteryje“ problemas kuriant, testuojant ir rengiant aplinkas.
- Automatinis testavimas: Docker leidžia sukurti priklausomas paslaugas (pvz., duomenų bazes arba pranešimų eiles) kaip konteinerius automatiniam testavimui, užtikrinant, kad testai būtų vykdomi nuspėjamoje aplinkoje.
- Supaprastintas diegimas: Sukūrus ir išbandžius vaizdą, jį galima patikimai įdiegti gamybos aplinkose, tiek vietoje, tiek privačiame debesyje, tiek viešojo debesies infrastruktūroje. Įrankiai, tokie kaip Jenkins, GitLab CI, GitHub Actions ir CircleCI, visi sklandžiai integruojasi su Docker CI/CD darbo eigoms.
Internacionalizacijos ir lokalizacijos aspektai
Pasaulinėms programoms Docker taip pat gali supaprastinti internacionalizacijos (i18n) ir lokalizacijos (l10n) aspektus:
- Vietovės nustatymų valdymas: Užtikrinkite, kad Docker vaizduose būtų sukonfigūruoti teisingi vietovės nustatymai, jei jūsų programa priklauso nuo jų datoms, skaičiams formatuoti arba lokalizuotam tekstui rodyti.
- Regioniniai diegimai: Docker vaizdus galima įdiegti debesies regionuose, kurie yra arčiausiai jūsų vartotojų, sumažinant delsą ir pagerinant vartotojo patirtį pasaulinei auditorijai.
Konteinerių orkestravimas: Kubernetes vaidmuo
Nors Docker puikiai tinka atskiriems konteineriams programuoti ir vykdyti, didelio konteinerių skaičiaus valdymas keliuose kompiuteriuose reikalauja orkestravimo. Čia sužiba tokie įrankiai kaip Kubernetes. Kubernetes yra atvirojo kodo sistema, skirta automatizuoti konteinerinių programų diegimą, mastelio keitimą ir valdymą. Jis suteikia tokias funkcijas kaip apkrovos balansavimas, savigydymas, paslaugų atradimas ir atnaujinimai, todėl jis yra būtinas norint valdyti sudėtingas, paskirstytas sistemas.
Daugelis organizacijų naudoja Docker kurti ir programuoti savo programas, o tada naudoja Kubernetes tiems Docker konteineriams diegti, keisti mastelį ir valdyti gamybos aplinkose.
Išvada
Docker iš esmės pakeitė, kaip kuriame, siunčiame ir vykdome programas. Pasaulinėms kūrimo komandoms jo gebėjimas užtikrinti nuoseklumą, perkeliamumą ir efektyvumą įvairiose aplinkose yra neįkainojamas. Pritaikydami Docker ir jo pagrindines sąvokas, galite supaprastinti savo kūrimo darbo eigas, sumažinti diegimo trintį ir patikimai pristatyti programas vartotojams visame pasaulyje.
Pradėkite eksperimentuodami su paprastomis programomis ir palaipsniui tyrinėkite daugiau pažangių funkcijų, tokių kaip Docker Compose ir integracija su CI/CD konvejeriuose. Konteinerizacijos revoliucija jau čia, o Docker supratimas yra labai svarbus įgūdis bet kuriam šiuolaikiniam kūrėjui ar DevOps specialistui, siekiančiam sėkmės pasaulinėje technologijų arenoje.