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