Docker för Windows

Docker logotyp

Docker har fortsatt vind i seglen och har snart tagit sig in i var utvecklares miljö. Att Docker fungerar ypperligt i *nix är allmänt erkänt, men hur är det egentligen med Windows-stödet?

Få upp miljön

För de som har en version av Windows med Hyper-V går det hela tämligen smärtfritt. Det är i princip bara att ladda ner och installera Docker for Windows. Hyper-V finns med i Windows Server 2008 och uppåt samt Business/Enterprise versioner av Windows 8 och nyare.

Är man inte lika lyckligt lottad så finns Docker Toolbox. Den största skillnaden är att Toolbox inkluderar en Virtual Machine i form av VirtualBox.

Hitta rätt IP-adress

När Docker-hosten (MobyLinuxVM) startar upp konfiguerar den en egen virtuell Ethernet Adapter (DockerNAT) med tillhörande IP-adress. Det är dock inte denna IP-adress som är den man nyttjar för att t.ex. surfa till sin webbapplikation deployad i en Docker-container. Istället ansluter man mot den virtuella adaptern konfigurerad av t.ex. Hyper-V då det är där inne Docker-hosten bor. Nedan skärmbild visar hur det kan se ut. Den orange boxen runt översta IP-adressen markerar vilken IP man ska ansluta mot utanför containern.

Ipconfig

Exponera portar

Denna punkt är starkt kopplad till den föregående. Vi vet vilken adress vi ska ansluta till, men det fungerar ändå inte. Troligen har man då glömt att lägga med en forward till den port man vill kommunicera på, t.ex. 8080 för en klassisk Java webapplikation. Detta löses genom -p parametern vid uppstart, t.ex.

docker run -p 8080:8080 -t spring-boot-docker-example

Kommandot säger att vi ska binda port 8080 i hosten mot 8080 i containern. Default är nämligen alla portar endast tillgängliga inom det interna Docker-nätverket.

Ändringar slår inte igenom

Nog har vi alla mer än en gång råkat ut för klassikern där våra ändringar vägrar slå igenom. Förr var det oftast någon Maven cache som ställde till det, nu kan det även vara något så enkelt som att Dockerimagen inte är uppdaterad. Det är tyvärr alldeles för lätt att glömma. Gradle build samt Maven install sitter i ryggmärgen på de flesta numera, men docker build . -t my-precious den är ännu relativt ny. Turligt nog finns det plugins till både Gradle och Maven för att bygga om Dockerimagen.

Hantera flera containers

Ganska snart efter att man kommit igång med Docker uppstår behovet av att flera separata containers för att hantera olika aspekter av sin utvecklingsmiljö t.ex. applikation, databas och message broker. För att konfigurera dessa tillsammans nyttjas docker-compose. Det enda man behöver göra är att skapa en docker-compose.yml fil där man beskriver var och en av de olika servicarna enligt ett fördefinierat schema. En trevlig detalj är att det är möjligt att peka ut publika images såväl som egna lokala byggen.

När man startar sina containers från en och samma docker-compose får man en hel del fördelar. Bl.a.

  • Alla containers startar tillsammans
  • Alla containers hamnar i samma virtuella nätverk
  • Alla containers kan ansluta mot varanda givet ‘service name’ definierat i docker-compose.yml

Exempel:

services:
  queue:
    image: 'rabbitmq:3.6.12'
    ...
  my-webapp:
    build: my-webapp/
    ...

I denna konfiguration plockas rabbitmq image version 3.6.12 hem från det publika repositoriet medans my-webapp ligger i subkatalogen “my-webapp” och byggs lokalt. Vidare kan my-webapp ansluta mot RabbitMQ genom att ange ‘queue’ som hostname i sin JMS-konfiguration. En småsak kan tyckas, men något som underlättar då konfigurationen blir den samma för alla utvecklare i projektet.

Mappa kataloger

Att lyckas mappa in Windows kataloger in i Dockercontainern kan till en början vara en riktig huvudvärk. Det första som man behöver säkra är att den hårddisk man önskar mappa en katalog ifrån ligger med som en “Shared Drive” i Docker. För att säkra detta:

  1. Högerklicka på “valen” när containern är igång
  2. Klicka på “Settings”
  3. Klicka på “Shared Drives”
  4. Se till att den eller de diskar ni önskar dela är ibockade.
  5. Klicka på “Apply”
  6. Starta om Docker for Windows för att vara säker på att ändringen biter.

Efter det är gjort är vår rekommendation att använda sig av ‘volumes’ funktionen i docker-compose.yml. Den fungerar i särklass bäst av de alternativ vi försökt oss på. Lägg till följande under er service:

volumes
      - <absolut sökväg till katalog>:<katalog i containern>
t.ex.
      C:\se\exertusit\demo:/demo

Observera att det är det klassiska Windows-formatet som gäller med \ och inte *nix stuket (/).

Sammanfattning

Ovan tips är baserade på våra egna erfarenheter av att komma igång med Docker i Windows 10. Hoppas att de kommer er till nytta! För den som vill förkovra sig ytterligare rekommenderas Dockers officiella dokumentation.