Miksi yhdistää järjestelmä tuotannon Docker käyttöönotto

Nykyaikainen infrastruktuuri vaatii, että konttipalvelut selviävät odottamattomista uudelleenkäynnistyksistä, laitteiston vioista tai pakettipäivityksistä. Vaikka Docker tarjoaa uudelleenkäynnistyskäytäntöjä ([]), nämä käytännöt toimivat vain niin kauan kuin Docker-tanko on käynnissä. Systemd ... ............................................................................................................................................................................................

  • Taattu startup-tilaus riippuvuusdirektiivien avulla (esim. verkon jälkeen.tavoite, jälkeen docker.service)
  • Yhdistetty kirjautuminen kautta, jolloin vianetsintä on yksinkertaista
  • Hienosäätöinen resurssirajojen (CPU, muisti, I/O) valvonta järjestelmällisten yksikködirektiivien avulla
  • Automaattinen uudelleenkäynnistys vikaan, jossa on säädettävä viive ja murtorajat
  • Tuki pistorasian aktivoinnille ja ajastettu käynnistys

Käärimällä jokainen Docker-kontti järjestelmälliseen palvelutiedostoon, operaatioryhmät saavat johdonmukaisen käyttöliittymän säiliöiden käynnistämiseen, pysähtymiseen ja seurantaan, mikä vähentää riippuvuutta ad-hoc-skriptejä ja manuaalista väliintuloa.

Järjestelmällisen palvelun luominen yhden Docker-kontin kontille

Vakiona on kirjoittaa palveluyksikkötiedosto, joka kutsuu Dockerin komentoja ajamaan ja pysäyttämään säiliön. Alla kävelemme prosessin läpi askel askeleelta, alkaen perusesimerkistä ja sitten kattaa yhteiset tuotantovaatimukset.

Vaihe 1: Kirjoita palveluyksikkötiedosto

Luo tiedosto nimeltä . Käytä seuraavaa mallia lähtökohtana:

[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

Keskeisten direktiivien selitys:

  • [] [] .
  • [] Jos Docker pysäytetään, tämäkin palvelu loppuu.
  • [[] .
  • [] käyttää automaattisesti säiliön poistamiseen, kun se pysähtyy.
  • [[LLT:0]][[[LLT:10]][[[LLT:1]]] .
  • [[ ] .
  • [] .
  • [[] .

Vaihe 2: Ota palvelu käyttöön ja käynnistä

sudo systemctl daemon-reload
sudo systemctl enable myapp.service
sudo systemctl start myapp.service

kertoo järjestelmällisesti luettavien palvelutiedostojen uudelleen. luo symlinkin, jotta palvelu alkaa käynnistyä.

Palvelun hallinta standardijärjestelmän komennoilla

Kun palvelu on käynnissä, voit hallita sitä aivan kuten mikä tahansa muu järjestelmäpalvelu:

  • [[LLT:0]]Aloitus: [[[LLT:1]] [[LLT:17]]]
  • [[LLT:0]]Lopeta: [[LLT:1]] [[LLT:18]]]
  • [[LLT:0]]Aloitetaan: [[[LLT:1]] [[LLT:19]]]
  • Aika: ]
  • Kirjoitukset: [ (seuraa livelokkeja)

Kehittyneet asetukset

Tuotannon käyttöönotto vaatii usein enemmän kuin yksinkertaisen . Alla on yhteisiä parannuksia, joita voit lisätä järjestelmällisiin palvelutiedostoihisi.

Ympäristömuuttujat

Kovakoodaussalaisuuksia tai konfiguraatiota ei suositella palvelutiedostossa. Sen sijaan käytä erillistä ympäristötiedostoa:

[Service]
EnvironmentFile=-/etc/myapp/env.conf
ExecStart=/usr/bin/docker run --rm --name myapp \
 --env-file /etc/myapp/env.conf \
 myregistry/myapp:latest

etuliite ennen polkua tarkoittaa, että palvelu alkaa, vaikka tiedostoa ei olisikaan (hyödyllinen alkuasennuksen aikana).

Verkko- ja satamasidokset

Jos konteissa, joiden on kommunikoitava keskenään samassa isäntäpaikassa, on harkittava tai käyttäjän määrittelemien siltaverkkojen käyttöä. Esimerkki:

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

Jos käytät omaa verkkoa, varmista, että verkko on olemassa ennen palvelun alkua. Voit lisätä -komennon luodaksesi sen:

ExecStartPre=/usr/bin/docker network create my-net

Sisällysluetteloiden väliset riippuvuudet

Kun yksi kontti vaatii toisen olla valmis ennen aloittamista (esim. web-sovellus odottaa tietokantaa), järjestelmä voi valvoa tilauksen. Luo toinen palvelutiedosto tietokantaan ja sitten:

[Unit]
Description=Web App Container
After=network-online.target docker.service mydb.service
BindsTo=mydb.service

yhdistää web-sovelluksen elinkaaren tietokantasäiliöön .

Terveystarkastukset ja valmius

Docker terveystarkastukset voidaan integroida järjestelmällisesti estää ennenaikaista palvelun saatavuutta. Käytä kanssa skripti, joka kyselyt terveysmuuttuja:

ExecStartPost=/usr/local/bin/wait-for-health.sh http://localhost:8080/health 30

Skripti tulee poistaa 0 vain silloin, kun säiliö on terve. Jos se epäonnistuu, järjestelmä merkitsee yksikön epäonnistuneeksi.

Resurssirajat järjestelmän kautta

Voit rajoittaa konttia. CPU ja muistia cgroup tasolla ilman Docker. Tämä on erityisen hyödyllistä, kun ajaa useita kontteja yhdellä isännällä:

[Service]
MemoryMax=512M
CPUQuota=50%

Nämä asetukset luovat kovan rajan, joka järjestelmä valvoo riippumatta Docker.

Hallinta useita kontteja: Systemd vs. Docker säveltää

Pienelle määrälle kontteja (esim. 2-5), yksittäiset järjestelmälliset palvelutiedostot ovat yksinkertaisia ja ylläpidettävissä. Kuitenkin, kun projektiin liittyy monia toisiinsa liittyviä palveluita, Docker Compose tulee kätevämmäksi. Voit silti käyttää järjestelmää koko Docker Compose pinon järjestämiseksi luomalla yhden palveluyksikön, joka kutsuu . Esimerkki:

[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

Tämä lähestymistapa antaa sinulle yksinkertaisuuden Compose määritellä palvelut yhdistettynä systemd.s elinkaaren hallinta. Huomaa, että [ on käytetty, koska poistuu välittömästi. ] pitää yksikön . . tilassa kunnes .

Minkä menetelmän valitset?

  • Yksittäiset järjestelmät [ . Parhaat perinteiset sovellukset, palvelut, joissa on tiukka käynnistystilaus, tai kun tarvitset konttikohtaisia resurssirajoja.
  • Docker Compose with systemd[ ... ihanteellinen mikropalvelupinoille, joissa riippuvuudet käsitellään sisäisesti Compose, ja haluat yhden yksikön hallita koko ryhmän.

Yhteisten kysymysten vianmääritys

Vaikka huolellisesti kokoonpano, voit kohdata ongelmia. Alla ovat usein sudenkuoppia ja niiden ratkaisuja.

Palvelu ei toimi ...ei voi yhdistää Docker- daemoniin...

Tämä tarkoittaa yleensä sitä, että palvelu alkaa ennen kuin Docker-pistoke on valmis. Varmista, että yksikkösi sisältää ja . Tarkista myös, että Docker-tanko on käytössä: .

Kontti käynnistyy uudelleen loopissa

Jos säiliö poistuu välittömästi, järjestelmä käynnistää sen uudelleen ja mukaisesti. Tarkista säiliölokit . Lisätä (esim. 30 sekuntia) ja asettaa , jotta voidaan estää kiireinen silmukka.

Palvelu ei pysähdy siististi

Jos säiliö on varustettu väärin , säiliö voidaan jättää pois käytöstä. Varmista, että käyttää oikeanlaista säiliön nimeä. Käytä säiliötä voimakkaasti, jos pysäytys epäonnistuu.

Ympäristömuuttujat ei ladattu

Jos käytät , vahvista tiedosto olemassa ja on luettavissa root. Vältä siteeraus kysymyksiä . systemd nauhat lainauksia vaihtelevista arvoista. Salaisen injektion, harkitse käyttää järjestelmätunnuksia tai omistettu salainen manageri.

Turvallisuusnäkökohdat

Docker-konttien ajaminen järjestelmän läpi nostaa esiin muutamia turvapisteitä:

  • Aja järjestelmällinen palvelu aina muuna kuin juurikäyttäjänä, jos mahdollista (käytä ja -ohjeita, mutta varmista, että käyttäjällä on pääsy Docker-pistokkeeseen tai se toimii roottisessa tilassa).
  • Vältä :n käyttöä järjestelmäyksiköissä, ellei se ole ehdottoman välttämätöntä.
  • Käytä vain lukuliitoksia ([) aina, kun säiliön ei tarvitse kirjoittaa isäntään.
  • Vipuvaikutusjärjestelmä ja kovettaa yksikköä pakoilta.
[Service]
ProtectSystem=strict
ReadWritePaths=/var/log/myapp
PrivateTmp=true
User=myappuser

Ulkoiset resurssit

Lisätietoja saa seuraavista virallisista viitteet:

Päätelmät

Integrointi järjestelmällinen Docker-kontteja antaa sinulle vankan, automatisoidun käynnistysmekanismin, joka integroituu saumattomasti muun Linux-järjestelmän kanssa. Kirjoittamalla hyvin jäsenneltyjä palveluyksikkötiedostoja voit hallita käynnistystilausta, hallita riippuvuuksia, asettaa resurssirajoja ja seurata lokkeja käyttäen työkaluja, jotka tiimisi jo tietää. Valitsetko jokaiselle kontille tai yhdelle yksikölle yksittäisiä palveluja koostepinon järjestämiseksi, järjestelmä tarjoaa luotettavuutta ja ennustettavuutta, joita tuotantoympäristöt vaativat.

Aloita yksinkertaisella yksikkötiedostolla, testaa se perusteellisesti, sitten kerrosta edistyneistä vaihtoehdoista, kuten ympäristötiedostoista, terveystarkastuksista ja turvallisuuden karkaisusta. Tällä lähestymistavalla Docker-säiliösi selviävät uudelleenkäynnistyksestä, kaatumisista ja kokoonpanon muutoksista ilman manuaalista väliintuloa, jolloin tiimisi voi keskittyä rakennussovelluksiin.