- Praktický úvod do Docker a kontejnerů (1) – od instalace po první kontejnery
- Praktický úvod do Docker a kontejnerů (2) – propojování
- Praktický úvod do Docker a kontejnerů (3) – víc najednou aneb něco užitečného s Docker Compose
- Praktický úvod do Docker a kontejnerů (4) – jak z nich získat maximum
- Praktický úvod do Docker a kontejnerů (5) – Docker Machine
- Praktický úvod do Docker a kontejnerů (6) – cluster hostitelů s Docker Swarm
- Praktický úvod do Docker a kontejnerů (7) – scheduler v Docker Swarm
- Praktický úvod do Docker a kontejnerů (8) – váš vlastní registr obrazů
- Praktický úvod do Docker a kontejnerů (9) – multi-host networking
- Praktický úvod do Docker a kontejnerů (10) – Windows kontejnery s Docker API
- Praktický úvod do Docker a kontejnerů (11) – Windows kontejnery s PowerShell
- Praktický úvod do Docker a kontejnerů (12) – Windows Hyper-V kontejner
- Praktický úvod do Docker a kontejnerů (13) – Swarm mode, service, balancing, scaling (v1.12)
Zatím jsme v našem seriálu stahovali a ukládali image našich kontejnerů ve veřejném prostoru Docker Hub. To je samozřejmě perfektní pro stahování známých obrazů jako jsou Ubuntu nebo MySQL a ukládání a sdílení výsledků vaší práce v open source světě. Ale je to vhodné pro vaše enterprise aplikace s unikátní přidanou hodnotou, vlastním kódem či (a to je tedy u image špatně) daty? Asi ne…
Proč mít vlastní registr
Prvním důvodem je samozřejmě bezpečnost. Pokud používáte Docker pro svoje aplikace, jistě obsahují něco vašeho – minimálně byznys logiku, tedy kód. Pokud používáte kontejnery správě, tak v nich nejsou citlivé údaje typu data, přihlašovací údaje do dalších služeb jako je vaše databáze, ani nic podobného (toto předáváte environmentální proměnnou teprve v okamžiku spuštění kontejneru tak, jak jsme to už v seriálu dělali, a dostupnost služeb možná objevujete systémem jako je Consul, o kterém ještě bude řeč). Přesto – i samotný kód je duševní vlastnictví, které nechcete předávat konkurenci. Možná není nic tajného v tom, jak máte nastaveno MySQL, MongoDB, Cassandru, Apache nebo Neo4J a jestli používáte Node.JS, Golang, Python, Ruby on Rails nebo Javu – ale algoritmus jakým optimalizujete objednávky, výrobu, jak ukládáte a vyhodnocujete data, to jsou citlivé věci. Docker vám nabízí placený zabezpečený prostor nebo si registr můžete postavit přímo u sebe, uvnitř vašeho prostředí.
Dalším důvodem může být optimalizace provozu. I pokud máte Swarm cluster, jednotlivé vrstvy obrazů se stahují do lokálních nodů pokaždé, když se kotejner pustí (a obrazy tam ještě nejsou). Záleží na vašem způsobu práce jak moc to vadí nebo ne. Ideální je, pokud váš vývojovod (můj pokus o počeštění a polidštění slova Continuous Integration / Continuous Deployment pipeline), má na vstupu přímo zdrojový kód. Ten se zkompiluje, založí se kontejner, do něj se natáhnou návaznosti jako jsou balíčky, knihovny, moduly a pak se kontejner rozjede v prostředí (takto se chová Platform as a Service, například open source HPE Helion Cloud Foundry s certifikovanou přenositelností mezi výrobci a nad tím postavené HPE Helion Stackato nebo HPE Helion Development Platform) – nad tím se třeba spustí testy (například z Chefu). Je ale možné, že PaaS nepoužíváte a v rámci CI/CD si sami sestavujete kontejner přes Dockerfile a ten uploadujete do registru. Následně jiný proces (to celé je orchestrováno třeba přes HPE Codar + Jenkins) stáhne obraz, nastartuje a začne testy (a ideálně při jejich úspěšném složení šoupne do produkce). V takovém případě asi není ideální image posílat stále na Internet a zpět (i když u Dockeru jsou velmi malé, protože základní vrstvy měnit kvůli aplikaci asi nebudeme). Vezměme v úvahu, že v rámci Continuous Integration tohle proběhne při každém commitu, tedy i u menšího týmu ve stovkách denně.
Vlastní registr
Následující návod není “enterprise”, protože nebudeme řešit zabezpečení certifikátem. Není to nic složitého a Docker dokumentace je v tomto ohledu velmi dobrá – pokud to myslíte vážně, určitě si vygenerujte platné certifikáty ve vaší firemní CA. Navíc registr umožňuje řídit přístup, tedy zajistit přihlašování jménem a heslem. My si teď pohrajeme s verzí bez TLS šifrování a bez přihlašování.
Registr, tedy software, který je za něj odpovědný, je k dispozici v hotovém kontejneru (což je samozřejmě velmi příjemné). Vytvořme si tedy Docker hostitele za použití docker-machine a VirtualBox.
docker-machine create -d virtualbox reg
Načtěte si do environmentálních proměnných údaje pro docker klienta.
docker-machine env reg export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://192.168.99.100:2376" export DOCKER_CERT_PATH="C:\Users\kubicat\.docker\machine\machines\reg" export DOCKER_MACHINE_NAME="reg" # Run this command to configure your shell: # eval "$(docker-machine env reg)" set DOCKER_HOST=tcp://192.168.99.100:2376 set DOCKER_CERT_PATH=C:\Users\kubicat\.docker\machine\machines\reg set DOCKER_TLS_VERIFY=1
Teď už stačí jen spustit kontejner z hotového image “registry”. Potřebujeme, aby port 5000 uvnitř kontejneru byl vidět ven, tedy byl dostupný na IP hostitele. Dále chceme použít volume, tedy namapovat konkrétní adresář hostitele do prostoru kontejneru, kde se budou ukládat diskové obrazy (není to nutné, ale chceme mít přehled).
docker run -d -p 5000:5000 --name mujreg -v /home/docker/data:/var/lib/registry registry:2
Pojďme teď přímo v tomto hostiteli stáhnout nějaký image, třeba Ubuntu.
docker pull ubuntu
Perfektní. Teď tomuto obrazu dáme nový tag, který ho namíří do našeho lokálního repozitáře a provedeme push, tedy samotné nahrání.
docker tag ubuntu localhost:5000/mujos docker push localhost:5000/mujos The push refers to a repository [localhost:5000/mujos] (len: 1) Sending image list Pushing repository localhost:5000/mujos (1 tags) 0bf056161913: Image successfully pushed ================================> ] 196.6 MB/196.8 MB 1796d1c62d0c: Image successfully pushed ================================> ] 207.4 kB/208.9 kB e24428725dd6: Image successfully pushed =================================>] 4.608 kB/4.608 kB 89d5d8e8bafb: Image successfully pushed =================================>] 1.024 kB/1.024 kB Pushing tag for rev [89d5d8e8bafb] on {http://localhost:5000/v1/repositories/mujos/tags/latest}
Když se teď podíváme do našeho adresáře v hostiteli, uvidíme souborový systém s uloženými vrstvami.
docker-machine ssh reg ## . ## ## ## == ## ## ## ## ## === /"""""""""""""""""\___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~ \______ o __/ \ \ __/ \____\_______/ _ _ ____ _ _ | |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __ | '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__| | |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ | |_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_| Boot2Docker version 1.9.1, build master : cef800b - Fri Nov 20 19:33:59 UTC 2015 Docker version 1.9.1, build a34a1d5 docker@reg:~$ ls data/docker/registry/v2/repositories/mujos/_layers/sha256/ 6edcc89ed412d17fc5d20cd8dbc9b672256afa7aa1b7feafb1578a0251bdef7c/ a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4/ bdf37643ee248c8b2f44d893eed0a28b9cd318437aae78f7e4cd3437c1ee1a03/ ea0211d47051cc717adf037a6caf54ac77a1c7367e3c52e899e582a848543b71/ docker@reg:~$ exit
Zkusme teď do registru přistoupit z jiného hostitele. V našem případě jsme nezajistili platný certifikát, takže se uchýlíme k jednoduché HTTP komunikaci (což v praxi nepoužívejme, ale pro učení se, proč ne). Musíme vyplnit příslušnou volbu v DOCKER_OPTS v rámci konfiguračního souboru samotného docker démona. Naštěstí ale docker-machine podporuje předání patřičné volby přímo při vzniku hostitele, takže to máme opravdu jednoduché – stačí uvést, které registry budou používány nezabezpečeně.
docker-machine create -d virtualbox --engine-insecure-registry 192.168.99.100:5000 host
Načtěte si proměnné pro docker klienta.
docker-machine env host export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://192.168.99.101:2376" export DOCKER_CERT_PATH="C:\Users\kubicat\.docker\machine\machines\host" export DOCKER_MACHINE_NAME="host" # Run this command to configure your shell: # eval "$(docker-machine env host)" set DOCKER_HOST=tcp://192.168.99.101:2376 set DOCKER_CERT_PATH=C:\Users\kubicat\.docker\machine\machines\host
Máme nějaké diskové obrazy v tomto hostiteli?
docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
Napravíme to a stáhneme si obraz mujos z našeho vlastního repozitáře.
docker pull 192.168.99.100:5000/mujos Using default tag: latest latest: Pulling from mujos 0bf056161913: Pull complete ================================================>] 65.67 MB/65.67 MBB 1796d1c62d0c: Pull complete ================================================>] 71.48 kB/71.48 kBB e24428725dd6: Pull complete ================================================>] 681 B/681 BB 89d5d8e8bafb: Pull complete ================================================>] 32 B/32 BB Digest: sha256:6193229a4644f7758b2581b9aca8642e5513a72046cee0ed7dccc8568546bc94 Status: Downloaded newer image for 192.168.99.100:5000/mujos:latest docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE 192.168.99.100:5000/mujos latest 89d5d8e8bafb 3 weeks ago 187.9 MB
Tak to vidíte, nic složitého.