# Docker, allmänt

Den här sidan bör brytas ut i flera. Det var första skrivan jag skrev om docker allmänt.

Jag kör Docker på Ubuntu-VMs.

Installera på Ubuntu-server med `sudo apt  install docker.io`.  
För att kunna slå `buildx`, `sudo apt install docker-buildx`.  
Docker compose är att sätt att enkelt köra docker-images. Installera med `sudo apt-get install docker-compose-v2`.

## Docker compose

Det går att starta containrar enligt specifiserade värden i en Docker compose fil.

<table border="1" id="bkmrk-v%C3%A4rde-f%C3%B6rklaring-con"><colgroup><col></col><col></col></colgroup><tbody><tr><td>Värde  
</td><td>Förklaring  
</td></tr><tr><td>container\_name</td><td>Specifisera ett namn för containern. Blir bättre för det mänskliga ögat när en container ex. ska stängas av  
</td></tr><tr><td>restart: always, restart: unless-stopped</td><td>Så att containers alltid startar vid boot av VM alternativt om de inte har stoppats manuellt</td></tr></tbody></table>

## Networking

### Ta bort nätverk

```
 docker network rm NETWORK-NAME
```

### Aktivera IPv6

För att Docker ska ha IPv6 stöd måste filen `/etc/docker/daemon.json` skapas. Se exempelkonfiguration nedanför.

```
{
        "userland-proxy": false,
        "ipv6": true,
        "ip6tables": true,
        "fixed-cidr-v6": "fd00:1::/64",
        "experimental": true
}
```

Starta om docker efter att filen ovan har lagts till: `sudo systemctl restart docker`

### Bridge Networking

Per default används "bridge-networking". Alla Docker-containers är nåbara utifrån via virtuella maskinens egna IP adress och NAT:as till en privat IP adress på insidan. Det gör att man måste delegera portar till de olika tjänsterna. Default IPv4 nät i Docker-miljön är 172.17.0.0/16.

### IPvlan

Istället för Bridge Networking kan IPvlan användas. Kan köras i antingen L2 eller L3-läge. I L2 läge är Docker-hosten en L2-switch/brygga och i L3 läge en router.

#### IPvlan L3-konf:

```
sudo docker network create -d ipvlan \
    --subnet=10.10.10.0/24 \
    --subnet=2001:db8::/68 \
    --ipv6 -o parent=eth0 \
    -o parent=eth0 \
    -o ipvlan_mode=l3 DOCKER_NETWORK
```

Docker Network kräver gillar inte interface namn såsom ens18. Eth0 går bra, [se artikel här](https://wiki.jehrlander.net/books/ubuntu/page/routing-och-ip-adressering-netplan) för hur man byter namn på ett interface.

Nätet som har skapats kan anropas manuellt vid uppstart (docker run) eller i en Docker compose fil. Se exempel längre ned.

För att tilldela en fast IP-adress kan det antingen ske via CLI vid uppstart eller genom docker-compose-filen. Då används ipam.

Konfiguration för att skapa ett nytt nät med Docker Compose:

```
# Nedan specifiseras under specifika container-konfigurationen
services:
 CONTAINERNAMN:
  networks:
   DOCKER_NETWORK:
    ipv4_address: 10.10.0.3
    ipv6_address: 2001:db8::1
    
# Nedan specifiseras "globlat" i compose filen
networks:
 DOCKER_NETWORK:
  driver: ipvlan
  enable_ipv6: true
  ipam:
   config:
    - subnet: 10.10.0.0/24
    - subnet: 2001:db8::/64
```

Konfiguration för att använda ett existerande nät med docker compose:

```
networks:
  DOCKER_NETWORK:
    name: DOCKER_NETWORK
    external: true
```

Det är flaggan `external: true` som gör att man kan använda ett existerande nät.

## Kommandon

<table border="1" id="bkmrk-kommando-f%C3%B6rklaring-"><colgroup><col></col><col></col></colgroup><tbody><tr><td>Kommando</td><td>Förklaring</td></tr><tr><td>docker images</td><td>Se vilka images som finns lokalt</td></tr><tr><td>docker ps -a</td><td>Se containrar som är igång</td></tr><tr><td>docker network inspect xxxx</td><td>Kontrollera networking</td></tr><tr><td>docker compose up</td><td>Startar container från konfigurationsfil i lokal katalog, -d eller --detach för att starta i bakgrunden</td></tr><tr><td>docker compose stop  
</td><td>Stoppa alla containrar från konfigurationsfil i lokal katalog</td></tr><tr><td>docker compose start</td><td>Starta alla containrar från konfigurationsfil i lokal katalog</td></tr><tr><td>docker compose logs -f</td><td>Se loggar för den docker compose container vars mapp du står i. Släng på -f för att följa</td></tr><tr><td>docker system prune --....</td><td>Ta bort oanvända resurser</td></tr><tr><td>docker attach xxx</td><td>Anslut mot en container</td></tr><tr><td>docker rm</td><td>Ta bort container, ange ID</td></tr><tr><td>docker exec xxx uptime</td><td>Slå ex. uptime kommandot i en container</td></tr><tr><td>docker exec --user="root" -it xxxx nsenter</td><td>Hamna i containerns cli</td></tr><tr><td>docker container logs xxx</td><td>Se logg på en container, ange ID</td></tr></tbody></table>

<table border="1" id="bkmrk-docker-run%2C-flaggor-"><colgroup><col></col><col></col></colgroup><tbody><tr><td>docker run, flaggor</td><td>Förklaring</td></tr><tr><td>-d</td><td>Detach, kör i bakgrunden</td></tr></tbody></table>

## Saker man kan installera med docker

[LibreNM](https://github.com/librenms/docker)S (fork med docker-compose [här](https://github.com/jarischaefer/docker-librenms/tree/master))  
[Oxidized](https://github.com/ytti/oxidized?tab=readme-ov-file#running-with-docker)  
[Netbox](https://github.com/netbox-community/netbox-docker) ([på denna wiki](https://wiki.jehrlander.net/books/ubuntu/page/netbox))  
[Technitium](https://github.com/TechnitiumSoftware/DnsServer/blob/master/README.md)  
[NginxProxyManager](https://github.com/NginxProxyManager/nginx-proxy-manager)  
[Avkorado](https://github.com/akvorado/akvorado)