Docker: Difference between revisions

From ICO wiki
Jump to navigationJump to search
Useerme (talk | contribs)
Useerme (talk | contribs)
 
(93 intermediate revisions by the same user not shown)
Line 2: Line 2:
Autor: Üllar Seerme<br />
Autor: Üllar Seerme<br />
Rühm: A31<br /><br />
Rühm: A31<br /><br />
Artikkel on mõeldud kõigile, kes valdavad GNU/Linuxit vähemalt algaja tasemel, st käsurea enesekindlat kasutamist. Kirjatöö raames tehtud tegevused viidi ellu IT Kolledži kauglabori süsteemis i-Tee, kus oli kasutuses erinevad virtuaalmasinad. Edasi järgnevad tehnilised andmed kasutatud distributsioonide kohta.<br /><br />
Artikkel on mõeldud kõigile, kes valdavad GNU/Linuxit vähemalt algaja tasemel, st käsurea enesekindlat kasutamist. Kirjatöö raames tehtu viidi ellu IT Kolledži kauglabori süsteemis i-Tee<ref>Kauglabori süsteem i-Tee: https://elab.itcollege.ee</ref>, kus olid kasutuses erinevad virtuaalmasinad. Virtuaalmasinat "klientarvuti" kasutati SSH ühenduse loomiseks virtuaalmasinasse "rakendusserver". Järgnevad tehnilised andmed kasutatud distributsioonide kohta.<br /><br />
Selleks, et saada ülevaade distributsioonist, sisestada järgnev käsk, kusjuures juurkasutaja õigustes tegutsemine ei ole eeldatud:
Selleks, et saada ülevaade distributsioonist, sisestada järgnev käsk, kusjuures juurkasutaja õigustes tegutsemine ei ole eeldatud:
{|style="background:lightyellow;width:300px;margin:3px;border:1px solid lightgrey" align=centre
{|style="background:lightcyan;width:auto;margin:3px;border:1px solid lightgrey" align=centre
| style="padding:0px 0px 0px 5px;font-family:courier;font-size:8pt;" | cat /etc/*-release  
| style="padding:5px;font-family:courier;font-size:8pt;" | cat /etc/*-release  
|}<br />
|}
Rakendusserver:
Rakendusserver:
  DISTRIB_ID=Ubuntu
  DISTRIB_ID=Ubuntu
Line 28: Line 28:


=Konteineritest=
=Konteineritest=
Konteinerid on operatsioonisüsteemi (edaspidi OS) virtualiseerimise meetodi tulemus, mis võimaldavad efektiivsemat füüsiliste ressursside kasutust ''host'' seadmel ning madalamat ajakulu uue ''guest'' instantsi loomisel. Konteinerite aluseks on samuti füüsiline riistvara ja OS nagu traditsioonilise virtualiseerimise puhulgi, kuid edasine puudutab juba peamiselt GNU/Linuxi spetsiifilisi termineid nagu ''kernel'', ''namespace'' ja ''cgroups''. Selle asemel, et olemasoleva OS-i peale paigaldada ''hypervisor'', mis looks virtuaalmasina koos uue ''guest'' OS-iga, kasutatakse ära OS-i tasemel virtualiseerimist, mis tagab ilma ''hypervisor'' tarkvarata eraldiseisvad alad ''host'' OS-il ning lõppkasutaja jaoks tekib endiselt mulje, et tegemist on täiesti uue serveriga.
Konteinerid on operatsioonisüsteemi (edaspidi OS) virtualiseerimise meetodi tulemus, mis võimaldavad efektiivsemat füüsiliste ressursside kasutust ''host'' seadmel ning madalamat ajakulu uue ''guest'' instantsi loomisel. Konteinerite aluseks on samuti füüsiline riistvara ja OS nagu traditsioonilise virtualiseerimise puhulgi, kuid edasine puudutab juba peamiselt GNU/Linuxi spetsiifilisi termineid nagu ''kernel'', ''namespace'' ja ''cgroups''. Selle asemel, et olemasoleva OS-i peale paigaldada ''hypervisor'', mis looks virtuaalmasina koos uue ''guest'' OS-iga, kasutatakse ära OS-i tasemel virtualiseerimist ''kerneli'' moodulitega, mis tagab ilma ''hypervisor'' tarkvarata eraldiseisvad alad ''host'' OS-il ning lõppkasutaja jaoks tekib endiselt mulje, et tegemist on täiesti uue serveriga.


Operatsioonisüsteemi tasemel virtualiseerimine toimub läbi kerneli, või teisisõnu läbi tuumikprogrammi, mis haldab tarkvaralisi sisendeid ja väljundeid ning tõlgendab neid protsessorile ja teistele komponentidele mõistetavateks juhisteks. GNU/Linuxi põhistel kernelitel on sisseehitatud tugi mitmete ''namespace'''ide jaoks. ''Namespace'' on isoleeritud vaade süsteemist omaenda mount punktidega, kasutajatega, võrgufunktsionaalsusega ja protsessidega ning see kõik töötab olemasoleva kerneli najal, mistõttu saab ka öelda, et toimub efektiivsem ressursside kasutus, kuna on jäetud ära vahepeal asuvad ''hypervisor''i ja OS-i kihid ja suhtlus riistvaraga saab toimuda otsesemal moel.
OS tasemel virtualiseerimine toimub läbi kerneli, või teisisõnu läbi tuumikprogrammi, mis haldab tarkvaralisi sisendeid ja väljundeid ning tõlgendab neid protsessorile ja teistele komponentidele mõistetavateks juhisteks. GNU/Linuxi põhistel kernelitel on sisseehitatud tugi mitmete ''namespace'''ide jaoks. ''Namespace'' on isoleeritud kogum protsesse omaenda külgehaakimispunktidega, kasutajatega, võrgufunktsionaalsusega ja protsessidega ning see kõik töötab olemasoleva kerneli najal, mistõttu saab ka öelda, et toimub efektiivsem ressursside kasutus, kuna on jäetud ära tavapäraselt vahepeal asuvad ''hypervisor''i ja OS-i kihid ning suhtlus riistvaraga saab toimuda otsesemal moel. Selleks, et saaks kontrollida ressursside kasutust võetakse kasutusele ''cgroups''<ref>Red Hat Enterprise Linux: Resource Management and Linux Containers Guide: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7-Beta/html/Resource_Management_and_Linux_Containers_Guide/chap-Introduction_to_Control_Groups.html#sec-What_are_Control_Groups</ref>, mis hõlpsustab grupeeritud protsesside, näiteks ''namespace'', ressursside haldamist.
 
Selleks, et saaks kontrollida ressursside kasutust võetakse kasutusele ''cgroups'', mis hõlpsustab grupeeritud protsesside, näiteks ''namespace'''ide, ressursside haldamist.


=Dockeri omapära=
=Dockeri omapära=
Docker on töövahend rakenduste loomiseks, kokkupanemiseks ja paigaldamiseks kasutades konteinereid. Konteineri loomiseks võetakse aluseks mingit sorti tõmmis või ''image'', mille peale hakatakse kihtidena laduma erinevad koostisosi, millest saab omakorda luua uue tõmmise. Näiteks saab tuua tõmmise, mis põhineb Ubuntu 14.04 LTS distributsioonil ning lisades sellele konteinerile rakendusi nagu Apache, MySQL ja PHP saab ühest konteinerist uue standardse konteineri, millel on töötav LAMP (Linux, Apache, MySQL, PHP/Python/Perl) tarkvarakogumik. Kuna see kõik on ühe konteineri raames üles seatud, siis kaovad probleemid, kus ühe rakenduse töötamine seisab erinevate sõltuvuste taga.


=Paigaldus=
=Paigaldus=
==Tavapärane==
Dockeri paigaldus toimub rakendusserveril ning kuigi on võimalik tavapäraste käskudega Docker paigaldada:
{|style="background:lightcyan;width:auto;margin:3px;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | apt-get update
apt-get install docker.io
|}
siis seda tehes paigaldatakse vanem 1.0.1 versioon (artikli kirjutamise hetkel), mis on küll uusim, mida Ubuntu repositooriumitest saab, aga siiski vanem kui ametlik versioon. Artikli järgimiseks piisab ka sellest versioonist.
Kontrollimaks, et kõik laabus, käivitada:
{|style="background:lightcyan;width:auto;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | docker version
|}
mis peaks tagastama analoogse väljundi:
Client version: 1.0.1
Client API version: 1.12
Go version (client): go1.2.1
Git commit (client): 990021a
Server version: 1.0.1
Server API version: 1.12
Go version (server): go1.2.1
Git commit (server): 990021a
==Uusim==
Uusima versiooni paigaldamiseks tuleb esmalt veenduda, et ''apt'' toetab üle HTTPS protokolli pakkide allalaadimist. Juhul, kui:
{|style="background:lightcyan;width:auto;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | find /usr/lib/apt/methods/ -name 'https'
|}
tagastab järgneva, siis saab jätkata alapeatükiga:
/usr/lib/apt/methods/https
Juhul, kui ei tagasta midagi, siis tuleb käivitada järgnevad käsud, mis uuendab pakkide repositooriumid ja paigaldab ''apt-transport-https'':
{|style="background:lightcyan;width:auto;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | apt-get update
apt-get install apt-transport-https
|}<br />
Jätkamiseks tuleb lisada Dockeri repositooriumi võti:
{|style="background:lightcyan;width:auto;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
|}
Misjärel lisada Dockeri repositoorium ''apt'' allikate nimekirja, repositooriumid uuendada ning paigaldada ''lxc-docker'':
{|style="background:lightcyan;width:auto;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | sh -c "echo deb https://get.docker.com/ubuntu docker main\ > /etc/apt/sources.list.d/docker.list"
apt-get update
apt-get install lxc-docker
|}
Kontrollimaks, et kõik laabus, käivitada:
{|style="background:lightcyan;width:auto;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | docker version
|}
mis peaks tagastama analoogse väljundi:
Client version: 1.3.2
Client API version: 1.15
Go version (client): go1.3.3
Git commit (client): 39fa2fa
OS/Arch (client): linux/amd64
Server version: 1.3.2
Server API version: 1.15
Go version (server): go1.3.3
Git commit (server): 39fa2fa
=Sissejuhatavad tegevused=
Kirjutades käsureale niisama
{|style="background:lightcyan;width:auto;margin:3px;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | docker
|}
saab näha kõiki Dockeriga seotud käske:
...
Commands:
    attach    Attach to a running container
    build    Build an image from a Dockerfile
    commit    Create a new image from a container's changes
    cp        Copy files/folders from a container's filesystem to the host path
    create    Create a new container
    diff      Inspect changes on a container's filesystem
    events    Get real time events from the server
    exec      Run a command in an existing container
    export    Stream the contents of a container as a tar archive
    history  Show the history of an image
    images    List images
    import    Create a new filesystem image from the contents of a tarball
    info      Display system-wide information
    inspect  Return low-level information on a container
    kill      Kill a running container
    load      Load an image from a tar archive
    login    Register or log in to a Docker registry server
    logout    Log out from a Docker registry server
    logs      Fetch the logs of a container
    port      Lookup the public-facing port that is NAT-ed to PRIVATE_PORT
    pause    Pause all processes within a container
    ps        List containers
    pull      Pull an image or a repository from a Docker registry server
    push      Push an image or a repository to a Docker registry server
    restart  Restart a running container
    rm        Remove one or more containers
    rmi      Remove one or more images
    run      Run a command in a new container
    save      Save an image to a tar archive
    search    Search for an image on the Docker Hub
    start    Start a stopped container
    stop      Stop a running container
    tag      Tag an image into a repository
    top      Lookup the running processes of a container
    unpause  Unpause a paused container
    version  Show the Docker version information
    wait      Block until a container stops, then print its exit code
...
Alustame mõne tõmmise tõmbamisest kasutades
{|style="background:lightcyan;width:auto;margin:3px;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | docker pull phusion/baseimage
|}
käsku, mis laeb alla konteineri sees kasutamiseks mõeldud Ubuntu 14.04 LTS tõmmise. Kogu protsess oleneb suuresti ühenduse kiirusest, kuid peaks siiski jääma paari minuti piiresse. Eduka allalaadimise korral on väljundis viimasel real näha:
Status: Downloaded newer image for phusion/baseimage:latest
Käsuga
{|style="background:lightcyan;width:auto;margin:3px;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | docker images
|}
saab näha praegu ''host'' masinal olevaid tõmmiseid
REPOSITORY          TAG                IMAGE ID            CREATED            VIRTUAL SIZE
phusion/baseimage  latest              cf39b476aeec        10 weeks ago        289.4 MB
phusion/baseimage  0.9.15              cf39b476aeec        10 weeks ago        289.4 MB
Nüüd on võimalik juba üks konteiner käivitada ja seal ringi uurida:
{|style="background:lightcyan;width:auto;margin:3px;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | docker run -t -i phusion/baseimage:latest /bin/bash
|}
Kus -t tekitab konteinerisse kasutatava terminali ja -i hoiab konteineri töötavana senikaua kuni kasutaja konteineri sulgeb, phusion/baseimage tähistab millise repositooriumi tõmmist kasutada, pärast semikoolonit järgneb tõmmisele omane ''tag'' ning /bin/bash alustab konteineris Bash shelli. Eduka käivitamise puhul viiakse kasutaja automaatselt juurkasutaja õigustes unikaalse identifikaatoriga konteinerisse, mida näitab ka ''prompt'' käsureal:
root@37ed3671ae25:/#
Kui avada uus terminali aken ''host'' masinas ja käivitada Dockerile omane ''ps'' käsk
{|style="background:lightcyan;width:auto;margin:3px;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | docker ps
|}
siis saab näha, et tõepoolest on praegu töötav konteiner olemas
CONTAINER ID        IMAGE                      COMMAND            CREATED            STATUS              PORTS              NAMES
37ed3671ae25        phusion/baseimage:0.9.15  "/bin/bash"        17 seconds ago      Up 16 seconds                          pensive_mclean
Edaspidi on võimalik toimetada konteineris juba varasemast endale tuntud käskudega, seada üles toimivaid rakendusi ja palju muud, kuid praegu kirjutades ''exit'' ja konteinerist väljudes lakkab konteiner töötamast, mis võib olla ajutiste skriptide ja muu säärase testimiseks täiesti piisav, aga katsetamise eesmärgiks seame üles taustal töötava rakenduse.
=Rakenduse ülesseadmine=
==Loomine ja käivitamine==
Selleks, et luua omaenda tõmmiseid, mida teistega jagada, tuleb esmalt registreerida end Docker Hub keskkonnas. Registeerimine on võimalik nii läbi veebilehe, kui ka kasutades käsku
{|style="background:lightcyan;width:auto;margin:3px;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | docker login
|}
Pärast käsu käivitamist küsitakse kasutajanime, parooli ja meiliaadressi. Meilile saadetakse kinnituslink ning pärast sellele vajutamist on registreerimine lõpetatud ja juba on võimalik end äsja sisestatud käsuga sisse logida. Tõmmise loomiseks on soovituslik ''host'' masinas luua eraldi kataloog failide jaoks, mida tõmmise loomiseks vaja on
{|style="background:lightcyan;width:auto;margin:3px;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | mkdir rakendus
cd rakendus
|}
Nüüd uues kataloogis luua ''Dockerfile'', mille põhjal hakatakse ehitama uut tõmmist ning avada see enda valitud tekstiredaktoriga (praegu on selleks Nano)
{|style="background:lightcyan;width:auto;margin:3px;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | touch Dockerfile
nano Dockerfile
|}
Dockerfile'is käskude kirjutamine toimub väga lihtsal põhimõttel - kirjutatakse esmalt Dockeripõhine juhis, millele järgneb kas tavaline tekstijupp või erinevad shelli käsud, mida käivitatakse tõmmise loomisel. Järgneb artikli jaoks loodud Dockerfile ja selle selgitus:
FROM phusion/baseimage:latest
RUN apt-get update && apt-get install -y apache2
RUN mkdir -p /rak && rm -fr /var/www/html && ln -s /rak /var/www/html
ADD index.html /rak/
EXPOSE 80
WORKDIR /rak
ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
FROM täpsustab, et kasutame tõmmise aluseks artiklis eelnevalt kasutatud phusion repositooriumi baseimage tõmmist tag'iga latest.<br />
RUN määratleb käske, mida käivitatakse ja lisatakse alustõmmisele peale.<br />
ADD'iga võimalik katalooge ja faile ''host'' masinalt konteinerisse ümber kopeerida.<br />
EXPOSE määrab pordi, mida konteiner käivitumisel ''host'' masinale nähtavaks teeb<br />
WORKDIR seab paika konteineri avamisel kataloogi, kus kasutaja paikneb.<br />
ENTRYPOINT määrab vaikimisi rakenduse, mis konteineri käivitamisel esimese protsessina käima läheb


Hetkel on ADD juhisega lisatud index.html fail äärmiselt lihtsakoeline Hello World leht, millele saab peatselt ''host'' masinalt ka ligi pääseda. Nüüd saab seal samas kataloogis käivitada käsu
{|style="background:lightcyan;width:auto;margin:3px;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | docker build -t="<kasutajanimi>/<repositooriumi nimi>:<tag>" .
|}
mis hakkab koostama Dockerfile'is olevate juhiste põhjal uut tõmmist. Olenevalt sellest, kas aluseks kasutatav tõmmis on olemas ja käivitatavate käskude (nagu ''apt-get update'') tulemuse olemasolu vahemälus, sõltub ka kogu protsessi kestvus, kuid üldiselt jääb see jällegi paari minuti piiresse. Pärast edukat koostamist on võimalik käsuga
{|style="background:lightcyan;width:auto;margin:3px;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | docker images
|}
näha uut lisandunud tõmmist
REPOSITORY          TAG                IMAGE ID            CREATED            VIRTUAL SIZE
<user>/<repo>      <tag>              06ec11fddabb        11 minutes ago      321.2 MB
phusion/baseimage  latest              cf39b476aeec        10 weeks ago        289.4 MB
phusion/baseimage  0.9.15              cf39b476aeec        10 weeks ago        289.4 MB
Käivitame järgneva
{|style="background:lightcyan;width:auto;margin:3px;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | docker run -d -P <user>/<repo>:<tag>
|}
mis loob äsjaloodud tõmmise põhjal uue konteineri. Käsuga
{|style="background:lightcyan;width:auto;margin:3px;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | docker ps
|}
on näha hetkel taustal töötavat konteinerit ning temaga seonduvat infot. Hetkel huvitab meid enim veerus PORTS olev, kus kirjeldatakse, et ''host'' masina port 49170 on suunatud konteineri pordile 80
CONTAINER ID        IMAGE                  COMMAND                CREATED            STATUS              PORTS                  NAMES
489817d4d8b2        <user>/<repo>:<tag>    "/usr/sbin/apache2ct  5 seconds ago      Up 5 seconds        0.0.0.0:49170->80/tcp  hungry_wozniak
Nüüd, kui avada ''host'' masinas brauser ja aadressiribale sisestada kas localhost:49170 või <IP aadress>:49170, siis tervitab kasutajat väga algeline Hello World leht. Selleks, et ei peaks iga kord otsima üles spetsiifilist pordinumbrit, mida sisse tippida, saab kasutada käsku
{|style="background:lightcyan;width:auto;margin:3px;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | docker run -d -p 80:80 <user>/<repo>:<tag>
|}
mille kaudu saab kohe kas localhost või IP aadressi abil näha tervituslehte.
==Täiendamine==
Selleks, et olemasolevat rakendust täiendada või praegu näite puhul Hello World lehte muuta, saab haakida külge esialgsel konteineri käivitamisel ''host'' masina kataloogi, kasutades käsku
{|style="background:lightcyan;width:auto;margin:3px;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | docker run -d -p 80:80 -v /host/kataloog:/konteiner/kataloog <user>/<repo>:<tag>
|}
mille tulemusena on nii konteineris, kui ka ''host'' masinas tehtavad muudatused seal kataloogis peegeldatud. Lisaks eelnevale on võimalik haakida külge ka spetsiifilisi faile, kui asendada kataloogi absoluutne rada mõne faili omaga. Veel saab kopeerida faile ja kaustu hetkel töötavasse konteinerisse, kui esialgu käivitada
{|style="background:lightcyan;width:auto;margin:3px;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | docker ps
|}
ning selle väljundis pidada silmas konteineri ID, kusjuures ei pea tervet teadma, vaid piisab esimestest tähtedest, et ''Tab-completion'' õigeni jõuaks.<br />Järgnevalt navigeerida kataloogi, kus asub fail, mida tahetakse ümber tõsta ja käivitada käsk
{|style="background:lightcyan;width:auto;margin:3px;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | cp <kopeeritav fail> /var/lib/docker/aufs/mnt/<konteineri ID>
|}
==Enda järelt koristamine==
Praegu on kõik teostatud tööd tehtud kooli virtuaalmasinas ning pidev tõmmiste allalaadimine ja loomine ning konteinerite jooksutamine nõuab ressursse, mida alati olla ei pruugi.<br />Kõik tööle pandud konteinerid on võimalik peatada käsuga
{|style="background:lightcyan;width:auto;margin:3px;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | docker stop $(docker ps -a -q)
|}
Kõik tööle pandud konteinerid on võimalik kustutada käsuga
{|style="background:lightcyan;width:auto;margin:3px;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | docker rm $(docker ps -a -q)
|}
Kõik allalaetud ja loodud tõmmised on võimalik kustutada käsuga
{|style="background:lightcyan;width:auto;margin:3px;border:1px solid lightgrey" align=centre
| style="padding:5px;font-family:courier;font-size:8pt;" | docker rmi $(docker images -q)
|}
=Kokkuvõte=
=Kokkuvõte=
Võrreldes traditsioonilise virtualiseerimisega on konteineritel, nii Dockeri omadel kui ka teistel lahendustel, parasjagu erinevusi ning nende mõistmine aitab aru saada, millises olukorras, mida kasutada. Sarnasustena saab peamiselt esile tuua migreerimisvõimaluse erinevatele riistvaradele, juurkasutaja ligipääsu olemasolu, veebipõhise kaughalduse teostamine ning tagavarakoopiate loomine kasvõi töötavatest instantsidest.<ref>ServerNest - Comparison between OS virtualization and hypervisor-based virtualization: http://servernest.com/container-virtual-machine.html</ref> Kuna konteinerid võimaldavad luua mitmeid isoleeritud süsteeme, mille aluseks on olemasolev ''kernel'', siis ei ole otsest vajadust mitmeteks mahukateks virtuaalmasinateks, millel on märgatavalt suurem mõju füüsilistele ressurssidele, aga juhul, kui ongi mitmeid erinevaid ja eraldiseisvaid OS-e vaja, siis konteineripõhine lahendus ei suuda neid tingimusi täita.<br /><br />
Konteinerite eelisteks on kordades efektiivsem ressursside kasutus, kuna suhtlus riistvaraga käib otsemat teedpidi. Virtuaalmasinad peavad lisaks ''guest'' OS-ile, elik virtuaalmasina OS-ile, pöörduma veel ''hypervisor'' poole, mis omakorda suhtleks läbi ''host'' OS-i ja sealt riistvaraga. Lühem tee riistvarani tähendab ka ühtlasi, et ühe füüsilise seadme peal on võimalik kasutada mitmetes kümnetes kui mitte sadu konteinereid, kusjuures virtuaalmasinate arv oleks tunduvalt madalam.<br /><br />
Uue instantsi, st uue konteineri või virtuaalmasina, ülesseadmine on ka oluliste erinevustega. Konteinerite ülesseadmise käigus saab kasutada ära üsna väikesemahulisi rakendusi ja tööriistu, mis ei koorma niivõrd riistvara ja tagavad olenevalt olukorrast (st kas on automatiseeritud protsess ja kompaktne konteiner) sekunditega uue instantsi. Virtuaalmasinate puhul tuleb tavaliselt mõelda nii ''hypervisor'' tarkvara paigaldamisele, ''guest'' OS-ide jaoks litsentside soetamisele, terve OS-i paigaldamisele ja paljule muule sellega kaasnevale. Kuigi virtuaalmasinate loomine on ka suures jaos automatiseeritav, siis sellegipoolest jääb ülesseadmine aeganõudvamaks protsessiks.<br /><br />
Konteinereid kasutades vähendatakse hallatavate OS-ide arvu, kuna kõik konteinerid töötavad ühe jagatud OS-i ''kerneli'' najal; toimub migratsioon kiiremini, sest mahud piirduvad megabaitidega, mitte gigabaitidega; lihtsustatakse OS-idel uuenduste tegemist ning palju muud.<ref>Cisco.com Linux Containers: http://www.cisco.com/c/dam/en/us/solutions/collateral/data-center-virtualization/dc-partner-red-hat/linux-containers-white-paper-cisco-red-hat.pdf#2</ref> Otsustades, mida millal kasutusele võtta, tuleks läbi mõelda eelkõige, mida saavutada tahetakse.
=Viited=


=Allikad=
<references />
1. [http://packages.ubuntu.com/lucid/misc/lsb-core Package: lsb-core (4.0-0ubuntu8)]<br>


[[Category:Linuxi administreerimine]]
[[Category:Linuxi administreerimine]]

Latest revision as of 21:34, 11 January 2015

Info ja eeldused

Autor: Üllar Seerme
Rühm: A31

Artikkel on mõeldud kõigile, kes valdavad GNU/Linuxit vähemalt algaja tasemel, st käsurea enesekindlat kasutamist. Kirjatöö raames tehtu viidi ellu IT Kolledži kauglabori süsteemis i-Tee[1], kus olid kasutuses erinevad virtuaalmasinad. Virtuaalmasinat "klientarvuti" kasutati SSH ühenduse loomiseks virtuaalmasinasse "rakendusserver". Järgnevad tehnilised andmed kasutatud distributsioonide kohta.

Selleks, et saada ülevaade distributsioonist, sisestada järgnev käsk, kusjuures juurkasutaja õigustes tegutsemine ei ole eeldatud:

cat /etc/*-release

Rakendusserver:

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.1 LTS"
NAME="Ubuntu"
VERSION="14.04.1 LTS, Trusty Tahr"
...

Klientarvuti:

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.1 LTS"
NAME="Ubuntu"
VERSION="14.04.1 LTS, Trusty Tahr"
...

Edaspidi on kõik artiklis kirjeldatud käsud käivitatud juurkasutaja õigustes, justkui teisiti öeldud ei ole!

Konteineritest

Konteinerid on operatsioonisüsteemi (edaspidi OS) virtualiseerimise meetodi tulemus, mis võimaldavad efektiivsemat füüsiliste ressursside kasutust host seadmel ning madalamat ajakulu uue guest instantsi loomisel. Konteinerite aluseks on samuti füüsiline riistvara ja OS nagu traditsioonilise virtualiseerimise puhulgi, kuid edasine puudutab juba peamiselt GNU/Linuxi spetsiifilisi termineid nagu kernel, namespace ja cgroups. Selle asemel, et olemasoleva OS-i peale paigaldada hypervisor, mis looks virtuaalmasina koos uue guest OS-iga, kasutatakse ära OS-i tasemel virtualiseerimist kerneli moodulitega, mis tagab ilma hypervisor tarkvarata eraldiseisvad alad host OS-il ning lõppkasutaja jaoks tekib endiselt mulje, et tegemist on täiesti uue serveriga.

OS tasemel virtualiseerimine toimub läbi kerneli, või teisisõnu läbi tuumikprogrammi, mis haldab tarkvaralisi sisendeid ja väljundeid ning tõlgendab neid protsessorile ja teistele komponentidele mõistetavateks juhisteks. GNU/Linuxi põhistel kernelitel on sisseehitatud tugi mitmete namespace'ide jaoks. Namespace on isoleeritud kogum protsesse omaenda külgehaakimispunktidega, kasutajatega, võrgufunktsionaalsusega ja protsessidega ning see kõik töötab olemasoleva kerneli najal, mistõttu saab ka öelda, et toimub efektiivsem ressursside kasutus, kuna on jäetud ära tavapäraselt vahepeal asuvad hypervisori ja OS-i kihid ning suhtlus riistvaraga saab toimuda otsesemal moel. Selleks, et saaks kontrollida ressursside kasutust võetakse kasutusele cgroups[2], mis hõlpsustab grupeeritud protsesside, näiteks namespace, ressursside haldamist.

Dockeri omapära

Docker on töövahend rakenduste loomiseks, kokkupanemiseks ja paigaldamiseks kasutades konteinereid. Konteineri loomiseks võetakse aluseks mingit sorti tõmmis või image, mille peale hakatakse kihtidena laduma erinevad koostisosi, millest saab omakorda luua uue tõmmise. Näiteks saab tuua tõmmise, mis põhineb Ubuntu 14.04 LTS distributsioonil ning lisades sellele konteinerile rakendusi nagu Apache, MySQL ja PHP saab ühest konteinerist uue standardse konteineri, millel on töötav LAMP (Linux, Apache, MySQL, PHP/Python/Perl) tarkvarakogumik. Kuna see kõik on ühe konteineri raames üles seatud, siis kaovad probleemid, kus ühe rakenduse töötamine seisab erinevate sõltuvuste taga.

Paigaldus

Tavapärane

Dockeri paigaldus toimub rakendusserveril ning kuigi on võimalik tavapäraste käskudega Docker paigaldada:

apt-get update

apt-get install docker.io

siis seda tehes paigaldatakse vanem 1.0.1 versioon (artikli kirjutamise hetkel), mis on küll uusim, mida Ubuntu repositooriumitest saab, aga siiski vanem kui ametlik versioon. Artikli järgimiseks piisab ka sellest versioonist. Kontrollimaks, et kõik laabus, käivitada:

docker version

mis peaks tagastama analoogse väljundi:

Client version: 1.0.1
Client API version: 1.12
Go version (client): go1.2.1
Git commit (client): 990021a
Server version: 1.0.1
Server API version: 1.12
Go version (server): go1.2.1
Git commit (server): 990021a

Uusim

Uusima versiooni paigaldamiseks tuleb esmalt veenduda, et apt toetab üle HTTPS protokolli pakkide allalaadimist. Juhul, kui:

find /usr/lib/apt/methods/ -name 'https'

tagastab järgneva, siis saab jätkata alapeatükiga:

/usr/lib/apt/methods/https

Juhul, kui ei tagasta midagi, siis tuleb käivitada järgnevad käsud, mis uuendab pakkide repositooriumid ja paigaldab apt-transport-https:

apt-get update

apt-get install apt-transport-https


Jätkamiseks tuleb lisada Dockeri repositooriumi võti:

apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9

Misjärel lisada Dockeri repositoorium apt allikate nimekirja, repositooriumid uuendada ning paigaldada lxc-docker:

sh -c "echo deb https://get.docker.com/ubuntu docker main\ > /etc/apt/sources.list.d/docker.list"

apt-get update

apt-get install lxc-docker

Kontrollimaks, et kõik laabus, käivitada:

docker version

mis peaks tagastama analoogse väljundi:

Client version: 1.3.2
Client API version: 1.15
Go version (client): go1.3.3
Git commit (client): 39fa2fa
OS/Arch (client): linux/amd64
Server version: 1.3.2
Server API version: 1.15
Go version (server): go1.3.3
Git commit (server): 39fa2fa

Sissejuhatavad tegevused

Kirjutades käsureale niisama

docker

saab näha kõiki Dockeriga seotud käske:

...
Commands:
   attach    Attach to a running container
   build     Build an image from a Dockerfile
   commit    Create a new image from a container's changes
   cp        Copy files/folders from a container's filesystem to the host path
   create    Create a new container
   diff      Inspect changes on a container's filesystem
   events    Get real time events from the server
   exec      Run a command in an existing container
   export    Stream the contents of a container as a tar archive
   history   Show the history of an image
   images    List images
   import    Create a new filesystem image from the contents of a tarball
   info      Display system-wide information
   inspect   Return low-level information on a container
   kill      Kill a running container
   load      Load an image from a tar archive
   login     Register or log in to a Docker registry server
   logout    Log out from a Docker registry server
   logs      Fetch the logs of a container
   port      Lookup the public-facing port that is NAT-ed to PRIVATE_PORT
   pause     Pause all processes within a container
   ps        List containers
   pull      Pull an image or a repository from a Docker registry server
   push      Push an image or a repository to a Docker registry server
   restart   Restart a running container
   rm        Remove one or more containers
   rmi       Remove one or more images
   run       Run a command in a new container
   save      Save an image to a tar archive
   search    Search for an image on the Docker Hub
   start     Start a stopped container
   stop      Stop a running container
   tag       Tag an image into a repository
   top       Lookup the running processes of a container
   unpause   Unpause a paused container
   version   Show the Docker version information
   wait      Block until a container stops, then print its exit code
...

Alustame mõne tõmmise tõmbamisest kasutades

docker pull phusion/baseimage

käsku, mis laeb alla konteineri sees kasutamiseks mõeldud Ubuntu 14.04 LTS tõmmise. Kogu protsess oleneb suuresti ühenduse kiirusest, kuid peaks siiski jääma paari minuti piiresse. Eduka allalaadimise korral on väljundis viimasel real näha:

Status: Downloaded newer image for phusion/baseimage:latest

Käsuga

docker images

saab näha praegu host masinal olevaid tõmmiseid

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
phusion/baseimage   latest              cf39b476aeec        10 weeks ago        289.4 MB
phusion/baseimage   0.9.15              cf39b476aeec        10 weeks ago        289.4 MB

Nüüd on võimalik juba üks konteiner käivitada ja seal ringi uurida:

docker run -t -i phusion/baseimage:latest /bin/bash

Kus -t tekitab konteinerisse kasutatava terminali ja -i hoiab konteineri töötavana senikaua kuni kasutaja konteineri sulgeb, phusion/baseimage tähistab millise repositooriumi tõmmist kasutada, pärast semikoolonit järgneb tõmmisele omane tag ning /bin/bash alustab konteineris Bash shelli. Eduka käivitamise puhul viiakse kasutaja automaatselt juurkasutaja õigustes unikaalse identifikaatoriga konteinerisse, mida näitab ka prompt käsureal:

root@37ed3671ae25:/#

Kui avada uus terminali aken host masinas ja käivitada Dockerile omane ps käsk

docker ps

siis saab näha, et tõepoolest on praegu töötav konteiner olemas

CONTAINER ID        IMAGE                      COMMAND             CREATED             STATUS              PORTS               NAMES
37ed3671ae25        phusion/baseimage:0.9.15   "/bin/bash"         17 seconds ago      Up 16 seconds                           pensive_mclean

Edaspidi on võimalik toimetada konteineris juba varasemast endale tuntud käskudega, seada üles toimivaid rakendusi ja palju muud, kuid praegu kirjutades exit ja konteinerist väljudes lakkab konteiner töötamast, mis võib olla ajutiste skriptide ja muu säärase testimiseks täiesti piisav, aga katsetamise eesmärgiks seame üles taustal töötava rakenduse.

Rakenduse ülesseadmine

Loomine ja käivitamine

Selleks, et luua omaenda tõmmiseid, mida teistega jagada, tuleb esmalt registreerida end Docker Hub keskkonnas. Registeerimine on võimalik nii läbi veebilehe, kui ka kasutades käsku

docker login

Pärast käsu käivitamist küsitakse kasutajanime, parooli ja meiliaadressi. Meilile saadetakse kinnituslink ning pärast sellele vajutamist on registreerimine lõpetatud ja juba on võimalik end äsja sisestatud käsuga sisse logida. Tõmmise loomiseks on soovituslik host masinas luua eraldi kataloog failide jaoks, mida tõmmise loomiseks vaja on

mkdir rakendus

cd rakendus

Nüüd uues kataloogis luua Dockerfile, mille põhjal hakatakse ehitama uut tõmmist ning avada see enda valitud tekstiredaktoriga (praegu on selleks Nano)

touch Dockerfile

nano Dockerfile

Dockerfile'is käskude kirjutamine toimub väga lihtsal põhimõttel - kirjutatakse esmalt Dockeripõhine juhis, millele järgneb kas tavaline tekstijupp või erinevad shelli käsud, mida käivitatakse tõmmise loomisel. Järgneb artikli jaoks loodud Dockerfile ja selle selgitus:

FROM phusion/baseimage:latest
RUN apt-get update && apt-get install -y apache2
RUN mkdir -p /rak && rm -fr /var/www/html && ln -s /rak /var/www/html
ADD index.html /rak/
EXPOSE 80
WORKDIR /rak
ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

FROM täpsustab, et kasutame tõmmise aluseks artiklis eelnevalt kasutatud phusion repositooriumi baseimage tõmmist tag'iga latest.
RUN määratleb käske, mida käivitatakse ja lisatakse alustõmmisele peale.
ADD'iga võimalik katalooge ja faile host masinalt konteinerisse ümber kopeerida.
EXPOSE määrab pordi, mida konteiner käivitumisel host masinale nähtavaks teeb
WORKDIR seab paika konteineri avamisel kataloogi, kus kasutaja paikneb.
ENTRYPOINT määrab vaikimisi rakenduse, mis konteineri käivitamisel esimese protsessina käima läheb

Hetkel on ADD juhisega lisatud index.html fail äärmiselt lihtsakoeline Hello World leht, millele saab peatselt host masinalt ka ligi pääseda. Nüüd saab seal samas kataloogis käivitada käsu

docker build -t="<kasutajanimi>/<repositooriumi nimi>:<tag>" .

mis hakkab koostama Dockerfile'is olevate juhiste põhjal uut tõmmist. Olenevalt sellest, kas aluseks kasutatav tõmmis on olemas ja käivitatavate käskude (nagu apt-get update) tulemuse olemasolu vahemälus, sõltub ka kogu protsessi kestvus, kuid üldiselt jääb see jällegi paari minuti piiresse. Pärast edukat koostamist on võimalik käsuga

docker images

näha uut lisandunud tõmmist

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
<user>/<repo>       <tag>               06ec11fddabb        11 minutes ago      321.2 MB
phusion/baseimage   latest              cf39b476aeec        10 weeks ago        289.4 MB
phusion/baseimage   0.9.15              cf39b476aeec        10 weeks ago        289.4 MB

Käivitame järgneva

docker run -d -P <user>/<repo>:<tag>

mis loob äsjaloodud tõmmise põhjal uue konteineri. Käsuga

docker ps

on näha hetkel taustal töötavat konteinerit ning temaga seonduvat infot. Hetkel huvitab meid enim veerus PORTS olev, kus kirjeldatakse, et host masina port 49170 on suunatud konteineri pordile 80

CONTAINER ID        IMAGE                   COMMAND                CREATED             STATUS              PORTS                   NAMES
489817d4d8b2        <user>/<repo>:<tag>     "/usr/sbin/apache2ct   5 seconds ago       Up 5 seconds        0.0.0.0:49170->80/tcp   hungry_wozniak

Nüüd, kui avada host masinas brauser ja aadressiribale sisestada kas localhost:49170 või <IP aadress>:49170, siis tervitab kasutajat väga algeline Hello World leht. Selleks, et ei peaks iga kord otsima üles spetsiifilist pordinumbrit, mida sisse tippida, saab kasutada käsku

docker run -d -p 80:80 <user>/<repo>:<tag>

mille kaudu saab kohe kas localhost või IP aadressi abil näha tervituslehte.

Täiendamine

Selleks, et olemasolevat rakendust täiendada või praegu näite puhul Hello World lehte muuta, saab haakida külge esialgsel konteineri käivitamisel host masina kataloogi, kasutades käsku

docker run -d -p 80:80 -v /host/kataloog:/konteiner/kataloog <user>/<repo>:<tag>

mille tulemusena on nii konteineris, kui ka host masinas tehtavad muudatused seal kataloogis peegeldatud. Lisaks eelnevale on võimalik haakida külge ka spetsiifilisi faile, kui asendada kataloogi absoluutne rada mõne faili omaga. Veel saab kopeerida faile ja kaustu hetkel töötavasse konteinerisse, kui esialgu käivitada

docker ps

ning selle väljundis pidada silmas konteineri ID, kusjuures ei pea tervet teadma, vaid piisab esimestest tähtedest, et Tab-completion õigeni jõuaks.
Järgnevalt navigeerida kataloogi, kus asub fail, mida tahetakse ümber tõsta ja käivitada käsk

cp <kopeeritav fail> /var/lib/docker/aufs/mnt/<konteineri ID>

Enda järelt koristamine

Praegu on kõik teostatud tööd tehtud kooli virtuaalmasinas ning pidev tõmmiste allalaadimine ja loomine ning konteinerite jooksutamine nõuab ressursse, mida alati olla ei pruugi.
Kõik tööle pandud konteinerid on võimalik peatada käsuga

docker stop $(docker ps -a -q)

Kõik tööle pandud konteinerid on võimalik kustutada käsuga

docker rm $(docker ps -a -q)

Kõik allalaetud ja loodud tõmmised on võimalik kustutada käsuga

docker rmi $(docker images -q)

Kokkuvõte

Võrreldes traditsioonilise virtualiseerimisega on konteineritel, nii Dockeri omadel kui ka teistel lahendustel, parasjagu erinevusi ning nende mõistmine aitab aru saada, millises olukorras, mida kasutada. Sarnasustena saab peamiselt esile tuua migreerimisvõimaluse erinevatele riistvaradele, juurkasutaja ligipääsu olemasolu, veebipõhise kaughalduse teostamine ning tagavarakoopiate loomine kasvõi töötavatest instantsidest.[3] Kuna konteinerid võimaldavad luua mitmeid isoleeritud süsteeme, mille aluseks on olemasolev kernel, siis ei ole otsest vajadust mitmeteks mahukateks virtuaalmasinateks, millel on märgatavalt suurem mõju füüsilistele ressurssidele, aga juhul, kui ongi mitmeid erinevaid ja eraldiseisvaid OS-e vaja, siis konteineripõhine lahendus ei suuda neid tingimusi täita.

Konteinerite eelisteks on kordades efektiivsem ressursside kasutus, kuna suhtlus riistvaraga käib otsemat teedpidi. Virtuaalmasinad peavad lisaks guest OS-ile, elik virtuaalmasina OS-ile, pöörduma veel hypervisor poole, mis omakorda suhtleks läbi host OS-i ja sealt riistvaraga. Lühem tee riistvarani tähendab ka ühtlasi, et ühe füüsilise seadme peal on võimalik kasutada mitmetes kümnetes kui mitte sadu konteinereid, kusjuures virtuaalmasinate arv oleks tunduvalt madalam.

Uue instantsi, st uue konteineri või virtuaalmasina, ülesseadmine on ka oluliste erinevustega. Konteinerite ülesseadmise käigus saab kasutada ära üsna väikesemahulisi rakendusi ja tööriistu, mis ei koorma niivõrd riistvara ja tagavad olenevalt olukorrast (st kas on automatiseeritud protsess ja kompaktne konteiner) sekunditega uue instantsi. Virtuaalmasinate puhul tuleb tavaliselt mõelda nii hypervisor tarkvara paigaldamisele, guest OS-ide jaoks litsentside soetamisele, terve OS-i paigaldamisele ja paljule muule sellega kaasnevale. Kuigi virtuaalmasinate loomine on ka suures jaos automatiseeritav, siis sellegipoolest jääb ülesseadmine aeganõudvamaks protsessiks.

Konteinereid kasutades vähendatakse hallatavate OS-ide arvu, kuna kõik konteinerid töötavad ühe jagatud OS-i kerneli najal; toimub migratsioon kiiremini, sest mahud piirduvad megabaitidega, mitte gigabaitidega; lihtsustatakse OS-idel uuenduste tegemist ning palju muud.[4] Otsustades, mida millal kasutusele võtta, tuleks läbi mõelda eelkõige, mida saavutada tahetakse.

Viited