Software containers er en relativt ny teknologi som stadig øker i popularitet. Containers kan gi visse fordeler i både devops- og utviklings-kontekst, men landskapet av alternative løsninger kan fort fremstå som noe uoversiktlig. Hvordan begynner man egentlig å bruke containers? I dette innlegget skal vi se på Docker, som er en av de mest populære container-løsningene i skrivende øyeblikk, og hvordan man setter den opp for bruk.

Containers

Containere kan ses på som et lettvekts alternativ til virtuelle maskiner, som kjører kode direkte på din hardware og operativsystem (i et isolert userspace). De lar deg definere alt du trenger for å kjøre en applikasjon eller tjeneste og bruke oppskriften (kalt «image») til å lage nye kopier – for å skalere eller bare for å dele – hvor som helst.

En container er dermed en instanse av et image. Dette kan sammenlignes med objektorienterte konsepter: en container har det samme forholdet til et image som et objekt har til en klasse.

Man kan hente for eksempel Ubuntu ved å kjøre docker pull ubuntu og kjøre en kommando i containeren med docker run ubuntu echo "Hello, World".

Noen fordeler med containers er at de muliggjør:

  • Raskt oppsett av utviklingsmiljø
  • Identiske utviklings- og produksjonsmiljøer (samme OS konfigurasjon)
  • Isolasjon av kode
  • Lett deployment («Build once, run anywhere»)
  • Enkel skalering på cloud/cluster

Et av trekkplasterene ved Containers (vis–à–vis en full VM) er hvor raske de er; På en 2015 MacBook Pro tar kommandoen i forrige avsnitt ca 0.180 sekunder å kjøre – noe som er drastisk raskere enn hva en fullblods VM ville tatt.

Siden Docker er Linuxbasert må det likevel kjøres på en lettvekts VM på OS X og Windows, men standardvalget er ekstremt liten (27MB, booter på ca. 5 sek og kjører fullstendig i RAM), og kjører alle Docker containers.

Setup

OS X

På OS X kan du enkelt installere det som trengs via Homebrew og Cask:

brew cask install dockertoolbox

eller fra Dockers hjemmeside.

Deretter må du enten kjøre Docker Quickstart Terminal (en app som installeres med toolbox), eller kommandoen docker-machine start && eval "$(docker-machine env default)" fra terminalen for å boote opp Dockers VM.

Linux

På Ubuntu Linux kan du kjøre følgende script:

which curl && sudo apt-get update && sudo apt-get install curl && curl -fsSL https://get.docker.com/ | sh

Dersom dette feiler (f.eks. pga. proxybruk) må du kjøre curl -fsSL https://get.docker.com/gpg | sudo apt-key add -som en workaround.

Fremgangsmåten på andre distroer vil være lik, med unntak av apt-get kommandoene (som må byttes ut mot distroens pakkemanager).

Windows

Docker vil kun fungere på 64-bits Windows 7 eller høyere.

Last ned Docker toolbox fra Dockers hjemmeside.

Deretter må du kjøre Docker Quickstart Terminal (et program som installeres med toolbox). Dette vil gi deg et bash-miljø i stedet for det vanlige Windows command prompt.

Hello World

Når alt er ferdig kan du kjøre kommandoen docker run hello-world for å teste at Docker er installert.

Docker vil da:

  • Kontakte Docker-daemonen
  • Hente bildet «hello-world» fra Docker Hub (siden dette ikke finnes lokalt)
  • Lage en ny container fra bildet, som kjører programmet som skriver output
  • Sende output fra programmet til terminalen din.

Offentlig tilgjengelige images kan finnes på Docker Hub.

For å se alle images som finnes på din maskin kan du kjøre docker images.

Å lage sitt eget miljø

Lag en mappe for ditt prosjekt:

mkdir prosjekt && cd prosjekt

Denne mappen vil inneholde alt ditt image trenger.

Lagre så en fil som heter Dockerfile ved hjelp av din teksteditor, som inneholder følgende tekst:

FROM php:latest

CMD php -r 'echo "SUCCESS\n";'

Nå kan du bygge ditt image ved å skrive docker build -t testprosjekt . i terminalen. Deretter kan du kjøre den resulterende containeren via docker run testprosjekt.

Du har nå satt opp en enkel Docker-container; Neste skritt for utviklingsmiljøer vil typisk være å håndtere containerens data og å koble containere på nettverket.

Senere vil man kanksje også bruke Vagrant for å håndtere sine Docker images.

Les mer på Dockers brukerguide.