Dockeri kujutise loomine. Dockeri mõistmine. Dockeri põhikomponendid

Docker on kõige levinum konteinersüsteem, mis võimaldab käivitada arendamiseks vajalikku tarkvara konteinerites ilma seda kohalikku süsteemi installimata. Selle materjali raames analüüsime dokkerite konteinerite haldust.

Docker koosneb mitmest komponendist:
  1. Pilt- arendajate konfigureeritud tarkvara komplekt, mis laaditakse alla ametlikult veebisaidilt
  2. Konteiner- pildi juurutamine - sellest loodud olem serveris, konteiner ei tohiks olla täpne koopia ja seda saab kohandada Dockerfile'i abil
  3. Helitugevus- ketta ala, mida konteiner kasutab ja kuhu andmed salvestatakse. Pärast konteineri kustutamist tarkvara alles ei jää, andmeid saab edaspidi kasutada

Kogu struktuuri peale on spetsiaalselt üles ehitatud võrk, mis võimaldab porte soovitud viisil edasi suunata ja teha konteineri väljast ligipääsetavaks (vaikimisi töötab see kohalikul IP-aadressil) virtuaalsilla kaudu. Sel juhul saab konteiner olla kättesaadav nii maailmale kui ka ühele aadressile.

Dockeri konteinerite haldus: põhivõimalused

Installige Docker Ubuntu või Debiani serverisse, kui see pole juhiste kohaselt juba installitud. Parem on käivitada käske privilegeerimata kasutajana sudo kaudu

Lihtsaima konteineri käivitamine näitab, et kõik töötab

Põhikäsud konteinerite haldamiseks

Saate kuvada kõik aktiivsed konteinerid nii

Lüliti -a abil kuvatakse kõik konteinerid, sealhulgas mitteaktiivsed

Dicker määrab konteineritele nimed juhuslikult, vajadusel saab nime otse määrata

docker run — nimi tere-maailm

Käivitage ubuntu pildi põhjal konteiner nimega my-linux-container ja minge konteinerikonsooli, määrates bash-shelli

docker run -it -nime minu-linux-konteiner ubuntu bash

Konteinerist väljumiseks ja hosti naasmiseks peab süsteem töötama

Kõik pildid, mille alusel konteinerid luuakse, laaditakse saidilt hub.docker.com automaatselt alla konteineri esmakordsel loomisel, kohapeal juba olemasolevaid saab näha, käivitades dockeri kujutised.

Juba allalaaditud pildi põhjal konteineri loomine on palju kiirem (peaaegu kohe)

Kui väljute konteinerist väljumisega, see peatub, nii et seda ei juhtuks, saate väljuda kiirklahviga CTRL + A + P

Saate eemaldada kõik mitteaktiivsed konteinerid

docker rm $ (docker ps -a -f olek = väljus -q)

Või kustutage need ükshaaval

Viimase käsu identifikaatori asemel saate määrata nime

Dockeris hallatakse konteinereid väikese arvu intuitiivsete käskude abil:

dokki konteineri käivitus ID

dokkimiskonteineri peatuse ID

dokkeri konteineri taaskäivitamise ID

dokkimiskonteineri kontrollimise ID

Viimane on eriti kasulik, see kuvab kogu teabe konteineri, konfiguratsioonifailide ja kasutatud ketta partitsioonide kohta. Kogu käskude loendi leiate hõlpsalt abist või ametlikult Dockeri veebisaidilt.

Dockeri pildi loomine ja Dockerfile'i kasutamine

Kujutised luuakse tavaliselt olemasolevatest, kasutades Dockerfile'is määratud lisavalikuid

ubuntust
CMD kajab "tere maailm"

Nüüd luuakse uus pilt, mis põhineb standardil c ubuntu

Ehitage pilt, andes sellele nime (käsu lõpus olev punkt tähendab, et kasutatakse praegust kataloogi ja seega ka selles olevat Dockeri faili)

docker build -t my-ubuntu.

dokkeri pildid kuvatakse nüüd ja äsja loodud my-ubuntu pilt

Seda saab käivitada ja konsool kuvatakse Tere, Maailm ja see on ainus erinevus vaikepildist

Tavaliselt vajame keerukamaid reegleid, näiteks peame pildile lisama python3 - läheme uude kataloogi ja loome Dockeri faili

ubuntust
CMD apt-get update && apt-get install python3

Kõik juhised on kirjutatud ühele reale

docker build -t my-ubuntu-with-python3.

Alustame konteineri sisse minnes

docker run -it my-ubuntu-with-python3 bash

Sees, kui root, peate käivitama dpkg -l | grep python3, näitab käsk, et pakett on süsteemis olemas, mis tähendab edu

Asjaolu, et Docker on iga suure projekti arendaja ja administraatori jaoks tõesti kohustuslik tööriist. Kuid isegi kui see nii ei ole, peab Docker siiski teadma: lähitulevikus on see kõikjal, alates lauaarvuti Linuxi distributsioonist kuni AWS-i serverite kogumini. Ja parim osa on see, et Dockeriga tegelemine on üsna lihtne, kui muidugi mõistate, kuidas see õigesti töötab.

Apt-get virtuaalkeskkondade maailmas

Docker põhineb nimeruumidel ja cgroups-tehnoloogiatel (esimene pakub isolatsiooni, teine ​​pakub protsesside rühmitamist ja ressursside piiramist), seetõttu ei erine see virtualiseerimise osas palju meile harjumuspärasest LXC / OpenVZ-st ja seda pole ka. palju siin rääkida. Sama loomulik kiirus, samad isoleerimismeetodid, mis põhinevad Linuxi tuumamehhanismidel. Eespool aga algab hoopis teine ​​lugu. Dockeri tipphetk on see, et see võimaldab juurutada täisväärtuslikku virtuaalset keskkonda ja käivitada selles rakenduse sama lihtsalt kui näiteks veebiserveri taaskäivitamine.

Abstraheerime konkreetsete distributsioonide üksikasjadest ja kujutame ette, et meil on puhas CentOS ja me tahame selles konkreetset käsku käivitada täiesti virtuaalses keskkonnas ilma juurdepääsuta põhisüsteemile. Kas peate alla laadima distributsioonide pildid, juurutama need süsteemi ja seadistama virtuaalse keskkonna? Üldse mitte, kõik, mida pead tegema, on käivitada kaks käsku:

$ sudo yum installi docker-io $ sudo docker käivita -t ubuntu: uusim / usr / bin / top

Ja ongi kõik. Käitasime just parima utiliidi konteineris, mille keskkond põhineb hetkel saadaoleval uusimal Ubuntu versioonil, väljastades teavet praegusesse terminali. Ja seda kõike ühe lihtsa käsuga (installimine ei lähe arvesse). Pole paha, kas pole? Üldiselt saame isegi sellesse konteinerisse "sisse minna" ja teha kõike, mida tavaliselt tehakse värskelt paigaldatud süsteemiga:

$ sudo docker run -t -i ubuntu: uusim / bin / bash # apt-get update # apt-get install nginx #

Nagu näete, on ka võrguga kõik korras, nii et saame süsteemi värskendada, installida ja konfigureerida mis tahes tarkvara. See näeb välja nagu maagia, kuid tegelikult on see väga lihtne. Docker on konteinerite maailmas omamoodi apt-get, ainult pakettide asemel on failisüsteemi pildid ja ametlike Debiani / Ubuntu hoidlate asemel pilvehoidla nimega Docker Hub.

Kui tegime "doki käivitamise ...", tegi süsteem järgmist:

  1. Dockeri utiliit võttis ühendust meie kohaliku masina dockerdi deemoniga, tervitas meid ja palus käitada Ubuntu uusimat versiooni (nagu näitab käsu viimane silt) isoleeritud konteineris.
  2. Dockerdi deemon kontrollis oma sülearvutit, läks kataloogi / var / lib / docker ja avastas, et uusima Ubuntu failisüsteemi kujutist pole meie masinas, mistõttu otsustas ta võtta ühendust Dockeri keskusega, et teada saada, kas see on olemas. kas selline pilt on seal.
  3. Pärast Docker Hubiga rääkimist veendus ta, et pilt on ikka olemas, ja palus selle meile saata.
  4. Pärast vajaliku pildi kättesaamist ühendas dockerd oma failisüsteemi, tegi sellesse chrooti ja käivitas viimases argumendis määratud käsu, piirates selle "ulatust" nimeruumide abil (tegelikult katkestas juurdepääsu põhifailisüsteemile, hostile süsteemiprotsessid, IPC ja muud , lukustatud liivakasti), kuid viskasid sellesse praeguse terminali seadmefailid (lipp -t), et meie tipp saaks selle pseudograafilise liidese joonistada.

Selle mudeli tipphetk on see, et Docker Hub on avatud kõigile ja igaüks saab valmistada oma pildi (sellest lähemalt hiljem) ja avaldada selle installimiseks teise masinasse ja/või teise isiku poolt. Selle kirjutamise ajal on Docker Hubis kõigiks puhkudeks avaldatud üle 45 tuhande pildi, alustades "alasti" distributsioonide piltidest kuni piltideni, millel on eelkonfigureeritud serveri- ja töölauarakendused, mis töötavad minimalistlikus Linuxi keskkonnas.

Mis siis, kui tahame Firefoxi virtuaalses keskkonnas käivitada? See ei saa olla lihtsam, avage brauseris Docker Hub, klõpsake nuppu Sirvi ja otsi ning tippige firefox. Ekraanile ilmub tulemuste loend. Vaatame, kennethkl / firefox tundub üsna sobiv olevat. Klõpsame sellel ja näeme teavet selle kohta, kuidas kogu asja alustada. Autor käsib meil käivitada selline käsk:

$ sudo docker run -d --name firefox -e DISPLAY = $ EKRAAN \ -v /tmp/.X11-unix:/tmp/.X11-unix kennethkl / firefox

Proovime. Jah, tõepoolest, pärast pildi lühikest allalaadimist saame ekraanile tavalise Firefoxi. Muide, sama näite abil saate tutvuda veel nelja kasuliku Docker Run käsu valikuga:

  • -d - "deemoniseerib" konteineri, see tähendab, et see lihtsalt katkestab Dockeri STDOUT-i virtuaalkeskkonnast ja võimaldab sellel taustal töötada;
  • --name - konteineri nimi, mille ta saab identifikaatori asemel;
  • -e - võimaldab "edasi saata" virtuaalmasinasse keskkonnamuutujat;
  • -v - edastab määratud faili või kataloogi (vorming / fail / on / host / system: / fail / in / virtuaalmasin või lihtsalt / fail / on / host / system, kui teed ühtivad).

Sel juhul on muutujat ja faili vaja selleks, et Firefox pääseks ligi kohaliku masina kuvale. See on üsna ebaturvaline, kuna kõik konteineris olevad protsessid ei suuda mitte ainult teie töölaual tarkvara käivitada, vaid ka näiteks klahvivajutuste või kursori liigutuste pealtkuulamist. Aga näiteks läheb korda.

Dockeri piltide leidmiseks on lihtsam viis Dockeri otsingukäsu abil:

$ sudo dockeri otsing nginx

INFO

Iga Dockeri kasutaja saab käitada oma privaatset jaoturit. Seda nimetatakse "registriks" ja see on saadaval valmiskujutisena. Kõik, mida pead tegema, on see lihtsalt käivitada: docker run -p 5555: 5555 register.

Dockeri deemon on saadaval mitte ainult klienti kasutades, vaid ka RESTful API-t kasutades nii kohapeal kui ka kaugmasinast. Standardsed Dockeri pordid on tcp / 2375 e tcp / 2376.

Dockeri pilti ei pea pärast allalaadimist kohe käivitama, esmalt saate selle docker pull käsu abil oma kohalikku masinasse alla laadida ja alles seejärel käivitada: docker pull ubuntu.

Kihiline kook

Docker võimaldab teil muuta virtuaalsete keskkondadega töötamise võimalikult mugavaks, lihtsustades nii keskkondade juurutamise protsessi kui ka nende suhtluse seadistamist hostsüsteemiga (mis on vaid viimane näide). Kuid see pole selle ainus esiletõst.

Kui olete juba kahe esimese näite Ubuntu pildiga mänginud, märkasite ilmselt, et iga uus konteineri käivitamine toimub nullist ja kõik eelmisel seansil tehtud muudatused lähevad kaotsi. See pole üldse viga, see on üks Dockeri arhitektuuri põhiomadusi, mis muudab selle veelgi huvitavamaks ja atraktiivsemaks.

Fakt on see, et valdaval enamusel juhtudel pole "Dokeri pilt" üldsegi monoliitne failisüsteemi pilt, vaid omamoodi kihiline kook, mis koosneb mitmest failisüsteemi kujutisest, mille alusel konteiner moodustatakse. Samal ajal ei vastuta üksikud FS-pildid üldse kataloogistruktuuri teatud osade eest (nagu näiteks ketta jagamisel Linuxis partitsioonideks / home, / var, / boot), vaid need on kihilised. üksteise peal, kasutades Linuxi AUFS-i tuumamehhanismi (sama funktsionaalsuse tugi on ka btrf-i, seadmekaardi ja ülekatte kasutamise kaudu).

Et mõista, kuidas see toimib, pöördume tagasi meie konteineriseeritud Ubuntu juurde. Käivitame konteineri ja installime nginxi, nagu on näidatud artikli alguses teises näites, kuid ärge lõpetage seda. Selle asemel käivitame teise terminali ja näeme töötavate konteinerite loendit:

$ sudo docker ps

See käsk näitab kõiki töötavaid konteinereid koos nende ID, kasutatud pildi, käivitatud käsu, tööaja ja muuga. Oleme huvitatud väärtusest veerus KONTEINERI ID. Kopeerige see ja käivitage järgmine käsk:

$ sudo docker kinnitab konteineri ID ubuntu-nginx

Pärast selle lõpetamist saate konteinerist väljuda, lõpetades sellega selle töö. Ja siis käivitame lihtsalt ubuntu-nginxi konteineri ja näeme, et nginx pole kuhugi kadunud ja on omal kohal:

$ sudo docker run -i -t ubuntu-nginx / bin / bash # mis nginx / usr / sbin / nginx

Mida me oleme teinud? Lõime veel ühe kihi, st täiendava FS-pildi ja genereerisime uue Dockeri pildi, mis põhineb juba olemasoleval Ubuntu Dockeri pildil, sealhulgas meie FS-pildil, mis sisaldab nginxi. Kõlab veidi segane, eks? See on tegelikult üsna lihtne.

Oleme juba avastanud, et iga Dockeri pilt koosneb mitmest failisüsteemi kujutisest. Kui käivitame konteineri, monteeritakse need pildid AUFS-i abil ühte kataloogistruktuuri. Näiteks võib esimene pilt sisaldada ainult Ubuntu põhiinstallatsiooni, teine ​​lisab sellele standardsete deemonite komplekti, kolmas - haldusutiliidid jne. Docker ühendab kõik kihid kirjutuskaitstud režiimis, kuid selleks, et saaksime pildi sisu muuta, ühendatakse lugemis-/kirjutusrežiimis peale veel üks esialgu tühi kiht.


Vaikimisi kustutatakse pärast konteineri lõpetamist (mis toimub pärast viimast selles töötavat protsessi) viimane kiht ja kõik meie muudatused lähevad kaotsi. Dockeri commit-käsku kasutades saame aga muudatused "kehtida", luues olemasolevate FS-piltide ja meie muudatustega FS-pildi põhjal uue Dockeri pildi. See salvestab tehtud muudatused. Valikuliselt saame käivitada ubuntu-nginxi konteineri, teha selles muudatusi ja samamoodi salvestada uuele Dockeri pildile, kasutades commit, lisades veel ühe kihi. Saate kasutada käsku Docker images, et näha kõigi saadud kujutiste loendit (ja Docker Hubist) ja käsku Docker History, et vaadata kihtide moodustamise ajalugu:

$ sudo dockeri ajalugu ubuntu-nginx

Selline lähenemine pildistamisele pakub konteinerite haldamisel suuremat paindlikkust, säästab palju aega ja võimaldab hõlpsasti juba konfigureeritud Dockeri kujutisi masinate vahel üle kanda (pildi saab Docker Hubi üles laadida ja seejärel teise masinasse juurutada). Vähem ilmne pluss on kettaruumi kokkuhoid. Kui me võtame masinasse kasutusele terve loomaaia konteinereid, millest igaüks põhineb algselt ühel baaspildil (näiteks sama Ubuntu) – viitavad nad kõik sellele põhipildile ja ei dubleeri selle sisu.


Docker väljaspool Linuxi

Ainus viis Dockeri käivitamiseks OS X-is või Windowsis on selle installimine virtuaalsesse masinasse. Sa ei pea seda käsitsi tegema, võid kasutada valmislahendust, näiteks boot2docker. See on skriptide komplekt, mis võimaldab teil VirtualBoxi sees kiiresti juurutada Linuxi ja Dockeri virtuaalmasina ning käivitada selle automaatse SSH-juurdepääsuga. Selle ja installija enda kasutusjuhised leiate ametlikult Dockeri veebisaidilt.

Võrgu konfiguratsioon

Selleks, et konteinerid saaksid omavahel ja välismaailmaga suhelda, tõstab Docker automaatselt virtuaalse võrgusilla ja konfigureerib välise võrguliidese maskeerimisreeglid (NAT). See tähendab, et väljastpoolt ei pääse konteinerite juurde. Siiski saame pordi suunamise konfigureerida nii, et masina välise võrguliidese konkreetsete portide päring suunatakse automaatselt ümber määratud konteineriportidesse. Näiteks Mirantises töötab peamine kütusesõlm (see on OpenStacki juurutamiseks ja konfigureerimiseks mõeldud GUI) Dockeris ja kasutab pordiedastust, et avada juurdepääs täielikule / nginxi konteinerile (port 8000):

$ sudo docker run -d -p 8000: 8000 kütus / nginx_6.0: uusim /usr/local/bin/start.sh

Võiksime pordi 8000 edastada mis tahes muusse konteineri porti, muutes lihtsalt suvandi -p teist numbrit, kuid sellel pole selles konfiguratsioonis mõtet.

Failide edastamine ja Dockerfile

Artikli alguses tutvusime juba lipuga -v, mis võimaldab mis tahes faili või kataloogi hostsüsteemist konteinerisse edastada. See on väga mugav funktsioon, seda saab kasutada nii ajutiste andmete salvestamiseks kui ka failide jagamiseks mitme konteineri vahel. Mirantises kasutatakse seda funktsiooni konfiguratsioonifailide edastamiseks konteineris oleva teenuse Fuel / intelligente (/ etc / astute) jaoks:

$ sudo docker run -d -v / etc / intelligent fuel / astute_6.0: uusim /usr/local/bin/start.sh

Sama saab teha Dockerfile'i käsu VOLUME abil. Dockerfile ise on Makefile'i kohalik vaste, kuid kui viimane on mõeldud rakenduste loomiseks allikast, siis võimaldab Dockerfile luua Dockeri jaoks pilte. Selle eesmärk on lihtsustada uute piltide loomist, ilma et oleks vaja konteinerit käivitada, selles mingeid toiminguid teha ja sisse viia. Saate lihtsalt kirjutada Dockerfile'i ja Docker teeb kõik teie eest ära. Näiteks kaaluge Dockeri faili kütuse ehitamiseks / nutikas:

KÜTUSEST / senti HOOLDUS Matthew Mosesohn [e-postiga kaitstud] KÄITA rm -rf /etc/yum.repos.d / *; \ echo -e "\ nname = Nailgun Local Repo \ nbaseurl = http: // $ (marsruut -n | awk" /^0.0.0.0/ (prindi $ 2 ) "): _ PORT_ / os / x86_64 / \ ngpgcheck = 0"> /etc/yum.repos.d/nailgun.repo; \ yum clean all; \ yum --quiet install -y ruby21-nailgun-mcagents sysstat ADD etc / etc ADD start.sh /usr/local/bin/start.sh RUN puppet apply --detailed-exitcodes -d -v /etc/puppet/modules/nailgun/examples/astute-only.pp; [[$? == 0 || $? == 2]] KÄITA chmod + x /usr/local/bin/start.sh; \ echo -e "\ nname = Nailgun Local Repo \ nbaseurl = fail: / var / www / nailgun / centos / x86_64 \ ngpgcheck = 0 "> /etc/yum.repos.d/nailgun.repo; yum puhasta kõik VOLUME / etc / astute CMD /usr/local/bin/start.sh

Pole raske aru saada, milleks see mõeldud on. See loob pildi kütuse / centos põhjal, käivitab pildi ettevalmistamiseks mitu käsku, lisab pildile failid praegusest kataloogist, rakendab Puppeti manifesti, muudab mõne faili õigusi, saadab hostist edasi kataloogi / etc / asture / süsteem konteinerisse ja käivitab konteineri käsuga /usr/local/bin/start.sh.

Konteineri ehitamiseks pange lihtsalt Dockerfile ja kõik sellele lisatavad failid kataloogi ja käivitage järgmine käsk:

$ sudo docker build fuel / astute_6.0: uusim

Sel juhul valisime nimetuse kütus / astute_6.0: latest, kuigi see võib olla ükskõik milline.

Dockeriga töötamise nüansid

Docker on üles ehitatud ideele, et igas konteineris peaks töötama ainult üks teenus. Pakete Apache'i, MySQL-i, nginxi, Varnishi ja kõik muu, mida teie projekt vajab, erinevatesse konteineritesse ning seejärel kasutate Dockerit selle koostamiseks. See lähenemine pakub suurt paindlikkust, kuna võimaldab hõlpsasti konfiguratsiooni muuta, värskendusi testida ja üksikuid teenuseid teistele masinatele migreerida.

Samal põhjusel ei ole kombeks kasutada Dockerit täisväärtuslike Linuxi keskkondade käitamiseks koos init-deemoni, cron- ja syslog-deemonitega ning muude standardsete distributsioonikomponentidega. Selle asemel käivitame lihtsalt vajaliku teenuse ja see töötab virtuaalses keskkonnas üksi:

$ sudo docker run -d -p 80 ubuntu-nginx / usr / sbin / nginx

Kuid siin on väike probleem. Docker sulgeb konteineri kohe pärast selles töötava protsessi (antud juhul nginx) lõpetamist ja kuna nginx on vaikimisi deemoniseeritud, st loob uue protsessi ja lõpetab käsitsi käivitatud protsessi, siis Docker kohe väljub ja konteiner, naelutades kahvliga Dockeri.

Nginxi puhul saate sellest probleemist mööda minna, lisades deemoni välja; selle konfiguratsiooni esimene rida. Teised deemonid nõuavad oma seadistusi ja mõnel saab takistada deemoniseerimist otse käsurealt. Näiteks pakub sshd selleks lipu -D:

$ sudo docker run -d -p 22 ubuntu-ssh / usr / sbin / sshd -D

Konteineriga saab igal ajal ühenduse luua käsuga docker exec, et vaadata logisid või muuta sätteid (edaspidi on konteineri ID-ks kas dockeri ps-i väljundis nähtav ID või aadressil määratud nimi käivitamine suvandis --name):

$ sudo docker exec -ti konteineri ID / bin / bash

Kuid siin on ka üks väike tõrksus. Teatavasti läheb virtuaalkeskkonna töö lõpetamisel kaotsi kogu virtuaalkeskkonna töötamise käigus kogunenud info ning koos sellega kaovad ka logid ja seadistustesse tehtud muudatused. Samuti ei saa me lõputult kihte luua (kui ainult sellepärast, et neid ei saa olla rohkem kui 127), vaid saame minna veidi teist teed ja kasutada Dockerisse sisseehitatud logide koondamise süsteemi. Muidugi ei saa Docker koguda üksikute rakenduste logisid, kuid suudab koguda STDOUT-väljundit, st mis tahes konsooli väljundit. Meil jääb üle vaid muuta nginxi konfiguratsiooni nii, et logid valataks kausta / dev / stdout, ja seejärel vaadata neid käsuga docker logs:

$ sudo docker logib konteineri ID

Teine ja õigem variant on lihtsalt teisaldada logid (ja vajadusel ka sätted) hostsüsteemi, kasutades juba kirjeldatud suvandit -v:

$ sudo mkdir / root / logid $ sudo docker run -d -v / root / logs: / var / logs -p 80 ubuntu-nginx / usr / sbin / nginx

Vajadusel saab konteineri õigesti peatada, lõpetades selles töötava teenuse dockeri stoppkäsuga:

$ sudo docker stop konteineri ID

Ja kui see mingil põhjusel korralikult ei tööta, saate selle tappa tappa:

$ sudo docker kill konteineri ID

Seda tehes juhtub üks oluline asi, mille paljud algajad unustavad: Docker säilitab konteineri metateabe. Tegelikult tähendab see seda, et kui käivitate näiteks nginxi, täpsustades selle nime, kasutades docker run käsu argumente, katalooge, mis tuleb konteinerisse edastada, pordid, keskkonnamuutujad jms, siis kogu see teave salvestatakse konteineri lõppedes ja järgmiseks käivitamiseks ei pea te seda määrama, vaid lihtsalt täitke järgmine käsk (ID asemel võite kasutada nime):

$ sudo dockeri käivitamise konteineri ID

Kui te ei pea olekut salvestama (näiteks mõne funktsiooni testimiseks või kontrollimiseks), võite kasutada lippu --rm, mis sunnib Dockerit konteineri pärast selle lõpetamist täielikult hävitama (pildi salvestamine):

$ sudo docker run --rm -i -t busybox / bin / bash

Saate hävitada kõik varem salvestatud konteinerid, kasutades järgmist käsku:

# docker rm $ (docker ps -a -q)

Docker suudab konteinereid iseseisvalt taaskäivitada, kui need kokku jooksevad, ja isegi käivitada need süsteemi käivitamise ajal. Kõik, mida pead tegema, on lihtsalt kasutada --restart valikut:

$ sudo docker käivitada --restart = alati \ -d -v / juur / logid: / var / logid -p 80 \ ubuntu-nginx / usr / sbin / nginx

Pildi saab igal ajal eksportida ühte faili ja seejärel importida teise masinasse. Selleks on ette nähtud käsud dockeri salvestamine ja dokkide taastamine. Neid on väga lihtne kasutada, eksport toimub järgmiselt:

$ sudo docker salvesta -o ubuntu-nginx.img ubuntu-nginx

Ja import on selline:

$ sudo docker load -i ubuntu-nginx.img

järeldused

Docker on suurepärane tööriist. Asjatundmatule inimesele võib see tunduda mänguasjana, mis ei sobi enam millekski muuks kui liivakastis tarkvara jooksmiseks, kuid see võib aidata lahendada tohutul hulgal ülesandeid, millest järgmises artiklis räägime.

Dockeri eelised LXC, OpenVZ ja muude OS-taseme virtualiseerimislahenduste ees

  1. Docker kasutab kaasaskantavat üldist pildivormingut. See tähendab, et neid pilte saab ilma probleemideta teise masinasse üle kanda ja teistele kasutajatele kasutamiseks jagada.
  2. Pilt võib olla aluseks teistele piltidele. Dockeris peetakse normaalseks mitme kihi kasutamist lõpliku pildi moodustamiseks. Võite alustada Ubuntu põhipildiga, seejärel lisada Ubuntu + Apache mikroteenuse loomiseks Apache 2.4.
  3. Sidumisel saab pilti versioonida, nagu GIT-is.
  4. Dockeril on suur kogukond ja ulatuslik ökosüsteem, mis sisaldab märkimisväärsel hulgal tööriistu konteinerite skaleerimiseks, rühmitamiseks, jälgimiseks, juurutamiseks ja haldamiseks.

Oleme seda teemat puudutanud rohkem kui korra ja kaalunud nende ehitamiseks paljusid süsteeme. Täna tutvustame veel ühte suurepärast süsteemi Dockeri konteineritega.

Alustuseks kirjeldame põhifunktsioone, mis on kasulikud sarja järgmistes artiklites, ja meenutame lühidalt Dockeri arhitektuuri. Docker kasutab klient-server arhitektuuri ja koosneb klient-dockeri utiliidist, mis pääseb serverile juurde kasutades RESTful API, ja deemon Linuxi operatsioonisüsteemis (vt joonis 1). Kuigi Docker töötab ka mitte-Linuxi operatsioonisüsteemidega, ei käsitleta neid selles artiklis.

Dockeri põhikomponendid:
    • Konteinerid- operatsioonisüsteemi tehnoloogiate abil isoleeritud kasutajakeskkonnad, milles rakendusi käivitatakse. Lihtsaim viis on määratleda Dockeri konteiner pildilt käivitatava rakendusena. Muide, just sellega erineb Docker ideoloogiliselt näiteks LXC-st ( Linuxi konteinerid), kuigi nad kasutavad samu Linuxi tuumatehnoloogiaid. Dockeri projekti arendajad on pühendunud põhimõttele, et üks konteiner on üks rakendus.
    • Pildid- kirjutuskaitstud rakenduste mallid. Olemasolevate piltide peale saab lisada uusi tasemeid, mis koos esindavad failisüsteemi, muutes või täiendades eelmist taset. Tavaliselt luuakse uus pilt, salvestades juba töötava konteineri uude pilti olemasoleva üle või kasutades utiliidi jaoks spetsiaalseid juhiseid. Konteineri erinevate tasemete eraldamiseks failisüsteemi tasemel AUFS, btrfs, vfs ja Device Mapper... Kui kavatsete Dockerit kasutada koos SELinux, siis on see nõutav Seadme kaardistaja.
    • Registrid sisaldavad hoidlaid ( hoidla) pildid, - võrgu pildisalvestused. Need võivad olla nii era- kui ka avalikud. Kõige kuulsam register on.

GNU / Linuxi operatsioonisüsteemid kasutavad standardseid Linuxi tuumatehnoloogiaid konteinerite isoleerimiseks, näiteks:
  • Nimeruumid ( Linuxi nimeruumid).
  • Kontrollrühmad ( Crühmad).
  • Privileegide haldamise tööriistad ( Linuxi võimalused).
  • Täiendavad, kohustuslikud turvasüsteemid, nt AppArmor või SELinux.

Vaatleme loetletud tehnoloogiaid veidi üksikasjalikumalt.

Juhtrühma mehhanism (Crühmad) pakub tööriista süsteemiressursside jaotamise, prioriteetide seadmise ja haldamise peenhäälestamiseks. Juhtrühmad on rakendatud Linuxi tuumas. Kaasaegsetes distributsioonides rakendatakse kontrollrühma juhtimist läbi süsteemne siiski on võimalik raamatukogu abil juhtida libcgroup ja kommunaalkulud cgconfig... Peamised cgroupi hierarhiad (nimetatakse ka kontrolleriteks) on loetletud allpool:

  • blkio- seab piirangud sisend-väljundoperatsioonidele ja juurdepääsule plokkseadmetele;
  • Protsessor- protsesside ajakava abil jaotab protsessori aja ülesannete vahel;
  • cpuacct- Loob automaatseid aruandeid protsessori ressursside kasutamise kohta. Töötab koos kontrolleriga Protsessor eespool kirjeldatud;
  • cpuset- määrab ülesannetele teatud protsessorid ja mälusõlmed;
  • seadmeid- reguleerib ülesannete juurdepääsu konkreetsetele seadmetele;
  • sügavkülmik- peatab või jätkab ülesannete täitmist;
  • mälu- seab piirangud ja genereerib aruandeid mälukasutuse kohta kontrollgrupi ülesannete kaupa;
  • net_cls- teostab võrgupakettide märgistamist klassi identifikaatoriga ( klassifitseeritud). See võimaldab liikluskorraldajal ( tc käsk) ja tulemüür ( iptables) neid silte liikluse töötlemisel arvesse võtma;
  • perf_event- võimaldab teil utiliidi abil jälgida kontrollrühmi perf;
  • hugetlb- võimaldab kasutada suuri virtuaalmälu lehti ja rakendada neile piiranguid.

nimeruumid, need omakorda ei kontrolli mitte ressursside jaotamist, vaid juurdepääsu kerneli andmestruktuuridele. Tegelikult tähendab see protsesside eraldamist üksteisest ja võimalust omada paralleelselt "identset", kuid mitte üksteisega kattuvat protsesside, kasutajate ja võrguliideste hierarhiat. Soovi korral võib erinevatel teenustel olla isegi oma loopback liidesed.

Dockeri kasutatavate nimeruumide näited:
  • PID, protsessi ID- protsesside hierarhia eraldatus.
  • NET, võrgundus- võrguliideste isoleerimine.
  • PC, InterProcess Communication- protsessidevahelise interaktsiooni juhtimine.
  • MNT, mägi- kinnituspunktide haldamine.
  • UTS, Unixi ajajagamise süsteem- tuuma ja versiooni identifikaatorite isoleerimine.

Mehhanism nimega Võimalused võimaldab jagada juurkasutaja õigused väikesteks õiguste rühmadeks ja määrata need eraldi. See funktsioon on ilmunud GNU / Linuxis alates versioonist tuumad 2.2. Algselt käivitatakse konteinerid piiratud hulga õigustega.

Saate lubada ja keelata dockeri käsusuvandid:
  • paigaldustoimingud;
  • juurdepääs pistikupesadele;
  • Teatud toimingute tegemine failisüsteemis, näiteks failide atribuutide või omaniku muutmine.

Privileegide kohta saate lisateavet man-lehe kaudu. VÕIMALUSED (7).

Dockeri installimine

Vaatame Dockeri installimist, kasutades näitena CentOS-i. CentOS-iga töötades on teil valik: kasutage uusimat versiooni alates u pstream või CentOS-i projekti loodud versioon Red Hati lisandmoodulitega. Muudatuste kirjeldus on saadaval lehel.

Põhimõtteliselt on see uute ülesvoolu versioonide paranduste ja Red Hati arendajate pakutud muudatuste vastupidine teisaldamine, kuid mida pole veel põhikoodi vastu võetud. Selle kirjutamise ajal oli kõige märgatavam erinevus see, et uuemates versioonides on dokiteenus jagatud kolmeks osaks: deemon dokk, konteiner ja runc... Red Hat ei pea seda muudatust veel stabiilseks ja tarnib monoliitse versiooni 1.10 käivitatava faili.

Hoidlasätted installimiseks ülesvoolu versioonid, samuti juhised installimiseks teistele distributsioonidele ja operatsioonisüsteemidele, on toodud ametlikul veebisaidil olevas installijuhendis. Täpsemalt CentOS 7 hoidla seaded:

# cat /etc/yum.repos.d/docker.repo nimi = Dockeri hoidla baseurl = https: //yum.dockerproject.org/repo/main/centos/7 lubatud = 1 gpgcheck = 1 gpgkey = https: // yum .dockerproject.org / gpg

# kass /etc/yum.repos.d/docker.repo

nimi = hoidla

baseurl = https: // yum .dockerproject .org / repo / main / centos / 7

lubatud = 1

gpgcheck = 1 gpgkey = https: // yum .dockerproject .org / gpg

Installige vajalikud paketid ning käivitage ja lubage teenus:

# yum install -y docker-engine # systemctl start docker.service # systemctl enable docker.service

# yum install -y docker-mootor

# systemctl käivita docker.service

# systemctl lubage docker.service

Teenuse oleku kontrollimine:

# systemctl olek docker.service

# systemctl olek docker.service

Samuti saate vaadata süsteemiteavet Dockeri ja keskkonna kohta:

# dokiteave

Kui käivitate sarnase käsu ja installite Dockeri CentOS-i hoidlatest, näete tarkvara vanema versiooni kasutamise tõttu väiksemaid erinevusi. Väljundist dokkide teave saame teada, mida kasutatakse andmete salvestamiseks draiverina Seadme kaardistaja ja salvestusruumina - fail / var / lib / docker /:

# ls -lh / var / lib / docker / devicemapper / devicemapper / data -rw -------. 1 juurjuur 100G 27. detsember 12:00 / var / lib / docker / devicemapper / devicemapper / data

# ls -lh / var / lib / docker / devicemapper / devicemapper / data

Rw - - - -. 1 juurjuur 100G 27. detsember 12:00 / var / lib / / devicemapper / devicemapper / data

Deemoni käivitusvalikud, nagu tavaliselt CentOS-is, on salvestatud / etc / sysconfig /... Sel juhul dokifaili nimi. Vastav rida / etc / sysconfig / docker valikute kirjeldamine:

OPTIONS = "- selinux-enabled --log-driver = journald"

Kui käivitasite dockeri käsu mitte-juurkasutajana või dokkimisrühma liikmena, näete sellist tõrketeadet:

$ docker otsing mysql

$ otsing mysql

Hoiatus: vaikeregistri lõpp-punkti deemonist hankimine ebaõnnestus (Dockeri deemoniga ei saa ühendust luua. Kas dokkedeemon töötab sellel hostil?). Süsteemi vaikeseade kasutamine: https: // indeks. docker.io/v1/

Dockeri deemoniga ei saa ühendust luua. Kas dokkedeemon töötab sellel hostil?

Pange tähele, et tegelikult võrdub kasutaja lisamine dokkimisrühma selle kasutaja lisamisega juurrühma.

RHEL / CentOS-i arendajatel on Dockeri deemoni turvalisusele pisut erinev lähenemine kui Dockeri ülesvoolu arendajatel endil. Lisateavet Red Hati lähenemisviisi kohta leiate RHELi arendaja Dan Walshi artiklist.

Kui soovite, et CentOS-i hoidlatest installitaks Dockeri "standardne" käitumine (st ametlikus dokumentatsioonis kirjeldatud), peate looma dokkimisrühma ja lisama deemoni käivitusvalikud:

OPTIONS = "- selinux-enabled --log-driver = journald ↵ --group = docker"

VALIKUD = "--selinux-enabled --log-driver = journald ↵ --group = docker"

Seejärel taaskäivitame teenuse ja kontrollime, et dokkimispesa fail kuulub dokkimisrühma, mitte root:

# ls -l /var/run/docker.sock

Piltide ja Dockeri siltide otsimine

Proovime leida Docker Hubist konteineri.

$ dockeri otsingu haproxy

$ otsing haproxy


Selles väljundis oleme saanud mitmete HA puhverserveri kujutiste loendi. Loendi kõrgeim üksus on ametliku hoidla HA puhverserver. Sellised pildid erinevad selle poolest, et nimes pole sümbolit «/» eraldades kasutaja hoidla nime konteineri enda nimest. Ametniku taga olev näide näitab kahte haproxy-pilti avatud kasutajahoidlatest eeacms ja miljon12.

Selliseid pilte nagu kaks alltoodud saate luua ise, registreerudes Docker Hubis. Ametlikke toetab spetsiaalne meeskond, mida sponsoreerib Docker, Inc. Ametliku hoidla omadused:

  • Need on kasutamiseks soovitatavad pildid, mis põhinevad parimatel tavadel ja parimatel tavadel.
  • Need on põhipildid, mis võivad olla lähtepunktiks suuremaks kohandamiseks. Näiteks Ubuntu, CentOS-i või teekide ja arenduskeskkondade baaspildid.
  • Sisaldab uusimaid parandatud haavatavustega tarkvaraversioone.
  • See on toodete ametlik turustuskanal. Ainult ametlike piltide otsimiseks võite kasutada valikut -Filter "on-ametlik = tõsi" käske dokkide otsing.

Tärnid käsuväljundis dokkide otsing vastab pildi populaarsusele. See on nupu analoog meeldib sotsiaalvõrgustikes või teiste kasutajate jaoks järjehoidjatena. Automatiseeritud tähendab, et pilt luuakse automaatselt kohandatud skriptist, kasutades Docker Hubi. Tavaliselt tuleks eelistada automaatselt kogutavaid pilte, kuna nende sisu saab kontrollida vastava faili tundmise kaudu.

Laadige alla ametlik HA puhverserveri pilt:

$ docker pull haproxy Vaikimisi sildi kasutamine: viimane

Pildi täisnimi võib välja näha selline:

[kasutajanimi] pildi nimi [: silt]

Allalaaditud piltide loendit saate vaadata käsuga dockeri pildid:

Konteinerite vettelaskmine

Konteineri käitamiseks ei ole vaja pilti alla laadida. Kui see on saadaval, laaditakse see automaatselt. Proovime Ubuntuga konteinerit käivitada. Me ei loetle hoidlat ja laadime alla uusima ametliku pildi, mida Canonical toetab.

$ docker run -it ubuntu [e-postiga kaitstud]:/#

$ run - see ubuntu

root @ d7402d1f7c54: / #

Peale meeskonna jooksma, oleme määranud kaks võimalust: -i- konteiner peaks töötama interaktiivselt ja -t- pseudoterminal tuleb esile tõsta. Nagu väljundist näete, on meil konteineris juurkasutaja õigused ja hostinimena kuvatakse konteineri ID. Viimane ei pruugi kehtida kõigi konteinerite puhul ja sõltub konteineri arendajast. Kontrollime, kas see on tõesti Ubuntu keskkond:

[e-postiga kaitstud]: / # kass / etc / * vabasta | grep DISTRIB_DESCRIPTION DISTRIB_DESCRIPTION = "Ubuntu 16.04.1 LTS"

root @ d7402d1f7c54: / # kass / etc / * vabastamine | grep DISTRIB_DESCRIPTION

DISTRIB_DESCRIPTION = "Ubuntu 16.04.1 LTS"

Uname käsk -a sellistel eesmärkidel see ei tööta, kuna konteiner töötab koos hostituumaga.

Üks võimalustest võib olla unikaalne konteineri nimi, millele saab lisaks mugavuse huvides viidata Konteineri ID. Seda antakse kui – nimi<имя>. Kui suvand jäetakse välja, genereeritakse nimi automaatselt.

Automaatselt genereeritud konteinerinimed ei kanna semantilist koormust, kuid huvitava faktina võib märkida, et nimed genereeritakse juhuslikult omadussõnast ja kuulsa teadlase, leiutaja või häkkeri nimest. Generaatori koodist leiab iga nime juurest lühikirjelduse, mille poolest antud kujund on tuntud.

Käsuga saate vaadata töötavate konteinerite loendit. Selleks avage teine ​​terminal:

Kui aga anname käsu välja, ei leia me mysql-pildist loodud konteinerit. Kasutame võimalust -a mis näitab kõiki konteinereid, mitte ainult töötavaid konteinereid:

Ilmselgelt jäid nõutavad parameetrid konteineri käivitamisel täpsustamata. Konteineri käitamiseks vajalike keskkonnamuutujate kirjelduse leiate Docker Hubi ametlikust MySQL-pildist. Proovime uuesti, kasutades valikut -e mis määrab konteineris keskkonnamuutujad:

$ docker run --name mysql-test ↵ -e MYSQL_ROOT_PASSWORD = docker -d mysql

Viimane parameeter on käsk, mida tahame konteineris täita. Sel juhul on selleks käsutõlk. Bash... Valikud - see on oma eesmärgi poolest sarnased käsus varem kasutatutega dokijooks.

Tegelikult pärast selle käsu käivitamist konteinerisse mysql-test lisatakse veel üks protsess - bash... Seda saab selgelt näha pstree käsu abil. Lühendatud väljund käsuks docker exec: