First, be sure that your Synology supports Docker. You need a Synology that has a CPU with the x86 architecture. Most cheaper models have a CPU with the ARM architecture which will not work. You can check out here which CPU architecture your Synology has.
There are a few guides out there how to get Docker running on unsupported models but make no mistake—even if you could somehow get Docker running on an unsupported platform, those cheaper models with ARM CPUs are simply too weak to run Docker containers. The cheapest model with Docker support currently is the DS218+, but it has only 2 GB of RAM. 2 GB of RAM will allow the Synology to run a few—maybe five—containers at the same time but not more. You’ll want to use a more potent Synology with enough RAM if you want to run more Docker containers at the same time. I use a DS918+ which has 4 GB of RAM by default and a free slot for additional RAM. It runs Docker containers very well.
Why Use Docker Containers Anyway?
Some DSM updates (e.g. the DSM 6 betas) have broken the Plex installation in the past. This could happen again with any DSM update in the future, since there’s always the risk that a DSM update removes or alters a package’s dependencies. Not so with Docker containers. With Docker, you bundle an application together with its dependencies into isolated containers and thus separate application dependencies from infrastructure. Docker basically adds a layer of abstraction that prevents things from going wrong.
Furthermore, the Plex package is cumbersome to upgrade. Docker makes it easier to always have the latest version of Plex.
Docker and Hardware Transcoding
There’s one (potential) downside of running Plex in a Docker container. If you run Plex in a Docker container, you won’t be able to make use of the efficient hardware transcoding chip inside your Synology. This chip was specifically built and optimized solely for the purpose of transcoding. Instead, your CPU—which was not specifically built for transcoding—will do all the transcoding work via software. This imposes quite a burden on the system. To enable hardware transcoding, you need to run Plex as a package and also pay for the Plex Pass.1
If you’re not paying for the Plex Pass, it doesn’t matter whether you’re running Plex in a Docker container or as a package—you won’t be able to make use of hardware transcoding in either case. But if you’ve purchased a Plex Pass subscription, you might want to consider to stop here and run Plex as a package instead.
For all non-subscribers: As long as your movies are all encoded with x264, you shouldn’t need hardware encoding anyway so long as you don’t plan to stream your movies over the internet from a hotel room. Still, if you’re watching your videos in the web app or on an iPhone/iPad, the audio track will have to be transcoded if it’s a DTS or AC3 track, since a web browser or iPhone/iPad can’t handle either of those. But software transcoding usually is sufficient for that. Transcoding audio tracks is by far not as demanding as transcoding video tracks. But I’m getting ahead of myself. Let’s get Plex up and running in a Docker container!
Install the Docker Package
Go to Synology’s Package Manager, search for “Docker” and install it. It’s pretty straight-forward.
Before we can start using Docker containers we have to make some preparations.
Connect to your Synology with SSH
We will use the command line interface, so make sure that SSH is enabled on your Synology.
You can find that option under
Control Panel > Terminal & SNMP > Terminal.
You should also have assigned a static IP address to your DiskStation.
Now that SSH is enabled, you can log in to your DiskStation. If you’re on Windows, I guess you have to use PuTTY for that. I’m not a Windows guy though, so follow this tutorial to configure PuTTY. It’s easier if you’re using macOS or Linux. Simply open the terminal on your computer and issue the following command (use your own user name and replace the IP address with your Synology’s IP address beforehand):
Now enter that account’s password or copy & paste it from your password manager. The account you use to authenticate yourself has to have administrator rights otherwise it won’t work.
Download the Plex Image
docker commands requires
root privileges, i.e. you have to type
sudo in front of every command.
You can verify that by trying to download the Plex image right away. It will not work.
docker pull linuxserver/plex
You probably received the error message
docker: Got permission denied while trying to connect to the Docker daemon socket at …. Let’s fix that!
docker commands in combination with
sudo can be dangerous, we’d rather avoid it. Instead, we heed the advice of this site:
If you don’t want to use
sudowhen you use the
dockercommand, create a Unix group called
dockerand add users to it.
Due to DSM not being a full Linux system and lacking the mentioned tools such as
usermod, we can’t use the commands that site is proposing to create the
docker group. Instead, we use the following Synology-specific command (replace
david with your own username):
sudo synogroup --add docker david
This command created a user group called
docker and added the user
david to said group. That means that the stated user can now issue
docker commands without having to put
sudo in front of them, because:
dockerdaemon starts, it makes the ownership of the Unix socket read/writable by the
Next, re-evaluate your group membership. To do that, first, log out by typing
exit into the terminal and then log back in using the same command as above.
For the effects to take place, we need to restart the
sudo synoservice --restart pkgctl-Docker
Alternatively, you could also use the GUI or these commands:
sudo synoservicecfg --stop pkgctl-Docker sudo synoservicecfg --start pkgctl-Docker
Now test whether you’re able to run
docker commands without
docker pull linuxserver/plex
This time, it should have worked. That command has also downloaded the Docker image for Plex by linuxserver.io. Linuxserver is a great resource for Docker images. Their Plex image is better than the official image from Plex. Their images have good documentation, are very well maintained, and—most importantly—they can auto-update without you having to download the latest image manually.
Create the Mount Points
Next, we need to create the volumes we’re going to mount later on. Sounds complicated but is really simple. Go back to the terminal, log back in if necessary, and create two new folders:
mkdir -p "/volume1/docker/plex/config" mkdir -p "/volume1/docker/plex/transcode"
You may have noticed that Docker created a new shared folder called
docker when you installed the Docker package.
Inside that shared folder, we just created a new subfolder called
plex and two sub-subfolders inside that
You should do that for every application you want to run in a Docker container, not just for Plex.
The reason is: we don’t want an application to store its configuration files inside its container but somewhere we can access them.
The whole purpose of Docker, after all, is that containers are meant to be disposable.
If something doesn’t work anymore, throw the container away and create a new one.
If you store your configuration files inside the container, you’d throw them away together with the container and lose all your settings.
We’d rather store the settings outside the Docker container so that we can delete and create containers at will without having to reconfigure Plex each and every time.
Since Docker containers cannot see the file system of their host, we’ll have to define mount points that point to specific folders—and we just created these specific folders.
In case you already had the Plex package installed before you decided to run Plex in a container, you can migrate your existing Plex settings to Docker by following this article.
Basically, you just move the
Library folder out of the shared folder called
Plex inside the newly created folder
It’s best to use the GUI in your web browser to move that folder. If you want to do it from the terminal, you’d have to log in as
root user, since you cannot see shared folders when you’re logged in as admin account (admin accounts are just regular accounts in this scenario).
Create the Docker Container
Finally, we can create the Docker container. Depending on how you organize your media, you will have to adjust the following command to your own specific situation. I have a shared folder called
Media in which I have different subfolders called
Music. If your folders are named differently, replace the path to the left of the colon accordingly but leave the right side as is. If you don’t want to add e.g. your music to Plex, omit the appropriate line. If you’d like to also add your photos folder, add an appropriate line.
Since I live in Germany, my time zone is
Europe/Berlin. You have to replace that with your own time zone (which you can find here).
Leave everything else as is. Copy the entire code snippet and paste it into the terminal as one single big command (log back in via SSH if necessary).
docker run \ --name=plex \ --net=host \ --restart=always \ -e VERSION=latest \ -e PUID=$(id -u) -e PGID=$(id -g) \ -e TZ=Europe/Berlin \ -v "/volume1/docker/plex/config":/config \ -v "/volume1/Media/TV Shows":/data/tvshows \ -v "/volume1/Media/Movies":/data/movies \ -v "/volume1/Media/Music":/data/music \ -v "/volume1/docker/plex/transcode":/transcode \ linuxserver/plex
This command creates an actual container out of the image. Since we’re using
--net=host, we don’t need to take care of any sort of port forwarding. There are applications and advanced use cases where you want to use
bridge instead, but for our purpose of creating a simple Plex container
host is sufficient and the preferred option.
A Word on Environment Variables
This section is solely for your information. It does not contain any commands you need to execute. If you’re not interested in the details, you may skip this section. I just want to inform you about one of the many reasons why I wasn’t quite content with the existing guides and wanted to write my own, more coherent guide.
In order for the Docker container to access your media, we first need to give it permission. Most other guides would make you find out your user ID (UID) manually (it should be a four-digit number around 1026). Then, these guides would make you write that number down somewhere and save it for later. Next, they would make you find out your group ID (GID)—manually again. Both of which would be achieved using the command
id. Then, these guides would have you set
GID. All of this would be done manually. This is not very efficient. I spared you that. If you take a closer look at the command from above, you will notice the line
-e PUID=$(id -u) -e PGID=$(id -g). This line does everything mentioned automatically for you. It also obviates the risk of setting the wrong group ID. The group ID
100 stands for the
user group, the group ID
101 for the
administrator group. Since you’re logged in as administrator, the
id command would show that your account belongs to both
101. Many guides would make you set
PGID. I don’t recommend that. Unless you really want to grant Plex administrator rights—which you shouldn’t do and certainly do not need to do—you should set
PGID (and thus give Plex the access permissions of a regular user).
100 is also what
id -g returns. I hope this made the command from above a little bit clearer.
The container should have started by now. If not, give it a few more second. Now, you can finally start using Plex. Replace the IP address in
http://192.168.x.x:32400/web with your own Synology’s address, open that URL in your web browser and save it as a bookmark.
In Plex, you’ll probably have to adjust some settings, e.g. add the
music folders to your media library. Apart from this, that’s it! I hope you now have a working Plex setup.
Fix Transcoding Issues
I used to have a lot of problems with transcoding.
Despite all my media was encoded into the correct format, i.e. it should have qualified for Direct Play/Direct Stream, Plex was still transcoding it. This made Plex unusable for me.
I watch a lot of Game of Thrones which makes heavy use of subtitles.
With the wrong settings, Plex would “burn in” the subtitles, thus making it necessary to transcode the video stream.
To fix this problem, first of all, be sure that all subtitles are external files and in the SRT format.
Then, in the Plex settings, enable the advanced settings and go to
Web > Player > Burn subtitles and change it from
Only image formats.
This solved my transcoding problems.
If you liked this article, please share it with your friends. Feel free to post it in some forums. As you can see by now, running Plex in a Docker container is not that hard once you’ve wrapped your head around it. I found the existing guides to be very confusing, however. It would be great if I could help some more struggling people out. Cheers!