Skip to main content

Docker Compose

Jag använder mig av docker compose på Ubuntu. 

Patchning

Patcha en container går väldigt fort och kan ske med minimal nedtid.

Slå först sudo docker compose pull för att hämta senaste avbilderna. Sedan sudo docker container up för att återskapa containern med senaste avbilden. Klart!

Container name

Ge containern ett specifikt namn med variabeln container_name. Ex:

grampsweb_redis:
  container_name: grampsweb_redis

User

Specifisera vilken användare som ska användas. Denna måste komma åt filtjänsterna. Specifiserar man inte en användare så används root. Det är alltså bra att specifisera användare. Om man kör numrerar UID/GID, ex 1000:1000, så behöver man inte skapa dem i förväg. Det kan vara bra att ha olika UID/GID per compose-fil.

Ex.

services:
  navidrome:
    image: deluan/navidrome:latest
    user: "1000:1000"
    volumes:
      - "./data:/data"

 

Restart

Man kan ställa in så att ens contianer alltid startar när hosten startar genom restart: always.  Jag gillar restart: unless-stopped, vilket gör att containern inte startar automatiskt om den manuellt har stängts av.

Ex:

services:
  server:
    restart: unless-stopped

Volumes

Går att konfigurera på lika olika sätt. Ex. config:/etc/dns placerar volymen i /var/lib/docker/volumes./data:/data placerar filerna i en undermapp till mappen som docker-compose.yml filen är i. Här är ett exempel på en NFS-monterad mapp:
/data/docker/audiobookshelf/audiobooks:/audiobooks

sudo docker volume ls listar alla volymer som docker känner till. inspect ger bra information om en specifik volym, ex:

jehrlander@docker-mgmt:~/docker/DnsServer$ sudo docker volume inspect dnsserver_config
[
    {
        "CreatedAt": "2024-04-18T13:54:19Z",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.project": "dnsserver",
            "com.docker.compose.version": "2.20.2",
            "com.docker.compose.volume": "config"
        },
        "Mountpoint": "/var/lib/docker/volumes/dnsserver_config/_data",
        "Name": "dnsserver_config",
        "Options": null,
        "Scope": "local"
    }

För att rensa oanvända volymer, som ingen container använder, använd sudo docker volume prune -a.

NFS-montera i container

En NFS montering sker från hosten. Man kan antingen montera NFS direkt på hosten via fstab (se den här artikeln för Ubuntu) eller så kan man montera per compose fil. Gör man det i compose-filen så blir filen mer portabel. Å andra sidan tycker jag att det skalar trevligt med att montera direkt från hosten . Jag vet inte vad som är bäst, säkerheten har jag inte rätt ut ännu.

Montera från host

Följ artikeln för Ubuntu länkad ovan. I exemplet nedanför är då mappen monterad som /data/music. Mer konfiguration behövs ej.

services:
  metadata-remote:
    image: ghcr.io/wow-signal-dev/metadata-remote:latest
    container_name: metadata-remote
    ports:
      - "8338:8338"
    volumes:
      - /data/music:/music
    environment:
      - PUID=1000
      - PGID=1000
    restart: unless-stopped
    networks:
      DOCKER_NETWORK:
        ipv4_address: 10.10.0.63

networks:
  DOCKER_NETWORK:
    name: DOCKER_NETWORK
    external: true

Ibland kan man få behörighetsproblem:

jehrlander@docker-mgmt:~/docker/kiwix$ sudo docker compose up
Attaching to kiwix-serve-1
kiwix-serve-1  | '/data' directory is not writable by 'user:user' (1001:1001). ZIM file(s) can not be written.
kiwix-serve-1 exited with code 1

Här syns användaren som används. Då är det lätt att fixa med:

sudo chown -R 1001:1001 /data/docker/kiwix

Det går även att definiera volymer längst ned i en compose-fil och sedan hänvisa till dem längre upp. Gör man såhär så måste man dock skapa alla mappar själva, det kan inte Docker göra via den här typen av volymer.

services:
  # MongoDB: https://hub.docker.com/_/mongo/
  mongodb:
    image: "mongo:7.0"
    restart: "on-failure"
    networks:
      - GRAYLOG_INTERNAL
    volumes:
      - "mongodb_data:/data/db"
      - "mongodb_config:/data/configdb"

volumes:
  mongodb_data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /data/docker/graylog/mongodb_data
  mongodb_config:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /data/docker/graylog/mongodb_config

Montera direkt från container

Här är ett exempel på en compose fil (för applikation Kiwix) där monteringen sker via compose-filen. Då är det docker-containern själv som pratar NFS, vilket syns definierat i driver:

services:
  kiwix-serve:
      ports:
        - 8080:8080
      image: ghcr.io/kiwix/kiwix-serve:latest
      # uncomment next 4 lines to use it with local zim file in /tmp/zim
      volumes:
       - kiwix-nfs:/data
      command:
       - '*.zim'
      # uncomment next 2 lines to use it with remote zim file
      environment:
      - 'DOWNLOAD=https://download.kiwix.org/zim/wikipedia/wikipedia_en_all_maxi_2025-08.zim'
      networks:
        DOCKER_NETWORK:
          ipv4_address: 10.10.0.66

networks:
  DOCKER_NETWORK:
    name: DOCKER_NETWORK
    external: true

volumes:
  kiwix-nfs:
    driver: local
    driver_opts:
      type: nfs
      o: addr=10.0.7.50,rw,soft,nfsvers=4
      device: ":/volume1/kiwix"