It seems most media servers (Jellyfin, Emby, Plex, UMS…etc) recommend using docker host networking (-net=host) when running within a container so that it can see UDP traffic on port 1900 for DLNA discovery.
This is undesirable for a number of reasons, not the least of which is that a reverse proxy (Traefik, perhaps?) running in docker can’t talk to anything running directly on the host (or containers using the host network).
Below I’m using a macvlan network to put the Jellyfin container on the same network as my host so Traefik can properly proxy to it while still receiving broadcast network traffic.
- Create macvlan network that mirrors your hosts’ internal network
 Warning: Assign containers static IPs that are outside your DHCP range (or use a smaller, non-overlapping CIDR range)docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eno1 home-net
- Create Traefik container
 Use macvlan network, assign static IP, use static MAC for DHCP address reservation:--net=home-net \--ip=192.168.1.13 \--mac-address=02:42:c0:a8:01:0d \--label traefik.docker.network=home-net \
- Connect Traefik container to bridgenetwork (or traefik docker network)
 docker network connect bridge traefik
- Create Jellyfin container
 Use macvlan network, assign static IP, use static MAC for DHCP address reservation:--net=home-net \--mac-address=02:42:c0:a8:01:0f \--ip=192.168.1.15 \
 Publish DLNA port
 -p 1900:1900/udp
Minimal Approach
The most simplistic approach to solving this problem seems to be using the net=host network, but creating a static rule in Traefik that points to the internal docker host/gateway IP (http://172.17.0.1:8096)…
# traefik.toml
[backends]
   [backends.backend-jellyfin]
     [backends.backend-jellyfin.servers]
       [backends.backend-jellyfin.servers.server-1]
         url = "http://172.17.0.1:8096"
 [frontends]
   [frontends.jellyfin]
     backend = "backend-jellyfin"
     passHostHeader = true
     [frontends.jellyfin.routes]
       [frontends.jellyfin.routes.route-jellyfin-ext]
         rule = "Host:jellyfin.domain.tld"
     [frontends.jellyfin.headers]
       SSLRedirect = true
       SSLHost = "jellyfin.domain.tld"
       SSLForceHost = true
       STSSeconds = 315360000
       STSIncludeSubdomains = true
       STSPreload = true
       forceSTSHeader = true
       frameDeny = true
       contentTypeNosniff = true
       browserXSSFilter = true
       customResponseHeaders = "X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex"
       customFrameOptionsValue = "allow-from https://domain.tld"