Table of Contents
De ce să combine sistemul cu Docker pentru desfășurarea producției
Infrastructura modernă cere ca serviciile containerizate să supravieţuiască reboots neaşteptate, eşecuri hardware, sau actualizări ale pachetelor. În timp ce Docker oferă politici de repornire ([, aceste politici funcţionează doar atâta timp cât Docker Daemon este difuzate. Systemd
- Ordine de pornire garantată prin directive privind dependența (de exemplu, după rețea. țintă, după docker.service)
- Exploatare unificată prin , făcând depanarea simplă
- Controlul fin asupra limitelor resurselor (CPU, memorie, I/O) utilizând directivele privind unitățile de sistem
- Repornire automată la defecțiune cu întârziere configurabilă și limite de spargere
- Suport pentru activarea prizei și pornirea cronometrată
Prin ambalarea fiecărui recipient Docker într-un fișier de serviciu sistemat, echipele de operațiuni câștigă o interfață consistentă pentru pornirea, oprirea și monitorizarea containerelor, reducând dependența de scripturi ad-hoc și intervenție manuală.
Crearea unui serviciu sistemat pentru un singur recipient Docker
Abordarea standard presupune scrierea unui fișier unitate de serviciu care solicită Docker comandă să ruleze și să oprească containerul. Mai jos vom merge prin proces pas cu pas, începând cu un exemplu de bază și apoi acoperind cerințele comune de producție.
Pasul 1: Scrieți fișierul unității de serviciu
Creați un fișier numit . Utilizați următorul șablon ca punct de plecare:
[Unit]
Description=My Application Container
After=network-online.target docker.service
Wants=network-online.target
Requires=docker.service
[Service]
Restart=always
RestartSec=10
StartLimitBurst=3
ExecStartPre=-/usr/bin/docker kill myapp
ExecStartPre=-/usr/bin/docker rm myapp
ExecStart=/usr/bin/docker run --rm --name myapp \
-e DB_HOST=10.0.1.50 \
-e DB_PORT=5432 \
-v /data/myapp:/app/data \
-p 8080:8080 \
myregistry/myapp:latest
ExecStop=/usr/bin/docker stop -t 10 myapp
ExecStopPost=-/usr/bin/docker rm myapp
[Install]
WantedBy=multi-user.target
]Explicarea directivelor cheie:
- ]
Pasul 2: Activați și porniți serviciul
sudo systemctl daemon-reload
sudo systemctl enable myapp.service
sudo systemctl start myapp.service
spune sistemului să recitească fişierele de service. creează simlink-ul astfel încât serviciul să înceapă din nou.
Gestionarea serviciului cu comenzi standard Systemd
Odată ce serviciul este în funcțiune, îl controlați la fel ca orice alt serviciu de sistem:
- Start:
- Stop:
- Restart:
- Status:
- Loguri: (urmează jurnalele vii)
Modele de configurare avansate
Desfășurările de producție necesită adesea mai mult decât un simplu . Mai jos sunt îmbunătățiri comune pe care le puteți adăuga la fișierele de service systemed.
Variabilele de mediu care trec
Secretele de codare sau configurarea din fișierul de serviciu nu sunt recomandate. În schimb, utilizați un fișier de mediu separat:
[Service]
EnvironmentFile=-/etc/myapp/env.conf
ExecStart=/usr/bin/docker run --rm --name myapp \
--env-file /etc/myapp/env.conf \
myregistry/myapp:latest
Prefixul înainte de cale înseamnă că serviciul va începe chiar dacă fișierul nu există (util în timpul setării inițiale).
Legături de rețea și de porturi
Pentru containerele care trebuie să comunice între ele pe aceeași gazdă, să ia în considerare utilizarea sau a rețelelor de pod definite de utilizator. Exemplu:
ExecStart=/usr/bin/docker run --rm --name web \
--network=my-net \
-p 443:443 \
-v /etc/ssl/certs:/etc/ssl/certs:ro \
myregistry/web:latest
Dacă se utilizează o rețea personalizată, asigurați-vă că rețeaua există înainte de începerea serviciului. Puteți adăuga o comandă pentru a o crea:
ExecStartPre=/usr/bin/docker network create my-net
Dependențe între containere
Atunci când un container necesită un alt recipient pentru a fi gata înainte de a începe (de exemplu, o aplicație web de așteptare pentru o bază de date), sistemul poate aplica comanda. Creați un al doilea fișier de serviciu pentru baza de date și apoi:
[Unit]
Description=Web App Container
After=network-online.target docker.service mydb.service
BindsTo=mydb.service
leagă aplicația web de ciclul de viață al bazei de date
Controalele şi pregătirea stării de sănătate
Controalele medicale Docker pot fi integrate cu sisteme pentru a preveni disponibilitatea prematură a serviciilor. Utilizaţi cu un scenariu care analizează criteriul de evaluare a sănătăţii:
ExecStartPost=/usr/local/bin/wait-for-health.sh http://localhost:8080/health 30
Scenariul trebuie să iasă 0 numai atunci când containerul este sănătos. Dacă nu reușește, sistemul marchează unitatea ca fiind eșuat.
Limite de resurse prin sistem
Puteți constrânge un container
[Service]
MemoryMax=512M
CPUQuota=50%
Aceste setări creează o limită dură care sistemată aplică independent de Docker.
Gestionarea containerelor multiple: Systemd vs. Docker Compose
Pentru un număr mic de containere (de exemplu, 2-5), fişierele individuale de service sistemate sunt simple şi întreţinabile. Cu toate acestea, atunci când un proiect implică multe servicii interconectate, Docker Compozite devine mai convenabil. Puteţi utiliza în continuare sistemat pentru a orchestra întregul stiva Docker Compose prin crearea unei unităţi de servicii care apelează . Exemplu:
[Unit]
Description=My Application Stack
After=network-online.target docker.service
Requires=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/myapp
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
[Install]
WantedBy=multi-user.target
Această abordare vă oferă simplitatea Comos pentru definirea serviciilor combinate cu managementul ciclului de viață sistematizat. Rețineți că ] este utilizat deoarece ] iese imediat. păstrează unitatea într-o stare activă până când este numită.
Ce metodă ar trebui să alegi?
- Serviciile individuale de sistem
- Docker Compose with systemd
Depanarea problemelor comune
Chiar şi cu o configurare atentă, puteţi întâmpina probleme. Mai jos sunt capcane frecvente şi soluţiile lor.
Service Fails cu
Aceasta înseamnă că serviciul începe înainte ca doporul să fie gata. Asigurați-vă că unitatea dumneavoastră conține și . Verificați și dacă demonul Docker este activat: .
Container Reporneşte într-o buclă
Dacă containerul iese imediat, sistemul va continua să îl repornească conform și . Verificați jurnalele containerelor cu . Cresteti (de exemplu, 30 de secunde) și setați pentru a preveni o buclă aglomerată.
Serviciul nu se opreşte din curăţat
Un configurat incorect poate lăsa recipientul în funcțiune. Verificați dacă ] utilizează numele corect al containerului. Utilizați ] pentru a elimina cu forța recipientul dacă oprirea nu reușește.
Variabilele mediului nu sunt încărcate
Dacă utilizați , confirmați că fișierul există și este lizibil prin rădăcină. Evitați citarea problemelor
Considerații privind securitatea
Rularea containerelor Docker prin sistem ridică câteva puncte de securitate:
- Rulați întotdeauna serviciul de sistem ca utilizator non-root dacă este posibil (utilizați ] și directive, dar asigurați-vă că utilizatorul are acces la priză Docker sau să ruleze în mod fără rădăcini).
- Evitaţi utilizarea în unităţi de sistem, cu excepţia cazului în care este absolut necesar.
- Utilizaţi montanţi de legare numai pentru citire () ori de câte ori containerul nu trebuie să scrie gazdei.
- și pentru a întări unitatea împotriva evadărilor.
[Service]
ProtectSystem=strict
ReadWritePaths=/var/log/myapp
PrivateTmp=true
User=myappuser
Resurse externe
Pentru o lectură ulterioară, consultați aceste referințe oficiale:
Concluzie
Integrarea sistemului cu containere Docker vă oferă un mecanism robust, automatizat de pornire care se integrează perfect cu restul sistemului Linux. Prin scrierea fișierelor bine structurate ale unităților de service, puteți controla comanda de pornire, gestiona dependențele, stabili limitele resurselor și monitoriza jurnalele folosind instrumente pe care echipa de operațiuni le cunoaște deja. Fie că alegeți servicii individuale pentru fiecare container sau o singură unitate pentru a orchestra un stiva Compozite, sistemat oferă fiabilitatea și previzibilitatea pe care mediul de producție le solicită.
Începeți cu un fișier simplu unitate, testați-l bine, apoi strat pe opțiuni avansate, cum ar fi fișierele de mediu, controale de sănătate, și întărire de securitate. Cu această abordare, containere Docker va supraviețui reboots, accidente, și modificări de configurare fără intervenție manuală, eliberând echipa ta pentru a se concentra pe aplicații de construcție.