Running Plex on Docker

Having my media library in two locations means I should have two Plex servers. I talk about my experience with setting up Plex on Docker with hardware-accelerated decoding at home.

Plex is great. It’s versatile in that I can stream my media at home on my TV, on the go on my laptop and phone, or at my parents’ place. Currently, I have two copies of my media in case any thing ever blows up; however, I only have one instance of Plex configured, and it’s at my parents place. Every time I stream something on my TV at home, the TV fetches it via my inter-site VPN tunnel. Although I don’t currently have a data transfer limit on my Internet plan, this still seemed like a waste of bandwidth due to the fact that I have the exact same copy of data locally.

Given that I had recently containerized many of my internal applications and moved those applications from my parents’ place to my current home, running Plex on Docker seemed like a natural thing to do. And so this is exactly what I set out to do.

Before starting, I needed to add an additional hard drive to my container host. To give some context, the machine had three drives: one SSD for Ubuntu Server, one SSD for my Windows Server machine that I had virtualized, and one 1TB HDD for my current Docker applications. The application data did not have any form of data redundancy, so I decided to add an additional 1TB HDD to this machine and reconfigure the HDDs. I stopped my running services, moved all the data off of the HDDs to the SSD, and pretty much reformatted the hard drives. Checksumming is also a nice thing to have, so I encrypted my drives and created a two-disk btrfs raid1 filesystem. By scrubbing data on the drives regularly, it would reduce the probability of bit rot from occurring. With that out of the way, I moved the data to the newly configured btrfs volume and restarted my current Docker applications. I was ready to proceed with the rest of the setup.

Adding Plex wasn’t too bad: I used docker compose once again to run the linuxserver/plex image. Instead of exposing ports, I opted to use host networking instead. Additional container mount points were created, and I had to also mount the read-only network shares containing my media onto the host machine itself before mapping it to the container. I linked the Plex server to my account via a Plex claim code, and I was pretty much on my way. My Plex library at my parents just uses the new default Plex agent to search for metadata, which is adequate for my use cases, so I set up my libraries on this new server in exactly the same way.

[git:master] [email protected]:~/git/docker-config$ docker ps
CONTAINER ID   IMAGE                       COMMAND                  CREATED       STATUS       PORTS                                                                      NAMES
2f437ea82ce6   linuxserver/plex:1.31.0     "/init"                  5 hours ago   Up 5 hours                                                                              docker-config-plex-1
ae593e4aa66e   certbot/dns-cloudflare      "sh -c 'trap exit TE…"   3 days ago    Up 3 days    80/tcp, 443/tcp                                                            docker-config-certbot-1
4f7ea1ed985d   docker-config-apache2-ext   "dumb-init -v --rewr…"   3 days ago    Up 3 days    80/tcp                                                                     docker-config-apache2-ext-1
889e19f8eb10   docker-config-grafana       "/"                3 days ago    Up 3 days                                                                               docker-config-grafana-1
ab44364dad23   docker-config-apache2-int   "dumb-init -v --rewr…"   3 days ago    Up 3 days>80/tcp, :::80->80/tcp,>443/tcp, :::443->443/tcp   docker-config-apache2-int-1
b8e7c843ae5c   mysql:8.0.31                "docker-entrypoint.s…"   3 days ago    Up 3 days>3306/tcp, :::3306->3306/tcp, 33060/tcp                       docker-config-mysql-1
2b3f3dac3320   cloudflare/cloudflared      "cloudflared --no-au…"   3 days ago    Up 3 days                                                                               docker-config-cloudflared-1
Plex server showing up on my dashboard.

The next thing I needed to get working was hardware-accelerated decoding using the GPU, which was included with my lifetime Plex Pass. This hand-me-down machine has a 4GB NVIDIA Quadro K2200, so it should be sufficient for any video stream I throw at it. I had to install the NVIDIA Container Toolkit and the nvidia-smi CLI utilities, and then map the GPU into the container. It took some time to figure out some weird quirks, but when I realized I had to reboot the actual host machine, everything just worked. nvidia-smi was then able to confirm that streaming video to my TV decodes via the GPU:

GPU decoding verified using nvidia-smi

In conclusion, running Plex on Docker is great and configuring hardware-accelerated decoding inside a container still works fine. Keeping Plex up-to-date is as straightforward as running docker compose pull followed by docker compose up -d. Transferring data from one host to another will be easy if and when I ever decide to upgrade my host machine because of containerization. Hurray!

Anyways, that’s all I have this time around. Until next time!


Just some guy on the Internet that writes code for fun and for a living, and also collects anime figures.

Articles: 254

Feel free to leave a reply

%d bloggers like this: