<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Docker on Nelson Figueroa</title>
    <link>https://nelson.cloud/categories/docker/</link>
    <description>Recent content in Docker on Nelson Figueroa</description>
    <image>
      <title>Nelson Figueroa</title>
      <url>https://nelson.cloud/opengraph-images/default.png</url>
      <link>https://nelson.cloud/opengraph-images/default.png</link>
    </image>
    <language>en</language>
    <lastBuildDate>Wed, 06 May 2026 15:48:18 -0700</lastBuildDate>
    <atom:link href="https://nelson.cloud/categories/docker/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Setting up WireGuard on Synology DSM 7 using Docker and Gluetun</title>
      <link>https://nelson.cloud/setting-up-wireguard-on-synology-dsm-7-using-docker-and-gluetun/?ref=rss</link>
      <pubDate>Wed, 31 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://nelson.cloud/setting-up-wireguard-on-synology-dsm-7-using-docker-and-gluetun/?ref=rss</guid>
      <description>A guide to connect a Synology NAS to a WireGuard VPN server, with qBittorrent as an example.</description><content:encoded><![CDATA[<p>At the time of writing Synology DiskStation Manager (DSM) 

<a href="https://www.synology.com/en-us/releaseNote/DSM?model=DS920%2B#ver_86009-3" target="_blank" rel="noopener">v7.3.2-86009 Update 3</a> is running on Linux v4.4.302+ which doesn&rsquo;t support WireGuard.<br>
It 

<a href="https://community.synology.com/enu/forum/1/post/158013" target="_blank" rel="noopener">doesn&rsquo;t look like Synology is interested in adding WireGuard support</a> the way OpenVPN is supported. So if you want certain services on your Synology NAS to connect through WireGuard, you&rsquo;ll need a workaround.</p>
<p>One workaround is to establish a WireGuard connection using 

<a href="https://github.com/qdm12/gluetun" target="_blank" rel="noopener">Gluetun</a> in Docker. Then have containerized services do their networking through this Gluetun container. The caveat is that whatever services you want to go through a WireGuard tunnel will need to be containerized.</p>
<h2 id="prerequisites">Prerequisites</h2>
<p>This guide is intended for those comfortable with the 

<a href="https://en.wikipedia.org/wiki/Command-line_interface" target="_blank" rel="noopener">command line</a>, 

<a href="https://www.cloudflare.com/learning/access-management/what-is-ssh/" target="_blank" rel="noopener">SSH</a>, and 

<a href="https://www.docker.com/" target="_blank" rel="noopener">Docker</a>.</p>
<p>You&rsquo;ll need 

<a href="https://www.synology.com/en-us/dsm/feature/docker" target="_blank" rel="noopener">Container Manager</a> installed, which is basically just Synology&rsquo;s wrapper around Docker. Install it via the Web UI, then you&rsquo;ll be able to use <code>docker</code> commands via SSH. Installing Container Manager is straightforward. Log into the Synology DSM Web UI -&gt; open Package Center -&gt; search for &ldquo;Container Manager&rdquo; -&gt; click &ldquo;Install&rdquo;.</p>
<p>You&rsquo;ll also need a WireGuard configuration file. For this guide I&rsquo;ll be using a configuration file from 

<a href="https://mullvad.net/" target="_blank" rel="noopener">Mullvad VPN</a>.</p>
<h2 id="why-gluetun">Why Gluetun?</h2>
<p>A bit of background as to why I&rsquo;m using Gluetun. There&rsquo;s a 

<a href="https://hub.docker.com/r/linuxserver/wireguard" target="_blank" rel="noopener">linuxserver/wireguard</a> docker image we can use, but that image expects the underlying kernel to have WireGuard support. Since Synology DSM runs on 4.4.302+ at this time that means it doesn&rsquo;t support WireGuard, which means the linuxserver/wireguard image won&rsquo;t work. I tried to get it working myself but kept running into errors.</p>
<p>Unlike linuxserver/wireguard, Gluetun works on any kernel by using something called userspace WireGuard implementation. Basically it runs at the user level rather than at the kernel level. This is beyond my knowledge though, so I encourage you to do some of your own research if you want to learn more.</p>
<h2 id="creating-gluetun-directories">Creating Gluetun Directories</h2>
<p>First, let&rsquo;s create a directory where the Gluetun container will store a configuration file once it&rsquo;s running.</p>
<p>SSH into your Synology device with an admin user:</p>
<pre tabindex="0"><code>ssh &lt;admin-user&gt;@&lt;synology-ip-address&gt;
</code></pre><p>Once you&rsquo;re in, get root access to make this process easier:</p>
<pre tabindex="0"><code>sudo -i
</code></pre><p>If you can run <code>whoami</code> and get <code>root</code> as the output then you&rsquo;re good to go.</p>
<pre tabindex="0"><code>$ whoami
root
</code></pre><p>Now we can create the directory that Gluetun will need. In my case, I only have one volume and it&rsquo;s called <code>volume1</code>, so your path may be a little different:</p>
<pre tabindex="0"><code>mkdir -p /volume1/docker/gluetun
</code></pre><p>That should be it! Stay as <code>root</code> going forward to keep things simple.</p>
<h2 id="creating-a-docker-composeyml-file">Creating a docker-compose.yml File</h2>
<p>Next we can create a <code>docker-compose.yml</code> file where we&rsquo;ll tell Docker to run a Gluetun container. This file can also be easily extended with additional containers that should connect to Gluetun to have WireGuard access. More on that later though.</p>
<p>First, make sure Docker is actually installed as it&rsquo;s a prerequisite I mentioned at the beginning of this post:</p>
<pre tabindex="0"><code>$ docker --version
Docker version 24.0.2, build 610b8d0
</code></pre><p>Then create a <code>docker-compose.yml</code> file. I chose to create it in <code>/volume1/docker/</code> because it seemed logical but you can place this just about anywhere you&rsquo;d like.</p>
<pre tabindex="0"><code>touch /volume1/docker/docker-compose.yml
</code></pre><p>Now we can fill in <code>docker-compose.yml</code>. Here&rsquo;s the starting point you&rsquo;ll need for Gluetun:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">gluetun</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">qmcgaw/gluetun:latest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">container_name</span><span class="p">:</span><span class="w"> </span><span class="l">gluetun</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">cap_add</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">NET_ADMIN</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">environment</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">TZ=America/Los_Angeles</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">VPN_SERVICE_PROVIDER=mullvad</span><span class="w"> </span><span class="c"># change as needed</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">VPN_TYPE=wireguard</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">WIREGUARD_PRIVATE_KEY=&lt;tbd&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">WIREGUARD_ADDRESSES=&lt;tbd&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">SERVER_CITIES=Los Angeles CA</span><span class="w"> </span><span class="c"># change as needed</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">/volume1/docker/gluetun:/gluetun</span><span class="w"> </span><span class="c"># edit if your directory is something other than `volume1`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l">unless-stopped</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</blockquote><blockquote><p><strong>Note:</strong></p>Note that if it&rsquo;s easier you can create <code>docker-compose.yml</code> locally on your device and then drag it over to a directory of your choosing through the Web UI.</blockquote>

<p>We&rsquo;ll need to fill in <code>WIREGUARD_PRIVATE_KEY</code> and <code>WIREGUARD_ADDRESSES</code> in <code>docker-compose.yml</code>. These can be retrieved from a WireGuard configuration file.</p>
<p>It depends on your provider but for Mullvad VPN you go to 

<a href="https://mullvad.net/en/account/wireguard-config" target="_blank" rel="noopener">https://mullvad.net/en/account/wireguard-config</a> and download the <strong>Linux</strong> version of the WireGuard configuration file. The file itself should look something like this regardless of your VPN provider:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="k">[Interface]</span>
</span></span><span class="line"><span class="cl"><span class="na">PrivateKey</span> <span class="o">=</span> <span class="s">dGhpcyBoYXMgYmVlbiByZWRhY3RlZA==</span>
</span></span><span class="line"><span class="cl"><span class="na">Address</span> <span class="o">=</span> <span class="s">10.67.205.85/32,fc00:bbbb:bbbb:bb01::4:cd54/128</span>
</span></span><span class="line"><span class="cl"><span class="na">DNS</span> <span class="o">=</span> <span class="s">10.64.0.1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">[Peer]</span>
</span></span><span class="line"><span class="cl"><span class="na">PublicKey</span> <span class="o">=</span> <span class="s">YWxzbyByZWRhY3RlZCB0aGlz</span>
</span></span><span class="line"><span class="cl"><span class="na">AllowedIPs</span> <span class="o">=</span> <span class="s">0.0.0.0/0,::0/0</span>
</span></span><span class="line"><span class="cl"><span class="na">Endpoint</span> <span class="o">=</span> <span class="s">138.199.43.91:51820</span>
</span></span></code></pre></td></tr></table>
</blockquote><p>Copy the <code>PrivateKey</code> field and paste it as the value for <code>WIREGUARD_PRIVATE_KEY</code> in <code>docker-compose.yml</code>. Then copy <code>Address</code> and paste it as the value for <code>WIREGUARD_ADDRESSES</code>.</p>
<blockquote><p><strong>Note:</strong></p><p>At the time of writing Gluetun only supports IPv4 addresses. So if your <code>Address</code> value contains an IPv6 range it will not work and you&rsquo;ll get an error like <code>cannot add address to wireguard interface: permission denied: when adding address</code>.</p>
<p>The value should look like this: <code>10.67.205.85/32</code></p>
<p>The value should <strong>NOT</strong> look like this: <code>10.67.205.85/32,fc00:bbbb:bbbb:bb01::4:cd54/128</code></p>
</blockquote>

<p>Here&rsquo;s what the updated <code>docker-compose.yml</code> file will look like in this case:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="hl"><span class="lnt">11
</span></span><span class="hl"><span class="lnt">12
</span></span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">gluetun</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">qmcgaw/gluetun:latest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">container_name</span><span class="p">:</span><span class="w"> </span><span class="l">gluetun</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">cap_add</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">NET_ADMIN</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">environment</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">TZ=America/Los_Angeles</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">VPN_SERVICE_PROVIDER=mullvad</span><span class="w"> </span><span class="c"># change as needed</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">VPN_TYPE=wireguard</span><span class="w">
</span></span></span><span class="line hl"><span class="cl"><span class="w">      </span>- <span class="l">WIREGUARD_PRIVATE_KEY=dGhpcyBoYXMgYmVlbiByZWRhY3RlZA==</span><span class="w">
</span></span></span><span class="line hl"><span class="cl"><span class="w">      </span>- <span class="l">WIREGUARD_ADDRESSES=10.67.205.85/32</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">SERVER_CITIES=Los Angeles CA</span><span class="w"> </span><span class="c"># change as needed</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">/volume1/docker/gluetun:/gluetun</span><span class="w"> </span><span class="c"># edit if your directory is something other than `volume1`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l">unless-stopped</span></span></span></code></pre></td></tr></table>
</blockquote>
<p>Now we can start up the Gluetun container and verify that it works.</p>
<h2 id="running-the-gluetun-container-and-verifying-wireguard-works">Running the Gluetun Container and Verifying WireGuard Works</h2>
<p>In the same directory as <code>docker-compose.yml</code>, spin up a Gluetun container with <code>docker compose</code>:</p>
<pre tabindex="0"><code>docker compose up -d
</code></pre><p>You&rsquo;ll see some output similar to the following:</p>
<pre tabindex="0"><code>[+] Running 4/4
 ✔ gluetun 3 layers [⣿⣿⣿]      0B/0B      Pulled                                                                                                            9.8s
   ✔ 2d35ebdb57d9 Pull complete
   ✔ af8ed9d65cfd Pull complete
   ✔ 55e433daf0d2 Pull complete
[+] Running 2/2
 ✔ Network docker_default  Created
 ✔ Container gluetun       Started
</code></pre><p>For Mullvad VPN specifically there&rsquo;s a way to verify that a connection is going through their servers. We can run a command against the Gluetun container to confirm.</p>
<pre tabindex="0"><code>$ docker exec gluetun wget -qO- https://am.i.mullvad.net/connected
You are connected to Mullvad (server us-lax-wg-602). Your IP address is 23.162.40.236
</code></pre><p>Regardless of VPN provider, you can check that the <code>wget</code> command returns a different IP address from the IP address your internet provider has assigned to you.</p>
<p>Get your normal IP address first by running <code>wget</code> outside of Docker.</p>
<pre tabindex="0"><code>$ wget -qO- https://icanhazip.com/
205.154.229.24
</code></pre><p>Then run the same command against Gluetun to verify that you get a different IP address:</p>
<pre tabindex="0"><code>$ docker exec gluetun wget -qO- https://icanhazip.com/
23.162.40.236
</code></pre><p>If the IP addresses are different, you should be good to go. Now we can start creating containers that use the WireGuard connection through Gluetun.</p>
<h2 id="connecting-another-container-to-gluetun-qbittorrent">Connecting Another Container to Gluetun (qBittorrent)</h2>
<p>I&rsquo;ll be using a qBittorrent container as an example as that is a common use case with WireGuard. People love their Linux ISOs. Adding containers is easy as we just need to append to the existing <code>docker-compose.yml</code> file.</p>
<p>First, create some directories that qBittorrent will need for configuration and downloads:</p>
<pre tabindex="0"><code>$ mkdir -p /volume1/docker/qbittorrent/config
$ mkdir -p /volume1/docker/qbittorrent/downloads
</code></pre><p>Then update <code>docker-compose.yml</code> like so:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="hl"><span class="lnt">14
</span></span><span class="hl"><span class="lnt">15
</span></span><span class="hl"><span class="lnt">16
</span></span><span class="hl"><span class="lnt">17
</span></span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="hl"><span class="lnt">21
</span></span><span class="hl"><span class="lnt">22
</span></span><span class="hl"><span class="lnt">23
</span></span><span class="hl"><span class="lnt">24
</span></span><span class="hl"><span class="lnt">25
</span></span><span class="hl"><span class="lnt">26
</span></span><span class="hl"><span class="lnt">27
</span></span><span class="hl"><span class="lnt">28
</span></span><span class="hl"><span class="lnt">29
</span></span><span class="hl"><span class="lnt">30
</span></span><span class="hl"><span class="lnt">31
</span></span><span class="hl"><span class="lnt">32
</span></span><span class="hl"><span class="lnt">33
</span></span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">gluetun</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">qmcgaw/gluetun:latest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">container_name</span><span class="p">:</span><span class="w"> </span><span class="l">gluetun</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">cap_add</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">NET_ADMIN</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">environment</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">TZ=America/Los_Angeles</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">VPN_SERVICE_PROVIDER=mullvad</span><span class="w"> </span><span class="c"># change as needed</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">VPN_TYPE=wireguard</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">WIREGUARD_PRIVATE_KEY=dGhpcyBoYXMgYmVlbiByZWRhY3RlZA==</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">WIREGUARD_ADDRESSES=10.67.205.85/32</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">SERVER_CITIES=Los Angeles CA</span><span class="w"> </span><span class="c"># change as needed</span><span class="w">
</span></span></span><span class="line hl"><span class="cl"><span class="w">    </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line hl"><span class="cl"><span class="w">      </span>- <span class="m">8080</span><span class="p">:</span><span class="m">8080</span><span class="l">/tcp</span><span class="w"> </span><span class="c"># qBittorrent WebUI</span><span class="w">
</span></span></span><span class="line hl"><span class="cl"><span class="w">      </span>- <span class="m">6881</span><span class="p">:</span><span class="m">6881</span><span class="l">/tcp</span><span class="w"> </span><span class="c"># qBittorrent torrenting</span><span class="w">
</span></span></span><span class="line hl"><span class="cl"><span class="w">      </span>- <span class="m">6881</span><span class="p">:</span><span class="m">6881</span><span class="l">/udp</span><span class="w"> </span><span class="c"># qBittorrent torrenting</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">/volume1/docker/gluetun:/gluetun</span><span class="w"> </span><span class="c"># edit if your directory is something other than `volume1`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l">unless-stopped</span><span class="w">
</span></span></span><span class="line hl"><span class="cl"><span class="w">  </span><span class="nt">qbittorrent</span><span class="p">:</span><span class="w">
</span></span></span><span class="line hl"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">linuxserver/qbittorrent:latest</span><span class="w">
</span></span></span><span class="line hl"><span class="cl"><span class="w">    </span><span class="nt">container_name</span><span class="p">:</span><span class="w"> </span><span class="l">qb</span><span class="w">
</span></span></span><span class="line hl"><span class="cl"><span class="w">    </span><span class="nt">network_mode</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;service:gluetun&#34;</span><span class="w"> </span><span class="c"># route all traffic through Gluetun (WireGuard)</span><span class="w">
</span></span></span><span class="line hl"><span class="cl"><span class="w">    </span><span class="nt">environment</span><span class="p">:</span><span class="w">
</span></span></span><span class="line hl"><span class="cl"><span class="w">      </span>- <span class="l">TZ=America/Los_Angeles</span><span class="w"> </span><span class="c"># change as needed</span><span class="w">
</span></span></span><span class="line hl"><span class="cl"><span class="w">      </span>- <span class="l">WEBUI_PORT=8080</span><span class="w">
</span></span></span><span class="line hl"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line hl"><span class="cl"><span class="w">      </span>- <span class="l">/volume1/docker/qbittorrent:/config</span><span class="w">
</span></span></span><span class="line hl"><span class="cl"><span class="w">      </span>- <span class="l">/volume1/docker/qbittorrent/downloads:/downloads</span><span class="w">
</span></span></span><span class="line hl"><span class="cl"><span class="w">    </span><span class="nt">depends_on</span><span class="p">:</span><span class="w">
</span></span></span><span class="line hl"><span class="cl"><span class="w">      </span>- <span class="l">gluetun</span><span class="w">
</span></span></span><span class="line hl"><span class="cl"><span class="w">    </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l">always</span></span></span></code></pre></td></tr></table>
</blockquote>
<p>Then run:</p>
<pre tabindex="0"><code>docker compose up -d
</code></pre><p>You&rsquo;ll see output similar to:</p>
<pre tabindex="0"><code>[+] Running 11/11
 ✔ qbittorrent 10 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled
   ✔ 7b8aceaf0e4b Pull complete
   ✔ f6a4c3e338ed Pull complete
   ✔ 52f3b2f8d37e Pull complete
   ✔ b4ab7931093f Pull complete
   ✔ ca62986f3af9 Pull complete
   ✔ 34ebc4f55bf4 Pull complete
   ✔ 3bd5231a1430 Pull complete
   ✔ c3f2c6c748f6 Pull complete
   ✔ 11edf950eb5f Pull complete
   ✔ 9e67070a5e7e Pull complete
[+] Running 2/2
 ✔ Container gluetun  Started
 ✔ Container qb       Started
</code></pre><p>qBittorrent has a web interface that can be accessed on port <code>8080</code>. Open up a web browser and go to <code>http://&lt;your-synology-ip-address&gt;:8080</code> and see if the web UI shows up. If it does, qBittorrent is running successfully and all of its network traffic will run through Gluetun and WireGuard!</p>
<blockquote><p><strong>Note:</strong></p>In the qBittorrent Web UI, you may need to go to Tools &gt; Options &gt; Advanced and set the Network interface to the correct one to establish a successful connection. In my case, the interface <code>tun0</code> was the one that worked.</blockquote>

<p>We can do one final check with the qBittorrent container to make sure it has the same IP address as the Gluetun container:</p>
<pre tabindex="0"><code>$ docker exec gluetun wget -qO- https://icanhazip.com/
23.162.40.236

$ docker exec qb wget -qO- https://icanhazip.com/
23.162.40.236
</code></pre><p>Both IP addresses are the same, which means qBittorrent is running through Gluetun and through a WireGuard connection. Everything works!</p>
<h2 id="references">References</h2>
<ul>
<li>

<a href="https://github.com/qdm12/gluetun" target="_blank" rel="noopener">https://github.com/qdm12/gluetun</a></li>
<li>

<a href="https://github.com/qdm12/gluetun-wiki/blob/main/setup/providers/mullvad.md" target="_blank" rel="noopener">https://github.com/qdm12/gluetun-wiki/blob/main/setup/providers/mullvad.md</a></li>
<li>

<a href="https://docs.linuxserver.io/images/docker-qbittorrent/" target="_blank" rel="noopener">https://docs.linuxserver.io/images/docker-qbittorrent/</a></li>
<li>a lot of trial and error</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>How to Determine the Entrypoint for a Docker Image</title>
      <link>https://nelson.cloud/how-to-determine-the-entrypoint-for-a-docker-image/?ref=rss</link>
      <pubDate>Wed, 27 Sep 2023 00:00:00 +0000</pubDate>
      <guid>https://nelson.cloud/how-to-determine-the-entrypoint-for-a-docker-image/?ref=rss</guid>
      <description>Using &lt;code&gt;docker inspect&lt;/code&gt; to determine the entrypoint for a given docker image.</description><content:encoded><![CDATA[<p>You can use <code>docker inspect</code> to determine the entrypoint of a docker image.</p>
<p>The command looks like this:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">docker inspect --type<span class="o">=</span>image --format<span class="o">=</span><span class="s1">&#39;{{json .Config.Entrypoint}}&#39;</span> &lt;image-name&gt;
</span></span></code></pre></td></tr></table>
</blockquote><p>And here&rsquo;s a real-world example (assuming you have the <code>hashicorp/terraform</code> image downloaded):</p>
<pre tabindex="0"><code>$ docker inspect --type=image --format=&#39;{{json .Config.Entrypoint}}&#39; hashicorp/terraform

[&#34;/bin/terraform&#34;]
</code></pre><p>There are some examples on the 

<a href="https://docs.docker.com/engine/reference/commandline/inspect/" target="_blank" rel="noopener">official docs</a> but none of the examples covered my use cases, so here are some additional useful <code>docker inspect</code> examples using the <code>busybox</code> image.</p>
<p>List environment variables:</p>
<pre tabindex="0"><code>$ docker inspect --type=image --format=&#39;{{json .Config.Env}}&#39; busybox

[&#34;PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin&#34;]
</code></pre><p>List the <code>CMD</code>:</p>
<pre tabindex="0"><code>$ docker inspect --type=image --format=&#39;{{json .Config.Cmd}}&#39; busybox

[&#34;sh&#34;]
</code></pre><p>Print out the architecture:</p>
<pre tabindex="0"><code>$ docker inspect --type=image --format=&#39;{{json .Architecture}}&#39; busybox

&#34;amd64&#34;
</code></pre><p>The <code>docker inspect</code> command can also be used to inspect other docker resources too, not just images. Check out the documentation for more information.</p>
<p>References:</p>
<ul>
<li>

<a href="https://docs.docker.com/engine/reference/commandline/inspect/" target="_blank" rel="noopener">https://docs.docker.com/engine/reference/commandline/inspect/</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Ignore Files Across All Subdirectories in .dockerignore</title>
      <link>https://nelson.cloud/ignore-files-across-all-subdirectories-in-.dockerignore/?ref=rss</link>
      <pubDate>Tue, 01 Nov 2022 00:00:00 +0000</pubDate>
      <guid>https://nelson.cloud/ignore-files-across-all-subdirectories-in-.dockerignore/?ref=rss</guid>
      <description>How to recursively ignore files when building Docker images.</description><content:encoded><![CDATA[<p>Ignoring files within directories using <code>.dockerignore</code> is a bit different compared to <code>.gitignore</code>.</p>
<p>To ignore a file across all subdirectories, prefix the filename with <code>**</code>.
For example, to ignore the file <code>file.txt</code> in all subdirectories, add the following to <code>.dockerignore</code>:</p>
<pre tabindex="0"><code>**file.txt
</code></pre><p>Another example to ignore <code>.DS_Store</code> files on macOS devices:</p>
<pre tabindex="0"><code>**.DS_Store
</code></pre><p>To ignore a specific file extension across all subdirectories, prefix the file extension with <code>**/*</code>. In this example, all files with the <code>.txt</code> extension will be ignored by Docker:</p>
<pre tabindex="0"><code>**/*.txt
</code></pre><p>Also, keep in mind that <code>.dockerignore</code> should be in the root of the context you are passing in to Docker or it won&rsquo;t be taken into account.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
