If you prefer shell for simple, solo services, over docker-compose:

#!/bin/sh
docker run -d \
--volume /opt/docker/data/jellyfin/config:/config \
--volume /opt/docker/data/jellyfin/cache:/cache \
--volume /mnt/Movies:/media/Movies \
--volume /mnt/TV:/media/TV \
--volume /mnt/Music:/media/Music \
--net=host \
--restart=unless-stopped \
jellyfin/jellyfin:10.8.5-amd64

Add and remove "--volume" entries as needed. You can have more than one movie or TV library or whatever, which is super-handy if you have kids because you can restrict their accounts to certain libraries. Consider using links from the main libraries to create the kids' libraries, if you want to have everything available, including kid stuff, on your adult account(s), as it's a little cleaner than adding both the adult and kid libraries to a single account. Left side is the host machine where the files actually live, right side is where it's mounted in the container. Replace the left side with whatever's right for your system. Names within the "media" directory in the container are arbitrary, but you will have to add each library in the web UI to make them show up, so it's worth giving them decent names.

Replace the "/opt/docker/...." bits with wherever you want to store the config and cache on the host machine. It'll survive restarts/reboots with everything intact with just those two config-related mounts.

the "--restart=unless-stopped" means you probably don't need to do anything else to get it to come back up on reboots. No messing with systemd or whatever, at least on many distros. Docker will take care of it.

Version number's the latest release, I like to handle that manually so there are no surprises. I think they have a "latest" tag or similar that you can use if you don't care about that and just want it to always run the newest thing.

Pro-tip: the youtube metadata plugin (not included by default) is far less smoothly-functioning than the rest of the system is (and also won't run on that docker image without some light modification—it needs youtube-dlp present) BUT many of the things from Youtube that you might want to watch on a real TV have entries on IMDB or thetvdb, so you can add them as TV shows, which is all-around a much better experience.

For smoothest operation, organize movies like:

/The Matrix (1999)/The Matrix (1999).mp4
/The Matrix (1999)/The Matrix (1999).en.srt
/Star Wars (1977)/Star Wars (1977) - Special Edition.mkv
/Star Wars (1977)/Star Wars (1977) - 4K77.mkv
/Star Wars (1977)/Star Wars (1977) - Raw 35MM scan.mkv
/Star Wars (1977)/Extras/From Star Wars to Jedi.avi

I think you can define what you want the "Extras" directory to be called when you set up the library, and that's what it'll look for. "Featurettes" is another common name for that.

If you do this, it'll automatically grab the right metadata like 99% of the time with no intervention.

For TV:

/King of the Hill (1997)/Season 1/S01E01.mkv
/King of the Hill (1997)/Season 1/S01E02.mkv
(et cetera)
/King of the Hill 1997)/Season 0/S00E05 - The Making of King of the Hill.mp4

You can actually put almost anything you want in the actual episode file names, as long as it has that "SxxExx" pattern in it somewhere.

Again, I think you can use other names for the "specials" folders if you configure it when setting up the library, but they're "S00E01" and so on in thetvdb, so I use "Season 0"

If anything gets the wrong metadata, find its ID on imdb or thetvdb or tmdb or whatever, hit the hamburger menu on the thumbnail for it, click "identify", and enter your id in the matching field. That'll fix it. But this will very rarely happen if your naming is all correct.

[EDIT] Nb. this may not be a great config for transcoding, I'm not sure it'll have access to hardware decode/encode with this. I avoid that by only using frontend devices that can handle all the codecs I have (AppleTV FTW) so nothing's ever transcoded, since my server can't transcode for shit in the best of circumstances, but that may matter to some people.