Podman containers DNS

I can’t seem to reach other containers by hostname, only by (varying) IP address. NixOS 22.11.

Try assigning containers to a pod.

Excellent suggestion thank you. I’ve just tried using it like a replacement for docker via virtualisation.oci-containers.containers.

How would one assign a pod via that?

Did you set virtualisation.podman.defaultNetwork.dnsname.enable and adjust your firewall accordingly?

I added the following rules (might not be what you want exactly):

  networking.firewall.interfaces."podman+" = {
    allowedUDPPorts = [ 53 ];
    allowedTCPPorts = [ 53 ];
  };

Example setup for nextcloud/redis/mariadb: (assigning a pod falls under extraOptions)

  systemd.services.pod-cloud = {
    description = "Start podman 'nextcloud' pod";
    wants = [ "network-online.target" ];
    after = [ "network-online.target" ];
    requiredBy = [ "podman-mariadb.service" "podman-nextcloud.service" "podman-redis.service" ];
    unitConfig = {
      RequiresMountsFor = "/run/containers";
    };
    serviceConfig = {
      Type = "oneshot";
      ExecStart = "-${pkgs.podman}/bin/podman pod create cloud";
    };
    path = [ pkgs.zfs pkgs.podman ];
  };
  virtualisation.podman = {
    enable = true;
    extraPackages = [ pkgs.zfs ];
  };
  virtualisation.containers.storage.settings = {
    storage = {
      driver = "zfs";
      graphroot = "/var/lib/containers/storage";
      runroot = "/run/containers/storage";
    };
  };
    nextcloud = {
      image = "nextcloud:local";
      autoStart = true;
      user = "1000:100";
      dependsOn = [ "mariadb" "redis" ];
      environment = {
        MYSQL_HOST = "127.0.0.1";
        REDIS_HOST = "127.0.0.1";
        TRUSTED_PROXIES = "10.88.0.1/24";
        NEXTCLOUD_TRUSTED_DOMAINS = "my.domain";
        MAIL_DOMAIN = "my.domain";
        OVERWRITEHOST = "my.domain";
        OVERWRITEPROTOCOL = "https";
        OVERWRITECLIURL = "my.domain";
        PHP_MEMORY_LIMIT = "2G";
        PHP_UPLOAD_LIMIT = "2G";
      };
      extraOptions = [
        "--device=/dev/dri"
        "--init=true"
        "--pod=cloud"
        "--label=traefik.enable=true"
        "--label=traefik.http.routers.nextcloud.rule=Host(`my.domain`)"
        "--label=traefik.http.routers.nextcloud.entrypoints=websecure"
        "--label=traefik.http.routers.nextcloud.tls.certResolver=le"
        "--label=traefik.http.routers.nextcloud.middlewares=headers,nextcloud-redirectregex@file"
        "--label=traefik.http.services.nextcloud.loadbalancer.server.port=80"
        "--sysctl=net.ipv4.ip_unprivileged_port_start=80"
      ];
      volumes = [ "nextcloud_config:/var/www/html" "/mnt/media:/data" ];
    };
    redis = {
      image = "docker.io/library/redis:latest";
      autoStart = true;
      user = "1000:100";
      cmd = [ "redis-server" "--save" "59" "1" "--loglevel" "warning" ];
      extraOptions = [ "--pod=cloud" ];
      volumes = [ "redis_data:/data" ];
    };
    mariadb = {
      image = "docker.io/library/mariadb:latest";
      autoStart = true;
      user = "mysql:mysql";
      cmd = [ "--transaction-isolation=READ-COMMITTED" "--log-bin=msqyld-bin" "--binlog-format=ROW" ];
      extraOptions = [ "--pod=cloud" ];
      volumes = [ "mariadb_data:/var/lib/mysql" ];
      environment = {
        MYSQL_DATABASE = "nextcloud";
        MYSQL_USER = "nextcloud";
        MYSQL_PASSWORD = "password";
        MYSQL_ROOT_PASSWORD = "rootpassword";
      };
    };
  };