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.
Docker är inte en virtuell maskin.
En virtuell brukar fungera ungefär så här:
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.
Köra PHP 5.0.4 på Debian 13?
add-apt-repository ppa:ondrej/php apt-get update apt-get install php5.0.4
Köra PostgreSQL 9 via distro-paket som kräver äldre libc?
Uäääk...
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.
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.
> $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!"]
> docker build -t hello:1 .
> docker run --rm --name hello hello:1
# 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!
> docker exec -it foo micro /srv/site/index.html
> curl http://127.0.0.1:5000/
Something else!
> docker stop foo
> docker start foo
> curl http://127.0.0.1:5000/
Something else!
> 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!
Volumer är namngivna och sparas som standard i
/var/lib/docker/volumes/<name>/_data/
> docker volume create humhum
> docker run --name foo -v humhum:/srv/site foo:2
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 compose up
> docker compose down
> docker compose start
> docker compose stop
> docker compose restart
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