Pokud si hrajete s kontejnery, určitě používáte Docker Hub - veřejný registr obrazů. Nicméně jakmile se z kontejnerů stane součást vašeho IT určitě budete potřebovat svůj vlastní a to hlavně z bezpečnostních důvodů. Víte, že takový vlastní registr získáte v Azure na kliknutí? A že přihlašování k němu můžete svázat s účty v Azure Active Directory? Vyzkoušejme si to.
Důvodů je poměrně dost. Developer si rád sáhne po hotovém obrazu a nepátrá, co je vlastně uvnitř. To si při reálném provozu těžko můžeme dovolit - potřebujeme mít jistotu, že v obrazu nění žádný malware, že odpovídá bezpečnostním standardům naší firmy a našeho trhu či státu a tak podobně. Kromě toho se v obrazu může nacházet náš vlastní kód, který je duševním vlastnictvím firmy. No a také chceme předejít tomu, že si při testování aplikací lidé zvyknou na veřejný repozitář a omylem tam pošlou image kontejneru, kde už jsou zapsána citlivá data našich klientů z aplikace, kterou zkoušeli.
Důvodů pro vlastní registr je tedy dost a v Azure ho získáte doslova na kliknutí.
Dobrá zpráva - tato služba je pro vás zdarma, respektive platíte pouze za obsazenou storage. Navíc je integrovaná se systémem identit Azure Active Directory.
Nejprve založte nový registr.
Dejte globálně platné jméno. Ve výchozím stavu je povolen pouze přístup přes svět Azure AD, nicméně protentokrát jsem povolil i admin uživatele (jednoho jednoduchého uživatele pro přístup, ale v praxi bych nepoužíval - každý uživatel i Jenkins a podobné automatizátory by měli mít svůj přístup).
Po pár vteřinách je náš registr připraven.
Vyzkoušejme nejprve jednoduše integrovaný účet. Nejdřív ve svém Ubuntu s Dockerem stáhnu z veřejného repozitáře image busybox.
tomas@jump:~$ docker pull busybox Using default tag: latest latest: Pulling from library/busybox 27144aa8f1b9: Pull complete Digest: sha256:be3c11fdba7cfe299214e46edc642e09514dbb9bbefcd0d3836c05a1e0cd0642 Status: Downloaded newer image for busybox:latest
Teď se naloguji do našeho privátního Azure registru. Jméno a heslo (nezkoušejte ho, hned po napsání článku jsem vygeneroval jiné) najdete v GUI.
Zalogujte se do registru.
tomas@jump:~$ docker login -u registr -p =+/0A+bGZHI1+Rbo2=oG/xvDoKHTKWp3 registr.azurecr.io Login Succeeded
Teď si vezmu image busybox a přepíšu jej do svého registru a použiji push, čímž se nahraje do Azure.
tomas@jump:~$ docker tag busybox registr.azurecr.io/mujbusybox tomas@jump:~$ docker push registr.azurecr.io/mujbusybox The push refers to a repository [registr.azurecr.io/mujbusybox] 3a1dff9afffd: Pushed latest: digest: sha256:be3c11fdba7cfe299214e46edc642e09514dbb9bbefcd0d3836c05a1e0cd0642 size: 527
Podívejte se do GUI, určitě tam bude.
Druhou možností pro přihlašování je použít servisního principála, tedy v Azure AD k vašemu účtu vytvořit aplikaci. Pro zjednodušení to berme jako vytvoření separátního jména a hesla pod vaším Azure AD účtem.
Jděte do Azure AD a přidejte aplikaci.
Application ID berte jako uživatelské jméno.
Jako heslo bude Key - ten si vygenerujte.
Jděte v GUI k vašemu registru a najdeme si nastavení přístupových práv.
Přidejte aplikaci registr jako vlastníka (ale můžete také vytvořit přístup pouze pro čtení, vhodné třeba pro roboty v rámci CI/CD apod.).
Zkuste se přihlásit účtem principála v Dockeru do vašeho repozitáře.
tomas@jump:~$ docker login registr.azurecr.io -u 1b8d4fd9-3808-4371-a35e-06f5dc6d1e94 Password: Login Succeeded
V Dockeru při logování do registru existuje koncept credential helperu, tedy svázání s jiným procesem přihlašování. Aktuálně Azure podporuje toto řešení pro statický účet - tím, že jste přihlášeni v Azure CLI můžete i do Dockeru (na pozadí pro něj CLI získá onen admin login).
Nainstalujte credential helper pro Docker.
curl -L https://aka.ms/acr/installaad/bash | sudo /bin/bash
Zrušte předchozí login a podívejte se do souboru, kam Docker zaznamenává přístupy do registrů.
tomas@jump:~$ docker logout registr.azurecr.io Removing login credentials for registr.azurecr.io tomas@jump:~$ cat .docker/config.json { "auths": {}, "credsStore": "acr-linux" }
Použijte Azure CLI 2.0 k přihlášení Dockeru, místo klasického docker login.
tomas@jump:~$ az acr login -n registr AAD authentication failed with message: Registry 'registr.azurecr.io' does not support AAD login. Login Succeeded
Protože jste přihlášeni v Azure CLI, to vás nalogovalo do Dockeru (tedy nemuseli jste kopírovat klíč pro admin heslo, to pro vás udělalo CLI). Můžete rovnou stahovat bez docker login. Aktuální verze udělá to, že administrátorské jméno a heslo poskytne přímo Dockeru tak, že uživatel ho nevidí. Tzn. kdo má přístup do registru v rámci svého Azure loginu (a je tedy přihlášen tímto do Azure CLI) se dostane i na registr, ale heslo nezná.
Soudě podle informací na GitHub projektu pro ACR helper se pracuje i na přímé integraci helperu do Azure Active Directory bez nutnosti používat Azure CLI, nicméně pokud správně rozumím jsou tam aktuálně limity na straně Docker login procesu. Jde o to, že Azure AD může používat velmi robustní režim přihlášení včetně dvoufaktorové autentizace a zatím není cesta jak docker login může iniciovat takto komplexní přihlášení. Uvidíme kam se to posune, každopádně už dnes můžete použít login přes jméno a heslo, využít service principal pro každého právoplatného uživatele (včetně podpory read only přístupu například pro Jenkins) nebo integrovat docker login s Azure CLI.
Registr obrazů můžete samozřejmě použít i v rámci Kubernetes. Tam to typicky funguje tak, že clusteru uložíte přístupové údaje do vašeho registru přes object Secret. To udeláme takhle:
kubectl create secret docker-registry mujregistr --docker-server registr.azurecr.io --docker-username registr --docker-password sq+f3/+fN22/lOR/+H4NbJYuWXimoIVY --docker-email cokoli@tomaskubica.cz
Následně při definici například podu použijeme obraz z našeho registru a přidáme informaci o tom, který secret má Kubernetes při stahování image použít.
apiVersion: v1 kind: Pod metadata: name: mujtest spec: containers: - name: mujtestkontejner image: registr.azurecr.io/mujbusybox command: ["/bin/sh"] args: ["-c", "while true; do echo hello; sleep 10;done"] imagePullSecrets: - name: mujregistr
Pak už jen pod spustíte a ujistíte se, že všechno funguje.
kubectl create -f mujtest.yaml tomas@jump:~$ kubectl get pods NAME READY STATUS RESTARTS AGE mujtest 1/1 Running 0 5s
Mít vlastní registr Docker image dává smysl zejména pokud to s kontejnery myslíte vážně. Služba Azure Container Registry je výborný doplněk k Azure Container Service, ale můžete ji samozřejmě využít i samostatně v rámci jakéhokoli vašeho Docker prostředí - z on premises i v cloudu.