Nixos-container : no localhost anymore

Posté le 23 juillet 2018

Je vous entends déjà …

dire que je n’ai qu’à utiliser docker “épicétou”.
Non, je ne suis pas d’accord. Les conteneurs docker sont la plupart du temps fabriquer par je-ne-sais-qui et avec tous les soucis de mises à jour qu’on connait.
Un nix-container est une unité réseau à part entière, un ou plusieurs services. C’est autre chose !

Débutons

Allez, on commence par un petit service redis tout simple dans un fichier à part :

{ config, pkgs, ... }:

{
  containers.redisDB = {
    privateNetwork = true;
    hostAddress = "192.168.100.10";
    localAddress = "192.168.100.11";
    config = { config, pkgs, ... }: {
      services.redis = {
        enable = true;
        bind = "0.0.0.0";
        port = 6379;
        package = pkgs.redis;
      };
      networking.firewall = {
        enable = true;
        allowedTCPPorts = [ 6379 ];
        allowPing = true ;
      };
    };
  };
}

Quand on connait les fichiers nix, peu de surprises :

  • une déclaration d’un objet container, appelé redisDB
  • du réseau : la seule nouveauté
  • un service redis
  • un service firewall

Petit “nixos-rebuild switch” et

$ ping redisDB.containers                                                                                 
PING redisDB.containers (192.168.100.11) 56(84) bytes of data.
64 bytes from redisDB.containers (192.168.100.11): icmp_seq=1 ttl=64 time=0.030 ms
64 bytes from redisDB.containers (192.168.100.11): icmp_seq=2 ttl=64 time=0.027 ms
64 bytes from redisDB.containers (192.168.100.11): icmp_seq=3 ttl=64 time=0.030 ms

Pratique ce nom dns !!

Les commandes

Avec nixos-container : Rien de révolutionnaire mais quelques commandes pratiques.

  • show-ip : c’est bete mais ça peut servir bien que le nom du conteneur est attaquable directement
  • root-login : simple connexion depuis root en root sur le conteneurs
  • login : mode terminal sur le conteneur, mais faut-il encore avoir créer un user !

Accès ssh

Si vous voulez rajouter un accès ssh en root, rien de plus facile :

services.openssh.enable = true;
users.users.root.openssh.authorizedKeys.keys = ["ssh-rsa blabla…"];

Exposer les ports

Passez le privateNetwork à false dans votre conteneur, puis modifier votre networking sur le host :

nat = {
  enable=true;
  internalInterfaces=["ve-+"];
  externalInterface = "wlp3s0";
  forwardPorts = [
    {destination = "192.168.100.11:6379"; sourcePort = 6379;}
  ];
};

Adaptez au nom de vos interfaces.

Conclusion

Construisez vos conteneurs comme votre système, rien à apprendre en plus sinon la gestion réseau pour présenter vos services à l’extérieur