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.