Docker non ha bisogno di presentazioni: nato nel 2013, è diventato lo standard de facto per la gestione dei container. Permette di creare ambienti isolati e riproducibili, semplificando notevolmente il deployment delle applicazioni.

Su NixOS l’installazione non segue la documentazione ufficiale di Docker: è sufficiente attivare il modulo e configurarlo dichiarativamente. In questa guida viene adottata la best practice di unificare tutta la configurazione in un unico file .nix, così da avere tutto raccolto in un solo posto senza dover cercare le impostazioni in vari file di configurazione.

Configurazione NixOS

La configurazione seguente abilita Docker su NixOS. Il modulo Nix gestisce automaticamente l’installazione e la configurazione del servizio all’interno del proprio sistema.

La configurazione è così strutturata:

  • Firewall: vengono aperte le porte 8000-8002 per i servizi containerizzati (esempio dimostrativo)
  • Pacchetti: vengono installati docker e lazydocker (TUI per gestire i container in modo semplificato)
  • Virtualizzazione Docker: infine viene abilitato Docker con auto-prune settimanale per rimuovere automaticamente immagini e container inutilizzati
nix
{ config, pkgs, ... }:

{

  # Firewall: Apre le porte per i servizi containerizzati
  networking.firewall = {
    allowedTCPPorts = [ 8000 8001 8002 ];
    allowedUDPPorts = [ 8000 8001 8002 ];
  };

  # Pacchetti: Installa docker CLI e lazydocker (TUI per gestione container)
  environment.systemPackages = with pkgs; [
    docker
    lazydocker
  ];

  # Docker: Abilitazione servizio con pulizia automatica settimanale
  virtualisation.docker = {
    enable = true;
    autoPrune.enable = true;
    autoPrune.dates = "weekly";
  };

}

Troubleshooting & Consigli

Lazydocker è un programma estremamente leggero che permette di monitorare e visualizzare le informazioni dei propri container in modo semplice e immediato. Essendo già presente nei packages, non richiede nessuna configurazione aggiuntiva.

La configurazione delle porte del firewall viene inserita direttamente in questo file, limitandola a quelle dei container Docker. In questo modo è più facile ricordare quali porte sono utilizzate e dove sono state configurate, evitando sovrapposizioni con altre configurazioni presenti in file diversi.