<?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/apple-touch-icon.png</url><link>https://nelson.cloud/categories/docker/</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/passteque/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/en" 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 a 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>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">ssh &lt;admin-user&gt;@&lt;synology-ip-address&gt;</span></span></code></pre></div><p>Once you&rsquo;re in, get root access to make this process easier:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">sudo -i</span></span></code></pre></div><p>If you can run <code>whoami</code> and get <code>root</code> as the output then you&rsquo;re good to go.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> whoami
</span></span><span class="line"><span class="cl"><span class="go">root
</span></span></span></code></pre></div><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>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">mkdir -p /volume1/docker/gluetun</span></span></code></pre></div><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>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> docker --version
</span></span><span class="line"><span class="cl"><span class="go">Docker version 24.0.2, build 610b8d0
</span></span></span></code></pre></div><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>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">touch /volume1/docker/docker-compose.yml</span></span></code></pre></div><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"><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></span></code></pre></div><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"><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></div><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"><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></div>
<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>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">docker compose up -d</span></span></code></pre></div><p>You&rsquo;ll see some output similar to the following:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">[+] Running 4/4
</span></span><span class="line"><span class="cl"> ✔ gluetun 3 layers [⣿⣿⣿]      0B/0B      Pulled                                                                                                            9.8s
</span></span><span class="line"><span class="cl">   ✔ 2d35ebdb57d9 Pull complete
</span></span><span class="line"><span class="cl">   ✔ af8ed9d65cfd Pull complete
</span></span><span class="line"><span class="cl">   ✔ 55e433daf0d2 Pull complete
</span></span><span class="line"><span class="cl">[+] Running 2/2
</span></span><span class="line"><span class="cl"> ✔ Network docker_default  Created
</span></span><span class="line"><span class="cl"> ✔ Container gluetun       Started</span></span></code></pre></div><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>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> docker <span class="nb">exec</span> gluetun wget -qO- https://am.i.mullvad.net/connected
</span></span><span class="line"><span class="cl"><span class="go">You are connected to Mullvad (server us-lax-wg-602). Your IP address is 23.162.40.236
</span></span></span></code></pre></div><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>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> wget -qO- https://icanhazip.com/
</span></span><span class="line"><span class="cl"><span class="go">205.154.229.24
</span></span></span></code></pre></div><p>Then run the same command against Gluetun to verify that you get a different IP address:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> docker <span class="nb">exec</span> gluetun wget -qO- https://icanhazip.com/
</span></span><span class="line"><span class="cl"><span class="go">23.162.40.236
</span></span></span></code></pre></div><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>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> mkdir -p /volume1/docker/qbittorrent/config
</span></span><span class="line"><span class="cl"><span class="gp">$</span> mkdir -p /volume1/docker/qbittorrent/downloads
</span></span></code></pre></div><p>Then update <code>docker-compose.yml</code> like so:</p>
<div class="highlight"><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></div>
<p>Then run:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">docker compose up -d</span></span></code></pre></div><p>You&rsquo;ll see output similar to:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">[+] Running 11/11
</span></span><span class="line"><span class="cl"> ✔ qbittorrent 10 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled
</span></span><span class="line"><span class="cl">   ✔ 7b8aceaf0e4b Pull complete
</span></span><span class="line"><span class="cl">   ✔ f6a4c3e338ed Pull complete
</span></span><span class="line"><span class="cl">   ✔ 52f3b2f8d37e Pull complete
</span></span><span class="line"><span class="cl">   ✔ b4ab7931093f Pull complete
</span></span><span class="line"><span class="cl">   ✔ ca62986f3af9 Pull complete
</span></span><span class="line"><span class="cl">   ✔ 34ebc4f55bf4 Pull complete
</span></span><span class="line"><span class="cl">   ✔ 3bd5231a1430 Pull complete
</span></span><span class="line"><span class="cl">   ✔ c3f2c6c748f6 Pull complete
</span></span><span class="line"><span class="cl">   ✔ 11edf950eb5f Pull complete
</span></span><span class="line"><span class="cl">   ✔ 9e67070a5e7e Pull complete
</span></span><span class="line"><span class="cl">[+] Running 2/2
</span></span><span class="line"><span class="cl"> ✔ Container gluetun  Started
</span></span><span class="line"><span class="cl"> ✔ Container qb       Started</span></span></code></pre></div><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>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> docker <span class="nb">exec</span> gluetun wget -qO- https://icanhazip.com/
</span></span><span class="line"><span class="cl"><span class="go">23.162.40.236
</span></span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="gp">$</span> docker <span class="nb">exec</span> qb wget -qO- https://icanhazip.com/
</span></span><span class="line"><span class="cl"><span class="go">23.162.40.236
</span></span></span></code></pre></div><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/passteque/gluetun" target="_blank" rel="noopener">https://github.com/passteque/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"><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></div><p>And here&rsquo;s a real-world example (assuming you have the <code>hashicorp/terraform</code> image downloaded):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> docker inspect --type<span class="o">=</span>image --format<span class="o">=</span><span class="s1">&#39;{{json .Config.Entrypoint}}&#39;</span> hashicorp/terraform
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">[&#34;/bin/terraform&#34;]
</span></span></span></code></pre></div><p>There are some examples on the 

<a href="https://docs.docker.com/reference/cli/docker/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>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> docker inspect --type<span class="o">=</span>image --format<span class="o">=</span><span class="s1">&#39;{{json .Config.Env}}&#39;</span> busybox
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">[&#34;PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin&#34;]
</span></span></span></code></pre></div><p>List the <code>CMD</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> docker inspect --type<span class="o">=</span>image --format<span class="o">=</span><span class="s1">&#39;{{json .Config.Cmd}}&#39;</span> busybox
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">[&#34;sh&#34;]
</span></span></span></code></pre></div><p>Print out the architecture:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> docker inspect --type<span class="o">=</span>image --format<span class="o">=</span><span class="s1">&#39;{{json .Architecture}}&#39;</span> busybox
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">&#34;amd64&#34;
</span></span></span></code></pre></div><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/reference/cli/docker/inspect/" target="_blank" rel="noopener">https://docs.docker.com/reference/cli/docker/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>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">**file.txt</span></span></code></pre></div><p>Another example to ignore <code>.DS_Store</code> files on macOS devices:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">**.DS_Store</span></span></code></pre></div><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>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">**/*.txt</span></span></code></pre></div><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>