Váš vlastní registr Docker image v Azure

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.

Proč mít vlastní registr pro kontejnerové obrazy

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í.

Azure Container Registry

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.

Service Principal

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

Credential helper pro Docker

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.

Použití Azure Container Registry s Kubernetes

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.

 



Nekonečně velký Docker hostitel: Azure Container Instances Kontejnery