Docker

**Docker** on arvutiprogramm, mis teostab operatsioonisüsteemi tasemel virtualiseerimist ehk konteineriseerimist.

See avaldati 2013. aastal ning seda arendab Docker, Inc. Ettevõte asub San Franciscos California osariigis USA-s. Dockeri tarkvara looja on Solomon Hykes.

Dockerit kasutatakse selliste tarkvarapakettide käivitamiseks, mida nimetatakse konteineriteks (ingl *container*). Konteinerid on üksteisest isoleeritud ja nad komplekteerivad eraldatult vajalikke tööriistu, teeke ja konfiguratsioonifaile. Konteinerid saavad omavahel suhelda väga täpselt määratletud kanalite kaudu.

Kõiki konteinerid käitatakse ühe operatsioonisüsteemi kerneli poolt ja on seetõttu kergemad kui virtuaalarvutid. Konteinereid luuakse tõmmisfailidest, mis on sageli loodud avalikest hoidlatest alla laaditud standardtõmmiste ühendamise ja muutmise teel.

Docker implementeerib kõrgetasemelist API-t, et pakkuda kergekaalulisi konteinereid, mis töötavad eraldi protsessides. Docker on tööriist, mis suudab rakendust ja selle sõltuvusi pakendada virtuaalses konteineris, mida saab käitada mis tahes Linuxi serveris. See aitab kaasa paindlikkusele ja kaasaskantavusele, võimaldades rakendusel käitamise võimalust kas kontori ruumides, avalikus pilves, privaatses pilves jne.

Konteinerite kasutamine võib lihtsustada jaotatud süsteemide loomist, võimaldades mitme rakenduse, töötaja ülesande või muude protsesside käitamist iseseisvalt ühes füüsilises arvutis või mitmes virtuaalarvutis.

## Ajalugu
Solomon Hykes algatas Dockeri Prantsusmaal siseprojektina ettevõttes dotCloud koos teiste arendajate Andrea Luzzardi ja Francois-Xavier Bourlet'ga. Tarkvara sai avalikuks Santa Claras toimunud PyConil 2013. aastal.

Docker avaldati avatud lähtekoodina märtsis 2013.

## Komponendid
Docker kasutab klient-server-arhitektuuri. Dockeri klientrakendus suhtleb Dockeri deemoniga (ingl *daemon*), mis ehitab, käitab ja jagab Dockeri konteinereid. Dockeri klient ja deemon suhtlevad üle REST-API, UNIXi soklite või võrguliideste. Klient-server-rakenduse nimeks on Docker Engine.

Dockeri register hoiustab Dockeri pilte, mis sisaldavad juhiseid konteineri loomiseks. Sageli põhineb pilt mõnel teisel pildil, kuid sisaldab lisaks täiendavat funktsionaalsust. Näiteks võib luua pildi, mis põhineb Ubuntu distributsioonil ning koosneb veel täiendavalt Apache'i veebiserverist ja konfiguratsiooniseadetest. Pildi ehitamiseks tuleb luua Dockerfile, mis kirjeldab vajalikke samme. Dockeri konteiner on käitatav versioon pildist. Seda saab luua, peatada, käivitada, kustutada või muuta kasutades Dockeri API-t või CLI-d.

## Tehnoloogia
Docker on välja töötatud peamiselt Linuxi operatsioonisüsteemi jaoks, kus ta kasutab Linuxi ressursi isoleerimisfunktsioone, nagu kontrollrühmad (cgroups) ja kerneli nimeruume, ning ühisfunktsionaalset failisüsteemi, nagu OverlayFS, et võimaldada sõltumatutel konteineritel töötada ühel Linuxi eksemplaril (ingl *instance*), vältides virtuaalarvutite käivitamise ja hooldamise kulusid.

Docker võimaldab käitada rakendusi isoleeritud keskkonnas, mida nimetatakse konteineriks. Konteinerid on kergekaalulised, sest need ei vaja eraldiseisvat kernelit, vaid kasutavad hostsüsteemi kernelit.

Docker on kirjutatud keeles Go ning kasutab mitut Linuxi kerneli funktsiooni.

Üheks selliseks funktsiooniks on nimeruumid, mis võimaldavad isoleerida konteineri erinevaid kihte. Docker Engine kasutab Linuxis järgmisi nimeruume:

* **pid** – protsesside isoleerimine
* **net** – võrguliideste haldamine
* **ipc** – IPC ressursside haldamine (IPC – InterProcess Communication)
* **mnt** – failisüsteemi *mount*-punktide ehk liitepunktide haldamine
* **uts** – kerneli ja versiooniidentifikaatorite isoleerimine

Teine Linuxi funktsionaalsus on kontrollgrupid (*cgroups*). Kontrollgrupp piirab rakendusele kindla hulga ressursse. Kontrollgrupid võimaldavad Docker Engine’il jagada vabu riistvara ressursse konteineritele ning vajadusel seada piire.

Docker Engine kasutab UnionFS-failisüsteemi, mille tööpõhimõtteks on erinevate kihtide lisamine teineteise peale. Kihid tekivad copy-on-write (CoW) strateegia tõttu, mis tähendab seda, et alumisi kihte ei muudeta, vaid muudetud failid pannakse uuele kihile. Docker Engine kasutab erinevaid UnionFS-i variante, nende seas AUFS, btrfs, vfs ja DeviceMapper.

Docker Engine kombineerib nimeruumid, kontrollrühmad ja UnionFS-i kokku konteinerivormingusse.

Alates versioonist 0.9 sisaldab Docker teeki *libcontainer*, võimaldades sellega omal viisil otseselt kasutada Linuxi kerneli pakutavaid virtualiseerimisrajatisi (*virtualization facilities*). Ehitades Linuxi kerneli virtualiseermisrajatiste peale (peamiselt kontrollgrupp ja nimeruum), ei nõua Dockeri konteiner, erinevalt virtuaalarvutist, eraldiseisvat operatsioonisüsteemi. Selle asemel tugineb see tuuma funktsionaalsusele ning kasutab CPU ja mälu isoleerimist ja eraldiseisvaid nimeruume, et isoleerida rakenduse vaade operatsioonisüsteemist.

Linuxi kerneli toetus nimeruumides suhtes võimaldab isoleerida rakenduse vaate töökeskkonnast (*operating environment*), sealhulgas protsessi puudest, võrgust, privaatsetest kasutajatunnustest ja paigaldatud failisüsteemidest, samal ajal kui kernel kontrollgrupid pakuvad ressursse, mis piiravad mälu ja protsessorit.

### Tööriistad
* **Docker Compose** on loodud mitmest konteinerist koosnevate rakenduste käitamiseks. Compose'i kasutamiseks on vaja luua YAML-fail, kus on võimalik konfigureerida oma rakenduse teenused. Compose'i faili käivitamisel luuakse ja käivitatakse kõik vajalikud konteinerid.
* **Docker Swarm** on tööriist, millega saab mitu arvutit klasterdada üheks parveks. Selle tulemuseks on näiliselt tavaline docker engine, kuid tegelikult paigutab *swarm manager* konteinereid üle klastri. Parve lisatud arvutid võivad olla nii füüsilised kui ka virtuaalsed. Parves olevaid arvuteid nimetatakse sõlmedeks

## Dockeri fail
Dockeri fail on üks Dockeri tehnoloogiast. Dockeri fail (ingl Dockerfile) on üks osa konteinerist koos vajalike tööriistade ja teekidega. Dockeri fail on väiksemahuline tekstidokument ja koosneb tavaliselt 5-st kuni 30 reast. Dockeri fail sisaldab kõiki vajalikke käsklusi Dockeri pildi (image) loomiseks.

## Vaata ka
*Virtualiseerimine
*DevOps

## Viited