Docker

En kaotisk presentation...

Översikt

  • Koncept
    • Virtuell maskin
    • Docker
  • Installation
  • Image-filer
  • Volymer
  • Compose

Virtuell maskin?

Varje docker container körs med en distribution i botten och har en egen uppsättning av libraries och verktyg som bash och ls.

Den kan startas och stoppas.

Det låter som en virtuell maskin.

Nej.

Docker är inte en virtuell maskin.

En virtuell brukar fungera ungefär så här:

  • Program uppdateras.
  • Konfigurationsfiler skrivs och ändras.
  • Cache-filer skapas.
  • Log-filer utökas.
  • Data manipuleras av program.
  • Admins ändrar saker utan dokumentation och spårbarhet.

På en virtuell maskin körs ofta flera program eller processer som interagerar med varandra.

Dom delar filsystem, konfigurationsfiler och libraries.

Installera caddy, PHP och PostgreSQL från distron.

Easy!

Nu kräver chefen att legacy-siten www.bar.com minsann ska driftas här.

You. Fucking. Bastard.

Köra PHP 5.0.4 på Debian 13?

add-apt-repository ppa:ondrej/php
apt-get update
apt-get install php5.0.4
Vem är ondrej?
Kommer ondrej att hacka min server?
En framtid av apt-kollisioner, yes!

Köra PostgreSQL 9 via distro-paket som kräver äldre libc?

Uäääk...

Docker

Ok, fuck you, dissa mina VPS:er då.

Så... docker fixar det här?

  • En docker image bör bara innehålla vad den behöver för en så liten och väldefinierad funktion som möjligt.

    … såsom en webserver, databasserver eller compile-miljö med dependencies.

  • Varje docker image har en version.

    Det är bara att ändra en siffra för att byta.

  • Varje image kan sparas och säkerställa en viss uppsättning dependencies.
  • Varje docker container körs som en hel distro med egna libs.
  • Data ligger separerad från program i volymer.

    … och dessa kan kopplas till flera containers samtidigt.

  • Docker körs med SDN, Software Defined Network.
    Möjlighet till högre separation mellan olika tjänster på samma maskin.

Ja ja...

GET ON WITH IT!

Installationsdags!

https://docs.docker.com/engine/install/

Alltid trevligt att ha:

  • docker compose plugin (v2)
  • docker buildx plugin

Image-filer

Allting i docker startar med...

Dockerfile

Ett recept för att bygga en image.
> $EDITOR Dockerfile
							
								# Vi startar från en liten Debian-image på runt 120 MiB.
								FROM debian:13

								# Ett kommando exekveras när en docker-instans startas.
								CMD ["/bin/echo", "Hello, World!"]
							
						
Den byggs med:
> docker build -t hello:1 .
Och körs med:
> docker run --rm --name hello hello:1
Dockerfile
							
								# Vi startar från en liten Debian-image på runt 120 MiB.
								FROM debian:13

								# Installation av caddy webserver.
								RUN \
									apt update && \
									apt install -y caddy micro

								# Konfigurationen för Caddy.
								COPY etc/caddy/ /etc/caddy/

								# Siten caddy ska leverera.
								COPY srv/ /srv/

								# Inte nödvändigt, men hjälpsamt.
								EXPOSE 5000/tcp
								 
								# Ett kommando exekveras när en docker-instans startas.
								CMD ["/usr/bin/caddy", "run", "--config", "/etc/caddy/Caddyfile"]
							
						

							> docker run --detach --name foo -p 5000:5000 foo:2
							> curl http://127.0.0.1:5000/
							Hello, World!
						
Ändra i siten:

								> docker exec -it foo micro /srv/site/index.html
								> curl http://127.0.0.1:5000/
								Something else!
							
Starta om instansen:

								> docker stop foo
								> docker start foo
								> curl http://127.0.0.1:5000/
								Something else!
							
Skapa en ny instans:

								> docker stop foo
								> docker rm foo
								> docker run --detach --name foo -p 5000:5000 foo:2
								> curl http://127.0.0.1:5000/
								Hello, World!
							
That sucks...

Volymer

Sparar data utanför docker-instanser.

Volumer är namngivna och sparas som standard i
/var/lib/docker/volumes/<name>/_data/

Skapa en med
> docker volume create humhum
Anslut till en docker-instans med
> docker run --name foo -v humhum:/srv/site foo:2

Compose

För tillfällen då en tjänst behöver flera docker-baserade tjänster såsom en webserver, en PHP-installation samt en databasserver.
							
								volumes:
								  website:
								  database:

								services:
								  # Vår fina caddy-image från tidigare.
								  webservice:
								    image: foo:2
								    
								    volumes:
								      - website:/srv/site

								    ports:
								      - 80:80
								      - 443:443

								  # Vår tjänst använder helt plötsligt PostgreSQL.
								  postgresql:
								    image: postgres:17

								    volumes:
								      - database:/var/lib/postgresql/data

								    environment:
								      POSTGRES_PASSWORD: bf06f69c9b9fca709cf3eca751cfcd29
							
						
Docker-instansen "webservice" kan använda "postgresql" som hostname då docker compose sätter upp name resolution.
Skapar och startar alla services:
> docker compose up
down stoppar och raderar instanser:
> docker compose down
start och stop startar och stoppar instanser:
> docker compose start
> docker compose stop
restart utför stop och start på instanserna:
> docker compose restart
docker compose up stannar i foreground och visar loggar. Avslutar man den med ctrl+c stoppas alla instanser.

Ofta är det av intresse att istället starta instanser detached och visa loggar med logs (-f för follow) och kunna avbryta den och ändå ha instanserna igång.

> docker compose up --detach && docker compose logs -f
🍺 Ugh. Dags att hämta en öl... 🍺