Hantera Docker-maskiner i Azure från fler datorer

Nyligen skapade jag lite docker maskiner i Azure via Azure Cloud Shell som är den webbaserade konsolen som man kommer åt via Azureportalen direkt. Fördelen med Cloud Shell är att man snabbt får tillgång till Azure CLI samt docker-kommandon. När Cloud shell startas så skapas ett storage account (om detta inte redan finns) för att lagra användarens hemkatalog där personliga filer såsom certifikat och autentiseringsuppgifter sparas (detta är viktigt längre fram).

Docker-maskinen skapades på vanligt sätt:
sub=$(az account show --query "id" -o tsv)

Följande kommando tar reda på vårt subscription id och sparar det i variabeln $sub

docker-machine create --driver azure --azure-ssh-user superuser --azure-subscription-id $sub --azure-open-port 80 --azure-image "Canonical:UbuntuServer:16.04.0-LTS:latest" --azure-location "westeurope" --azure-resource-group "DockerResurs" --azure-availability-set "docker-avset" --azure-static-public-ip --azure-size "Standard_A1_v2" "dockervm"

Följande kommando skapar en Docker-maskin med namnet dockervm i Azure som bygger på Ubuntu 16.04 och sparas i resursgruppen DockerResurs, användarnamn Superuser mm.

För att ta reda på anslutningsinställningarna så körs kommandot:
docker-machine env dockervm --shell bash
OBS vi måste ange --shell bash explicit för att få en vettig output

För att ändra miljövariablerna i bash så att vi kan ansluta till maskinen och hantera den med docker-machine kommandot så kör vi kommandot:
eval $(docker-machine env dockervm –-shell bash)

När detta är gjort så kan vi enkelt hantera vår Docker-maskin med kommandot docker-machine samt skapa containers mm. med dockerkommandot.

Vi kan enkelt kontrollera åtkomst till maskinen/maskinerna med följande kommando:
docker-machine ls
Vilket borde ge följande resultat

 

Så långt inget konstigt. Nu till det verkligt intressanta! Hur gör vi ifall vi behöver delegera eller dela åtkomst och administration till Docker-maskiner? Säg mellan olika administratörer eller utvecklare? 
Problemet är att de certifikat som genereras samt autentiseringsuppgifterna som används är personliga och genereras i samband med skapandet av Docker-maskinen. Dessa filer återfinns i användarens hemkatalog/profil, /home/user/.docker/machine (Linux) respektive C:\Users\user\.docker\machine (Windows).

 
 

Man leds lätt till att tro att det skulle finnas ett kommando likt ”docker-machine export/import” eller ”docker-machine connect”. Det visar sig dock att detta inte finns (December 2017). Det är en efterfrågad funktion som dyker upp redan 2016 på Dockers forum och fram till idag. Flera användare vill ha funktionen medan andra tycker att det onödigt eller till och med dumt då det strider mot gängse bruk av certifikat och autentiseringsuppgifter. Det finns dock vaga löften på Dockers forum om att en sådan funktion ska införas. Tills vidare så får vi lösa problemet själva. 

Det finns varianter på hur man kan överföra certifikat och credentials mellan maskiner för att sedan ansluta till sin Docker-maskin med docker-machine kommandot. Eftersom alla varianter kräver åtkomst till de certifikat som genereras så väljer vi att helt enkelt kopiera alla filer som behövs. 

1. Ändra aktuell mapp till mappen för alla Docker-inställningar
cd ~/.docker/machine

2. Komprimera alla mappar och undermappar samt filer till en komprimerad fil (docker-settings.tar.gz)
tar -zcvf docker-settings.tar.gz ./*

 
 

3. Nu när vi har allt samlat i en fil blir nästa steg att kopiera denna till den dator/användare som vi önskar använda för att hantera vår Docker-maskin i Azure. Vi kan överföra filen via FTP eller andra tjänster. Jag väljer här att använda Secure Copy, scp kommandot som överför filer via SSH. Detta kräver dock att vi har tillgång till en SSH-server (OpenSSH-Server finns nu som beta till Windows 10 och tillgänglig via Windows-inställningar – Appar och Funktioner – Hantera Valfria funktioner).
scp docker-settings.tar.gz username@1.2.3.4:/mapp
Kommandot kopierar den lokala filen docker-settings.tar.gz till SSH-servern med IP-numret 1.2.3.4 och ansluter med användarnamnet username


4. När vi väl kopierat filen till den dator som vi ämnar använda så är det bara att extrahera filerna till rätt mapp i aktuell användares profil (vi använder en Windows-maskin i detta exempel). OBS vi behöver (givetvis) installera Docker på den dator som vi ska använda för få tillgång till docker-machine och docker kommandona.

 

 

I detta exempel så heter användaren Jesper
5. När vi fått filerna på plats så återstår ”bara” att editera konfigurationsfilen config.json som återfinns i C:\Users\Jesper\.docker\machine\machines\dockervm\

 

 

Det går bra med valfritexteditor såsom notepad eller liknande. I exemplet används Notepad++
6. Vi måste ändra alla sökvägar som refererar till certifikat och autentiseringar (i princip alla sökvägar, se bild)

 

Sök på ”/home/Jesper/.docker/machine/” och ersätt med ”c:\\Users\\Jesper\\.docker\\machine\\” så ändras det mesta (men inte allt). När vi fixat till allt så är det bara att spara filen. 

7. Om alla filer ligger på rätt ställe och sökvägarna stämmer så ska allt fungera!
Kontrollera genom att starta kommandotolken och kör kommandot
docker-machine ls

Vi bör då se samma resultat som via Cloud Shell tidigare
Är det flera användare som av olika anledningar behöver dela på flera Docker-maskiner så skulle man kunna lösa detta med folder redirection för dessa användare så att de kommer åt varandras maskiner alltid. Man bör dock överväga säkerhetsproblematiken i detta. Hantera alltid certifikat på lämpligt sätt och se till så att det finns backup på dessa.