{"id":82006,"date":"2026-06-19T07:30:00","date_gmt":"2026-06-19T14:30:00","guid":{"rendered":"https:\/\/dhblog.dream.press\/blog\/?p=82006"},"modified":"2026-06-19T07:30:15","modified_gmt":"2026-06-19T14:30:15","slug":"docker-and-portainer-vps","status":"publish","type":"post","link":"https:\/\/www.dreamhost.com\/blog\/docker-and-portainer-vps\/","title":{"rendered":"How To Run Docker and Portainer on a VPS (2026 Guide)"},"content":{"rendered":"<div class=\"tldr-block\" style=\"display: none;\">\n\t<div class=\"svg\">\n\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 119.25 37.8\">\n\t<g>\n\t\t<g>\n\t\t\t<path fill=\"#ffffff\" d=\"M23.4,6.93h-8.1v24.57h-7.2V6.93H0V0h23.4v6.93Z\" \/>\n\t\t\t<path fill=\"#ffffff\" d=\"M45,24.57v6.93h-18.45V0h7.2v24.57h11.25Z\" \/>\n\t\t\t<path fill=\"#ffffff\"\n\t\t\t\td=\"M90.9,15.75c0,8.91-6.61,15.75-15.3,15.75h-12.6V0h12.6c8.68,0,15.3,6.84,15.3,15.75ZM83.97,15.75c0-5.4-3.42-8.82-8.37-8.82h-5.4v17.64h5.4c4.95,0,8.37-3.42,8.37-8.82Z\" \/>\n\t\t\t<path fill=\"#ffffff\"\n\t\t\t\td=\"M105.57,21.15h-3.42v10.35h-7.2V0h12.6c5.98,0,10.8,4.81,10.8,10.8,0,3.87-2.34,7.38-5.81,9.13l6.71,11.56h-7.74l-5.94-10.35ZM102.15,14.85h5.4c1.98,0,3.6-1.75,3.6-4.05s-1.62-4.05-3.6-4.05h-5.4v8.1Z\" \/>\n\t\t<\/g>\n\t\t<path\n\t\t\tfill=\"#0173ec\"\n\t\t\td=\"M53.97,37.8h-5.4l1.8-13.27h7.2l-3.6,13.27ZM49.02,12.55c0-2.34,1.93-4.27,4.27-4.27s4.27,1.94,4.27,4.27-1.93,4.27-4.27,4.27-4.27-1.94-4.27-4.27Z\"\n\t\t \/>\n\t<\/g>\n<\/svg>\n\t<\/div>\n\t<div class=\"tldr-wrap\">\n\t\t\n\n<p class=\"wp-block-paragraph\">Running Docker on a VPS gives you portable, self-hosted apps without the per-seat pricing of managed platform as a service (PaaS). Adding Portainer puts a web UI in front of Docker so you don&#8217;t have to live in the terminal.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A 4 GB VPS handles a small stack of side-project containers comfortably \u2014 Portainer itself runs on roughly 1 GB before you load anything else. The official Portainer Community Edition install is one docker run line and is fully featured for personal projects and homelab use.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The two real gotchas every install guide skips are Portainer&#8217;s five-minute initial-admin window and the fact that Docker bypasses UFW by default. This guide walks through the install, the sizing, the security, and where Portainer earns its keep on day two.<\/p>\n\n\n\t<\/div>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Have you ever heard of <em>Dockerception<\/em>?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Well, hold onto your hat. We\u2019re going down the rabbit hole.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Portainer, the web UI you&#8217;re about to install on top of Docker, <em>is itself a Docker container<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It&#8217;s a tool that runs on the very thing it manages. You spin it up with one docker run line, and the first thing it does is reach back through a small hole in the host (a socket file) and ask the Docker daemon to show it every other container, including itself. From inside that browser tab, you can update Portainer. Restart Portainer. And manage all of your other Docker containers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>The UI you&#8217;re staring at is one click away from removing the UI you&#8217;re staring at.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On a VPS where you&#8217;re already paying for the box and already comfortable with SSH, Portainer slots in cleanly on top of Docker without changing how anything underneath works.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>That&#8217;s<\/em> the value.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A 4 GB box runs Docker, Portainer, and a small fleet of self-hosted apps without breaking a sweat. And it lands around the cost of a couple of streaming subscriptions a month. Enough to run the home automation, the family photo store, the AI assistant, and the newsletter you&#8217;ve been threatening to launch \u2014 on one server you actually own.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here\u2019s how to get it running, lock it down, and start seeing value.<\/p>\n\n\n\n<h2 id=\"h-what-is-portainer-exactly\" class=\"wp-block-heading\">What Is Portainer, Exactly?<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1600\" height=\"829\" data-src=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01-Portainer-Architecture_1x.webp\" alt=\"Portainer architecture showing Docker socket connecting portainer.io within VPN to browser for remote Docker management.\" class=\"wp-image-82009 lazyload\" data-srcset=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01-Portainer-Architecture_1x.webp 1600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01-Portainer-Architecture_1x-300x155.webp 300w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01-Portainer-Architecture_1x-1024x531.webp 1024w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01-Portainer-Architecture_1x-768x398.webp 768w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01-Portainer-Architecture_1x-1536x796.webp 1536w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01-Portainer-Architecture_1x-600x311.webp 600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01-Portainer-Architecture_1x-1200x622.webp 1200w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01-Portainer-Architecture_1x-730x378.webp 730w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01-Portainer-Architecture_1x-1460x756.webp 1460w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01-Portainer-Architecture_1x-784x406.webp 784w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01-Portainer-Architecture_1x-1568x812.webp 1568w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/01-Portainer-Architecture_1x-877x454.webp 877w\" data-sizes=\"(max-width: 1600px) 100vw, 1600px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1600px; --smush-placeholder-aspect-ratio: 1600\/829;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Portainer is a web UI that runs as a Docker container and manages your other containers through the Docker socket.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It\u2019s essentially a browser-based front end for the same Docker commands you&#8217;d otherwise type by hand, plus stack management, role-based access (if you upgrade), and a dashboard view of CPU and memory.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The socket connection is what makes it work. The bind looks like <code><strong>-v \/var\/run\/docker.sock:\/var\/run\/docker.sock<\/strong><\/code> in the install command, and that one line is doing all the heavy lifting. Without it, Portainer is a UI for an empty Docker host. With it, Portainer is the Docker host&#8217;s remote control.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One thing to keep in mind: any process that can reach <strong><code>\/var\/run\/docker.sock<\/code><\/strong> can effectively run anything as root on the host. That&#8217;s a <em>feature<\/em> when it&#8217;s Portainer doing the asking and a <em>problem<\/em> when it&#8217;s some container you spun up last week and forgot you&#8217;d given socket access to.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Treat the socket bind as a privileged capability, and audit every other container that wants one.<\/p>\n\n\n\n<div class=\"article-newsletter article-newsletter--gradient\">\n\n\n<h2>Get Content Delivered Straight to Your Inbox<\/h2><p>Subscribe now to receive all the latest updates, delivered directly to your inbox.<\/p><form class=\"nwsl-form\" id=\"newsletter_block_\" novalidate><div class=\"messages\"><\/div><div class=\"form-group\"><label for=\"input_newsletter_block_\"><input type=\"email\"name=\"email\"id=\"input_newsletter_block_\"placeholder=\"Enter your email address\"novalidatedisabled=\"disabled\"\/><\/label><button type=\"submit\"class=\"btn btn--brand\"disabled=\"disabled\"><span>Sign Me Up!<\/span><svg width=\"21\" height=\"14\" viewBox=\"0 0 21 14\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n<path d=\"M13.8523 0.42524L12.9323 1.34521C12.7095 1.56801 12.7132 1.9304 12.9404 2.14865L16.7241 5.7823H0.5625C0.251859 5.7823 0 6.03416 0 6.3448V7.6573C0 7.96794 0.251859 8.2198 0.5625 8.2198H16.7241L12.9405 11.8535C12.7132 12.0717 12.7095 12.4341 12.9323 12.6569L13.8523 13.5769C14.072 13.7965 14.4281 13.7965 14.6478 13.5769L20.8259 7.39879C21.0456 7.17913 21.0456 6.82298 20.8259 6.60327L14.6477 0.42524C14.4281 0.205584 14.0719 0.205584 13.8523 0.42524Z\" fill=\"white\"\/>\n<\/svg>\n<\/button><\/div><\/form><\/div>\n\n\n<h2 id=\"h-do-you-need-portainer-if-you-already-have-docker\" class=\"wp-block-heading\">Do You Need Portainer If You Already Have Docker?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nope. <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/blog\/what-is-docker\/\">Docker<\/a> works fine from the terminal, and plenty of people run a couple of containers for years without ever installing a UI on top.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You want Portainer if:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You&#8217;ll juggle more than two or three Docker containers across different apps.<\/li>\n\n\n\n<li>You&#8217;d rather click &#8220;restart&#8221; than retype a Compose command at 11 pm.&nbsp;<\/li>\n\n\n\n<li>You&#8217;re sharing access with someone who doesn&#8217;t live in a terminal.&nbsp;<\/li>\n\n\n\n<li>You want to deploy stack updates from a Git repo without writing a deploy script.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Skip Portainer if:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You&#8217;re running one or two containers that rarely change.&nbsp;<\/li>\n\n\n\n<li>You&#8217;re already comfortable with Docker Compose, and you\u2019re happy to stay there.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Docker itself is mainstream enough that this isn&#8217;t a fringe decision. According to the <a target=\"_blank\" href=\"https:\/\/survey.stackoverflow.co\/2025\/technology\">2025 Stack Overflow Developer Survey<\/a>, Docker is the most widely adopted container platform among developers at over 70% usage \u2014 the largest single-year jump of any technology the survey tracks. The Portainer project has roughly <a target=\"_blank\" href=\"https:\/\/github.com\/portainer\/portainer\">37,000 stars on GitHub<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Other options exist. Coolify pushes further toward PaaS-style abstractions, and Dokploy lands in similar territory with a lighter footprint \u2014 but Portainer is the one most install guides reach for first.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you live in tmux and run one app, close this tab. <em>You&#8217;re fine.<\/em> If you&#8217;re running four self-hosted apps and you&#8217;ve googled, &#8220;What are Docker logs again?&#8221; twice this month, keep reading.<\/p>\n\n\n\n<h2 id=\"h-how-big-a-vps-do-you-need-to-run-docker-and-portainer\" class=\"wp-block-heading\">How Big a VPS Do You Need To Run Docker and Portainer?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A 4 GB <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/blog\/beginners-guide-vps\/\">VPS<\/a> handles Portainer plus a small stack of side-project containers comfortably.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Portainer recommends a host with at least 2 GB of RAM and 1 CPU core, though the Portainer Server process itself idles around 100 MB. The Docker daemon adds a few hundred MB of overhead before any of your apps start.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here\u2019s how that maps to real workloads:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1600\" height=\"2120\" data-src=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02-VPS-Size-and-Workload.webp\" alt=\"Table comparing VPS workload requirements: single app needs 4 GB, Nextcloud needs 8 GB, GitLab with CI\/CD needs 16 GB RAM.\" class=\"wp-image-82010 lazyload\" data-srcset=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02-VPS-Size-and-Workload.webp 1600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02-VPS-Size-and-Workload-226x300.webp 226w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02-VPS-Size-and-Workload-773x1024.webp 773w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02-VPS-Size-and-Workload-768x1018.webp 768w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02-VPS-Size-and-Workload-1159x1536.webp 1159w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02-VPS-Size-and-Workload-1546x2048.webp 1546w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02-VPS-Size-and-Workload-600x795.webp 600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02-VPS-Size-and-Workload-1200x1590.webp 1200w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02-VPS-Size-and-Workload-730x967.webp 730w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02-VPS-Size-and-Workload-1460x1935.webp 1460w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02-VPS-Size-and-Workload-784x1039.webp 784w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02-VPS-Size-and-Workload-1568x2078.webp 1568w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/02-VPS-Size-and-Workload-877x1162.webp 877w\" data-sizes=\"(max-width: 1600px) 100vw, 1600px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1600px; --smush-placeholder-aspect-ratio: 1600\/2120;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">At DreamHost, our <a href=\"https:\/\/www.dreamhost.com\/hosting\/self-managed-vps\/\" target=\"_blank\">Self-Managed VPS<\/a> offers four RAM-based Stack tiers (Stack 4, 8, 16, and 32), with the entry-level Stack 4 sized for exactly this kind of small Docker host. (And yep, NVMe storage and full root access are included.)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;re on the fence about whether <a href=\"https:\/\/www.dreamhost.com\/blog\/self-hosting\/\" target=\"_blank\">self-hosting<\/a> is worth the time, Stack 4 is the size where the math starts working in your favor on day one.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>One note on storage:<\/strong> Portainer&#8217;s storage footprint is minimal \u2014 it stores only its own configuration database. Portainer&#8217;s own docs recommend SSD-level performance (\u22483.5 MB\/s sustained, 30,000+ IOPS, &lt;10ms write latency), which any modern NVMe drive clears comfortably. Disk only becomes a real concern if you&#8217;re running database-heavy containers like Postgres or MySQL alongside it. If your VPS is on spinning disk in 2026, the Portainer UI will feel sluggish long before RAM does. Our advice: upgrade the disk before the plan.<\/p>\n\n\n\n<h2 id=\"h-how-do-you-install-docker-and-portainer-on-a-vps\" class=\"wp-block-heading\">How Do You Install Docker and Portainer on a VPS?<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1600\" height=\"1392\" data-src=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03-Protainer.io-new-installer_1x.webp\" alt=\"Portainer.io initial setup form for creating administrator account with username, password requiring minimum 12 characters, and optional statistics collection.\" class=\"wp-image-82012 lazyload\" data-srcset=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03-Protainer.io-new-installer_1x.webp 1600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03-Protainer.io-new-installer_1x-300x261.webp 300w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03-Protainer.io-new-installer_1x-1024x891.webp 1024w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03-Protainer.io-new-installer_1x-768x668.webp 768w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03-Protainer.io-new-installer_1x-1536x1336.webp 1536w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03-Protainer.io-new-installer_1x-600x522.webp 600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03-Protainer.io-new-installer_1x-1200x1044.webp 1200w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03-Protainer.io-new-installer_1x-730x635.webp 730w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03-Protainer.io-new-installer_1x-1460x1270.webp 1460w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03-Protainer.io-new-installer_1x-784x682.webp 784w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03-Protainer.io-new-installer_1x-1568x1364.webp 1568w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/03-Protainer.io-new-installer_1x-877x763.webp 877w\" data-sizes=\"(max-width: 1600px) 100vw, 1600px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1600px; --smush-placeholder-aspect-ratio: 1600\/1392;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">It takes six steps, and roughly 30 minutes, most of it waiting for image pulls.<\/p>\n\n\n\n<h3 id=\"h-1-pick-a-linux-distribution\" class=\"wp-block-heading\">1. Pick a Linux distribution<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ubuntu 22.04 or 24.04 LTS is the path of least resistance. Ubuntu is what DreamHost\u2019s Self-Managed VPS runs by default, and most Docker install snippets and community help threads assume it. Debian and AlmaLinux work too, though.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Not sure what version of Ubuntu you\u2019re running? Learn <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/blog\/check-ubuntu-version\/\">five ways to check<\/a>.<\/p>\n\n\n\n<h3 id=\"h-2-install-docker-from-the-official-repository\" class=\"wp-block-heading\">2. Install Docker from the official repository<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Don&#8217;t <strong><code>apt install docker.io<\/code><\/strong>. That pulls an older Docker from the Ubuntu archive.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead, use Docker&#8217;s own apt repo per the <a target=\"_blank\" href=\"https:\/\/docs.docker.com\/engine\/install\/ubuntu\/\">official Docker install docs<\/a>, which adds Docker&#8217;s GPG key, the repo, and <strong>docker-ce<\/strong> plus the Compose plugin in one go.<\/p>\n\n\n\n<h3 id=\"h-3-verify-docker-is-running\" class=\"wp-block-heading\">3. Verify Docker is running<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Run <strong><code>docker run hello-world<\/code><\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you don&#8217;t get the &#8220;Hello from Docker!&#8221; message, fix the daemon before layering Portainer on top.<\/p>\n\n\n\n<h3 id=\"h-4-create-a-persistent-volume-for-portainer-s-data\" class=\"wp-block-heading\">4. Create a persistent volume for Portainer&#8217;s data<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Next, run <strong><code>docker volume create portainer_data<\/code><\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Keeping Portainer&#8217;s database on a Docker volume (not inside the container) means a Portainer upgrade won&#8217;t wipe your config.<\/p>\n\n\n\n<h3 id=\"h-5-run-portainer-community-edition\" class=\"wp-block-heading\">5. Run Portainer Community Edition<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use the official install command from <a target=\"_blank\" href=\"https:\/\/docs.portainer.io\/start\/install-ce\/server\/docker\/linux\">Portainer&#8217;s Linux install doc<\/a>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  docker run -d \n  -p 8000:8000 \n  -p 9443:9443 \n  --name portainer \n  --restart=always \n  -v \/var\/run\/docker.sock:\/var\/run\/docker.sock \n  -v portainer_data:\/data \n  portainer\/portainer-ce:lts<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Let\u2019s break that down line by line:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>-d<\/code> <\/strong>runs it detached.<\/li>\n\n\n\n<li><strong><code>-p 9443:9443<\/code><\/strong> is the Portainer web UI on HTTPS.\u00a0<\/li>\n\n\n\n<li><strong><code>-p 8000:8000<\/code> <\/strong>is the Edge Agent tunnel; you only need it if you&#8217;re going to connect remote environments (Docker, Swarm, or Kubernetes) via Edge Agents later, so drop it on a single-host install.ker hosts later, so drop it on a single-host install.\u00a0<\/li>\n\n\n\n<li><strong><code>--restart=always<\/code><\/strong> brings Portainer back up after a reboot.<\/li>\n\n\n\n<li><strong><code>-v<\/code><\/strong> flags are the socket bind and the persistent volume from step 4.\u00a0<\/li>\n\n\n\n<li><strong><code>:lts<\/code><\/strong> tag is Portainer&#8217;s Long Term Support release channel \u2014 the stable, production-recommended build.<\/li>\n<\/ul>\n\n\n\n<h3 id=\"h-6-open-the-ui-and-create-your-admin-account\" class=\"wp-block-heading\">6. Open the UI and create your admin account<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Point your browser to<strong> https:\/\/YOUR_VPS_IP:9443<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Click through the self-signed cert warning. You&#8217;ll land on the &#8220;create the initial administrator user&#8221; screen. Pick a username that isn&#8217;t admin, set a strong password, and save it somewhere real. And\u2026 you&#8217;re in!<\/p>\n\n\n\n<h2 id=\"h-why-did-portainer-just-time-out-on-me\" class=\"wp-block-heading\">Why Did Portainer Just Time Out on Me?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Because Portainer waits exactly five minutes for someone to claim it on first install. If nobody does, it locks the door.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Verbatim from <a target=\"_blank\" href=\"https:\/\/docs.portainer.io\/faqs\/installing\/i-just-installed-portainer-but-i-cant-access-the-ui-how-do-i-fix-this\">Portainer&#8217;s own FAQ<\/a>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;<em>As a security precaution, when Portainer is first installed, it will wait for 5 minutes for an administrator user to be created. If a user is not created within those 5 minutes, the Portainer Server will stop listening for requests.<\/em>&#8220;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Translation: if you spent Step 5 making a sandwich, your install is now refusing to talk to you \u2014and you didn&#8217;t do anything wrong.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The fix is simple. Run <strong><code>docker restart portainer<\/code><\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That spins the container back up, gives you another five-minute window, and drops you on the create-admin screen. Repeat as needed. Welcome to <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/blog\/self-hosting\/\">self-hosting<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;re scripting the install for a fleet (Ansible, Terraform, a deploy pipeline), Portainer accepts an <strong><code>--admin-password-file<\/code><\/strong> flag at startup that bypasses the timer entirely by creating the admin user from a file at first run. The <a href=\"https:\/\/docs.portainer.io\/start\/install-ce\/server\/docker\/linux\" target=\"_blank\">install doc<\/a> covers the syntax. For a one-off VPS install, the restart trick is fine.<\/p>\n\n\n\n<h2 id=\"h-how-do-you-stop-docker-from-bypassing-your-firewall\" class=\"wp-block-heading\">How Do You Stop Docker From Bypassing Your Firewall?<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1600\" height=\"1229\" data-src=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/04-Docker-Firewall.webp\" alt=\"Docker firewall comparison: without DOCKER-USER rule allows unrestricted container access, with DOCKER-USER rule adds firewall protection.\" class=\"wp-image-82013 lazyload\" data-srcset=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/04-Docker-Firewall.webp 1600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/04-Docker-Firewall-300x230.webp 300w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/04-Docker-Firewall-1024x787.webp 1024w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/04-Docker-Firewall-768x590.webp 768w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/04-Docker-Firewall-1536x1180.webp 1536w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/04-Docker-Firewall-600x461.webp 600w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/04-Docker-Firewall-1200x922.webp 1200w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/04-Docker-Firewall-730x561.webp 730w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/04-Docker-Firewall-1460x1121.webp 1460w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/04-Docker-Firewall-784x602.webp 784w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/04-Docker-Firewall-1568x1204.webp 1568w, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/04-Docker-Firewall-877x674.webp 877w\" data-sizes=\"(max-width: 1600px) 100vw, 1600px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1600px; --smush-placeholder-aspect-ratio: 1600\/1229;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">This one surprises people in production, not just in dev \u2014 so listen up.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When you <strong><code>docker run -p 80:80<\/code><\/strong>, the published port is reachable from the public internet even if <strong>ufw status <\/strong>shows port 80 as denied. Docker routes container traffic in the NAT table, which means that packets are diverted before they reach the <strong>INPUT<\/strong> and <strong>OUTPUT<\/strong> chains that UFW uses.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">UFW isn&#8217;t broken. It&#8217;s just standing in the wrong hallway.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The fix Docker itself recommends is the <strong>DOCKER-USER<\/strong> iptables chain, reserved for administrator rules so Docker won&#8217;t overwrite them on restart. (The rules don&#8217;t survive a full host reboot on their own \u2014 persist them with iptables-persistent or a systemd service; ufw-docker handles this for you.) The community-standard tool for wiring UFW into <strong>DOCKER-USER<\/strong> is <a target=\"_blank\" href=\"https:\/\/github.com\/chaifeng\/ufw-docker\">chaifeng\/ufw-docker<\/a>, which automates the rule generation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Install it, then verify with a port scan from outside your VPS that the ports you think are closed are actually closed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I&#8217;ve watched this catch a sharp engineer twice in the same week, first on a personal box, then on a customer&#8217;s. UFW said one thing, the public internet said another, and the truth was in iptables.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For Portainer specifically, port 9443 is published, which means the admin UI is reachable from anywhere on the public internet the moment the container starts. Two reasonable paths: restrict 9443 through <strong>DOCKER-USER<\/strong> rules (allow only your home or office IP), or <a target=\"_blank\" href=\"https:\/\/www.portainer.io\/how-to\/how-to-secure-your-portainer-installation\">front it with a VPN tunnel<\/a> like WireGuard so the UI never has a public IP at all.<\/p>\n\n\n\n<h2 id=\"h-what-should-you-lock-down-right-after-the-first-login\" class=\"wp-block-heading\">What Should You Lock Down Right After the First Login?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You\u2019re in. Five things worth doing before you close that browser tab, per Portainer&#8217;s own <a target=\"_blank\" href=\"https:\/\/www.portainer.io\/how-to\/how-to-secure-your-portainer-installation\">security guide<\/a>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Force HTTPS only.<\/strong> Portainer ships HTTPS on 9443 by default but doesn&#8217;t enforce it. Flip the toggle in <em>Settings<\/em> so the UI refuses HTTP entirely.<\/li>\n\n\n\n<li><strong>Replace the self-signed certificate.<\/strong> Upload a cert you generated, or front Portainer with an NGINX reverse proxy holding a Let&#8217;s Encrypt certificate. Past day one, clicking through the browser warning every time is a habit you&#8217;ll regret.<\/li>\n\n\n\n<li><strong>Use a real admin username.<\/strong> \u201cAdmin\u201d is the first guess in any credential-stuffing attempt. Pick something specific to you.<\/li>\n\n\n\n<li><strong>Restrict the UI to a VPN.<\/strong> WireGuard is Portainer&#8217;s own recommended pattern. A public 9443 with strong credentials is fine. A 9443 that&#8217;s only reachable on a private network is better.<\/li>\n\n\n\n<li><strong>Audit the Docker socket bind.<\/strong> Anything with read access to <strong><code>\/var\/run\/docker.sock<\/code><\/strong> can run anything as root on the host. <em>Do not<\/em> mount the socket casually into other containers. Every additional bind is a new path to the host. If a container claims it needs the socket, ask why \u2014 and consider a socket proxy if the answer is &#8220;for monitoring.&#8221;<\/li>\n<\/ul>\n\n\n\n<h2 id=\"h-how-do-you-actually-use-portainer-day-to-day\" class=\"wp-block-heading\">How Do You Actually Use Portainer Day-to-Day?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The payoff for installing Portainer is the day you stop SSH&#8217;ing in to restart a misbehaving container, and start clicking a button instead. The bigger payoff is stack management.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A Portainer stack is a multi-container app defined by a Docker Compose file. Anything you can express as a <strong>docker-compose.yml<\/strong> you can deploy as a stack, with three main routes (excluding custom templates) per the <a target=\"_blank\" href=\"https:\/\/docs.portainer.io\/user\/docker\/stacks\/add\">official stacks docs<\/a>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Paste Compose into the UI<\/li>\n\n\n\n<li>Upload a Compose file<\/li>\n\n\n\n<li>Point Portainer at a Git repository<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"2560\" height=\"1181\" data-src=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/05-How-Do-You-Actually-Use-Portainer-Day-to-Day_-scaled.gif\" alt=\"Portainer.io dashboard showing Stack Details with containers table, logs, stats, and management controls for Docker containers.\" class=\"wp-image-82014 lazyload\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 2560px; --smush-placeholder-aspect-ratio: 2560\/1181;\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The Git path is the one that matters. You point Portainer at a public or authenticated repo and a path to <strong>docker-compose.yml<\/strong>. Portainer either polls the repo on a schedule (the default is five minutes) or waits for a webhook from GitHub. When the Compose file changes upstream, Portainer pulls and redeploys automatically.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s the self-hosted version of &#8220;deploy on push&#8221; without paying a PaaS for the privilege.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The smaller daily wins add up too. Think logs in a panel instead of <strong>docker logs -f<\/strong>, one-click restarts, rebuilding a stack from a button, and resource graphs you can scan in three seconds instead of running Docker stats.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Portainer also supports remote Docker hosts through its Edge Agent, which is how a self-hosted AI assistant or media server lands across multiple boxes.<\/p>\n\n\n\n<h2 id=\"h-what-does-portainer-cost-and-when-does-free-stop-being-free\" class=\"wp-block-heading\">What Does Portainer Cost? (And When Does Free Stop Being Free?)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Portainer Community Edition is free and unlimited, period. The install you just walked through is fully featured for one host with as many containers as your VPS can fit. No node cap, no expiry, no nag screens.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Edition<\/strong><\/th><th><strong>Cost<\/strong><\/th><th><strong>Nodes<\/strong><\/th><th><strong>Best for<\/strong><\/th><\/tr><\/thead><tbody><tr><td>Community Edition<\/td><td>Free, open-source<\/td><td>Unlimited<\/td><td>Personal projects, homelab, single-VPS self-hosters<\/td><\/tr><tr><td>Business Edition (Take 3)<\/td><td>Free perpetually<\/td><td>Up to 3<\/td><td>Small homelabs that want RBAC and audit logs<\/td><\/tr><tr><td>Business Starter<\/td><td>From $99\/mo<\/td><td>5, 10, or 15<\/td><td>Small teams managing real infrastructure<\/td><\/tr><tr><td>Business Scale<\/td><td>From $199\/mo<\/td><td>Up to 25<\/td><td>Growing teams needing 9&#215;5 support<\/td><\/tr><tr><td>Enterprise<\/td><td>Quote<\/td><td>Unlimited<\/td><td>Compliance and 24\/7 needs<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The perpetual free three-node tier (called <a target=\"_blank\" href=\"https:\/\/www.portainer.io\/take-3\">Take 3<\/a>) is worth knowing about: you renew the license yearly at no cost as long as you stay at three nodes or fewer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That&#8217;s the right plan for most homelabs and small teams who want role-based access control (RBAC), audit logs, and activity logging without paying. Above that, Business Starter is $99\/mo on the <a target=\"_blank\" href=\"https:\/\/www.portainer.io\/business-enterprise-it-pricing\">Portainer business pricing page<\/a> for 5\/10\/15 nodes; Scale is $199\/mo up to 25 nodes; and Enterprise is on quote.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For almost everyone reading this, <strong>the best choice is Community Edition<\/strong>. It\u2019ll serve a single-VPS self-host for the life of the box. The Business editions only earn their keep when you&#8217;re managing real node counts, need RBAC across a team, or require commercial support for compliance.<\/p>\n\n\n\n<h2 id=\"h-should-you-add-portainer-or-skip-it\" class=\"wp-block-heading\">Should You Add Portainer or Skip It?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Here\u2019s the honest two-sentence answer:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 If you\u2019re going to share this server, deploy from Git, or run more than three containers a year from now, install Portainer while the host is fresh and your habits are still forming around it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u274c If you\u2019re running one quiet app and you\u2019re happy in the terminal, you won\u2019t miss the UI you didn\u2019t install.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The real question isn\u2019t Portainer vs. no Portainer. It\u2019s whether self-hosting is the right call for you at all \u2014 and you answered that when you opened this tab.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A 4 GB VPS, Docker, and Portainer CE get you further than most people expect \u2014 an automation stack, a photo server, a newsletter platform, and a local AI assistant \u2014 for less than you\u2019re probably paying for two streaming services you barely watch.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That\u2019s not a bad deal for a box you actually own.<\/p>\n\n\n\n<h2 id=\"h-frequently-asked-questions-about-docker-and-portainer\" class=\"wp-block-heading\">Frequently Asked Questions About Docker and Portainer<\/h2>\n\n\n\n<h3 id=\"h-what-is-portainer-used-for\" class=\"wp-block-heading\">What is Portainer used for?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Portainer is used for managing Docker, Docker Swarm, and Kubernetes containers through a web interface. It runs as a Docker container itself, connects to the host&#8217;s Docker socket, and gives you a browser view and control surface over every other container on the host \u2014starting and stopping containers, deploying multi-container stacks, viewing logs, and managing user access without SSH&#8217;ing in.<\/p>\n\n\n\n<h3 id=\"h-do-i-need-portainer-if-i-have-docker\" class=\"wp-block-heading\">Do I need Portainer if I have Docker?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No, you don&#8217;t need Portainer to use Docker. Docker works completely from the terminal, and many self-hosters never install a UI on top.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Portainer earns its keep when you&#8217;re juggling more than two or three containers, sharing access with someone who doesn&#8217;t live in a terminal, or deploying stack updates from a Git repository. Skip it if you&#8217;re running one or two stable containers and you&#8217;re comfortable with Docker Compose.<\/p>\n\n\n\n<h3 id=\"h-what-port-does-portainer-run-on\" class=\"wp-block-heading\">What port does Portainer run on?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Portainer runs on port 9443 by default for HTTPS access to the web UI, plus port 8000 for the Edge Agent tunnel if you connect remote Docker hosts later. Port 8000 is optional on a single-host install; you can drop the <strong><code>-p 8000:8000<\/code><\/strong> flag from the install command without affecting the local UI. The defaults come straight from <a href=\"https:\/\/docs.portainer.io\/start\/install-ce\/server\/docker\/linux\" target=\"_blank\">Portainer&#8217;s official Linux install doc<\/a>.<\/p>\n\n\n\n<h3 id=\"h-how-much-ram-does-portainer-need\" class=\"wp-block-heading\">How much RAM does Portainer need?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Portainer itself idles at around 100 MB before you load anything else. Add a few hundred MB for the Docker daemon, and then size from there based on what you&#8217;re actually running.<br><br>At DreamHost, we size our entry-level <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/hosting\/self-managed-vps\/\">Self-Managed VPS<\/a> at 4 GB of RAM for exactly this kind of workload \u2014 enough headroom for Portainer plus a small stack of side-project containers like <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/blog\/ghost-self-hosted\/\">Ghost<\/a>, <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/blog\/n8n-self-hosted\/\">n8n<\/a>, a Postgres database, and a reverse proxy.<\/p>\n\n\n\n<h3 id=\"h-is-portainer-free\" class=\"wp-block-heading\">Is Portainer free?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes. Portainer Community Edition is totally free, and Business Edition also has a perpetual free 3-node tier called Take 3, which renews annually at no cost as long as you stay at three nodes or fewer. Above three nodes, Business pricing starts at $99\/mo on the Starter plan per <a target=\"_blank\" href=\"https:\/\/www.portainer.io\/business-enterprise-it-pricing\">Portainer&#8217;s business pricing page<\/a>.<\/p>\n\n\n\n<h3 id=\"h-what-s-the-difference-between-portainer-ce-and-business-edition\" class=\"wp-block-heading\">What&#8217;s the difference between Portainer CE and Business Edition?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Portainer Community Edition <\/strong>is free, <a target=\"_blank\" href=\"https:\/\/www.dreamhost.com\/blog\/open-source-vs-proprietary\/\">open-source<\/a>, and fully featured for personal use.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Business Edition <\/strong>adds role-based access control, audit logs, activity logging, and commercial support, and starts at $99\/mo for 5 nodes after the perpetual free 3-node Take 3 tier.<\/p>\n\n\n\n<h3 id=\"h-can-portainer-manage-multiple-docker-hosts\" class=\"wp-block-heading\">Can Portainer manage multiple Docker hosts?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes, Portainer can manage multiple Docker hosts through Edge Agents, which run on each remote host and poll the central Portainer Server on the UI port, with port 8000 used to open a secure tunnel back for management commands. For single-VPS self-hosters, this is overkill. For anyone running three or more boxes that share a control plane, this is why 8000 is in the install line.<\/p>\n\n\n\n<h3 id=\"h-does-docker-bypass-ufw-on-a-vps\" class=\"wp-block-heading\">Does Docker bypass UFW on a VPS?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes, Docker bypasses UFW by default because Docker manages container traffic at the iptables NAT layer, which sits in front of UFW&#8217;s INPUT and OUTPUT chains.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per <a target=\"_blank\" href=\"https:\/\/docs.docker.com\/engine\/network\/packet-filtering-firewalls\/\">Docker&#8217;s packet-filtering documentation<\/a>, &#8220;Packets are diverted before it reaches the INPUT and OUTPUT chains that UFW uses.&#8221; The fix is the <strong>DOCKER-USER<\/strong> iptables chain, and the community-standard tool for wiring UFW into it is <a target=\"_blank\" href=\"https:\/\/github.com\/chaifeng\/ufw-docker\">chaifeng\/ufw-docker<\/a>.<\/p>\n\n\n\n\n<div class=\"article-cta-shared article-cta-small article-cta--product\">\n\t<div class=\"tr-img-wrap-outer jsLoading\"><img decoding=\"async\" class=\"js-img-lazy \" src=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/themes\/blog2018\/assets\/img\/lazy-loading-transparent.webp\" data-srcset=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/cta_image_a-877x522.webp 1x, https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/cta_image_a.webp 2x\"  \/><\/div>\n\n\t<a href='https:\/\/www.dreamhost.com\/hosting\/self-managed-vps\/' class='link-top' target='_blank' rel='noopener noreferrer'>\n\t\t<span>Self-Managed VPS<\/span>\n\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 384 512\" width=\"15\"><path d=\"M342.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-192 192c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L274.7 256 105.4 86.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l192 192z\"\/><\/svg>\n\t<\/a>\n\n\t<div class=\"content-btm\">\n\t\t<h2 class=\"h2--md\">\n\t\t\tOwn Your Entire Stack. Apps, AI, Databases, and More.\n\t\t<\/h2>\n\t\t<p class=\"p--md\">\n\t\t\tKeep every credential and conversation on a server you control, with NVMe speed and unmetered bandwidth built in.\n\t\t<\/p>\n\n\t\t        <a\n            href=\"https:\/\/www.dreamhost.com\/hosting\/self-managed-vps\/\"\n                        class=\"btn btn--white-outline btn--sm btn--round\"\n                                    target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            >\n                            Explore Self-Managed VPS Plans                    <\/a>\n\n\t<\/div>\n<\/div>\n\n<p><script type=\"application\/ld+json\"><br \/>\n{<br \/>\n  \"@context\": \"https:\/\/schema.org\",<br \/>\n  \"@graph\": [<br \/>\n    {<br \/>\n      \"@type\": \"FAQPage\",<br \/>\n      \"mainEntity\": [<br \/>\n        {<br \/>\n          \"@type\": \"Question\",<br \/>\n          \"name\": \"What is Portainer used for?\",<br \/>\n          \"acceptedAnswer\": {<br \/>\n            \"@type\": \"Answer\",<br \/>\n            \"text\": \"Portainer is used for managing Docker, Docker Swarm, and Kubernetes containers through a web interface. It runs as a Docker container itself, connects to the host's Docker socket, and gives you a browser view and control surface over every other container on the host \u2014 starting and stopping containers, deploying multi-container stacks, viewing logs, and managing user access without SSH'ing in.\"<br \/>\n          }<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"Question\",<br \/>\n          \"name\": \"Do I need Portainer if I have Docker?\",<br \/>\n          \"acceptedAnswer\": {<br \/>\n            \"@type\": \"Answer\",<br \/>\n            \"text\": \"No, you don't need Portainer to use Docker. Docker works completely from the terminal, and many self-hosters never install a UI on top.\"<br \/>\n          }<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"Question\",<br \/>\n          \"name\": \"What port does Portainer run on?\",<br \/>\n          \"acceptedAnswer\": {<br \/>\n            \"@type\": \"Answer\",<br \/>\n            \"text\": \"Portainer runs on port 9443 by default for HTTPS access to the web UI, plus port 8000 for the Edge Agent tunnel if you connect remote Docker hosts later.\"<br \/>\n          }<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"Question\",<br \/>\n          \"name\": \"How much RAM does Portainer need?\",<br \/>\n          \"acceptedAnswer\": {<br \/>\n            \"@type\": \"Answer\",<br \/>\n            \"text\": \"Portainer itself idles at around 100 MB before you load anything else. Add a few hundred MB for the Docker daemon, and then size from there based on what you're actually running.\"<br \/>\n          }<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"Question\",<br \/>\n          \"name\": \"Is Portainer free?\",<br \/>\n          \"acceptedAnswer\": {<br \/>\n            \"@type\": \"Answer\",<br \/>\n            \"text\": \"Yes. Portainer Community Edition is totally free, and Business Edition also has a perpetual free 3-node tier called Take 3, which renews annually at no cost as long as you stay at three nodes or fewer.\"<br \/>\n          }<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"Question\",<br \/>\n          \"name\": \"What's the difference between Portainer CE and Business Edition?\",<br \/>\n          \"acceptedAnswer\": {<br \/>\n            \"@type\": \"Answer\",<br \/>\n            \"text\": \"Portainer Community Edition is free, open-source, and fully featured for personal use. Business Edition adds role-based access control, audit logs, activity logging, and commercial support, and starts at $99\/mo for 5 nodes after the perpetual free 3-node Take 3 tier.\"<br \/>\n          }<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"Question\",<br \/>\n          \"name\": \"Can Portainer manage multiple Docker hosts?\",<br \/>\n          \"acceptedAnswer\": {<br \/>\n            \"@type\": \"Answer\",<br \/>\n            \"text\": \"Yes, Portainer can manage multiple Docker hosts through Edge Agents, which run on each remote host and poll the central Portainer Server on the UI port, with port 8000 used to open a secure tunnel back for management commands.\"<br \/>\n          }<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"Question\",<br \/>\n          \"name\": \"Does Docker bypass UFW on a VPS?\",<br \/>\n          \"acceptedAnswer\": {<br \/>\n            \"@type\": \"Answer\",<br \/>\n            \"text\": \"Yes, Docker bypasses UFW by default because Docker manages container traffic at the iptables NAT layer, which sits in front of UFW's INPUT and OUTPUT chains.\"<br \/>\n          }<br \/>\n        }<br \/>\n      ]<br \/>\n    },<br \/>\n    {<br \/>\n      \"@type\": \"HowTo\",<br \/>\n      \"name\": \"How to Install Docker and Portainer on a VPS\",<br \/>\n      \"description\": \"Install Docker and Portainer Community Edition on an Ubuntu VPS in roughly 30 minutes, from picking a Linux distribution to creating the admin account.\",<br \/>\n      \"totalTime\": \"PT30M\",<br \/>\n      \"step\": [<br \/>\n        {<br \/>\n          \"@type\": \"HowToStep\",<br \/>\n          \"position\": 1,<br \/>\n          \"name\": \"Pick a Linux distribution\",<br \/>\n          \"text\": \"Ubuntu 22.04 or 24.04 LTS is the path of least resistance. Ubuntu is what DreamHost\u2019s Self-Managed VPS runs by default, and most Docker install snippets and community help threads assume it. Debian and AlmaLinux work too, though.\"<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"HowToStep\",<br \/>\n          \"position\": 2,<br \/>\n          \"name\": \"Install Docker from the official repository\",<br \/>\n          \"text\": \"Don't apt install docker.io. That pulls an older Docker from the Ubuntu archive. Instead, use Docker's own apt repo per the official Docker install docs, which adds Docker's GPG key, the repo, and docker-ce plus the Compose plugin in one go.\"<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"HowToStep\",<br \/>\n          \"position\": 3,<br \/>\n          \"name\": \"Verify Docker is running\",<br \/>\n          \"text\": \"Run docker run hello-world. If you don't get the \"Hello from Docker!\" message, fix the daemon before layering Portainer on top.\"<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"HowToStep\",<br \/>\n          \"position\": 4,<br \/>\n          \"name\": \"Create a persistent volume for Portainer's data\",<br \/>\n          \"text\": \"Next, run docker volume create portainer_data. Keeping Portainer's database on a Docker volume (not inside the container) means a Portainer upgrade won't wipe your config.\"<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"HowToStep\",<br \/>\n          \"position\": 5,<br \/>\n          \"name\": \"Run Portainer Community Edition\",<br \/>\n          \"text\": \"Use the official install command from Portainer's Linux install doc: docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v \/var\/run\/docker.sock:\/var\/run\/docker.sock -v portainer_data:\/data portainer\/portainer-ce:lts. The -d flag runs it detached, -p 9443:9443 is the Portainer web UI on HTTPS, -p 8000:8000 is the Edge Agent tunnel you only need for connecting remote environments later, --restart=always brings Portainer back up after a reboot, the -v flags are the socket bind and the persistent volume from step 4, and the :lts tag is Portainer's Long Term Support release channel.\"<br \/>\n        },<br \/>\n        {<br \/>\n          \"@type\": \"HowToStep\",<br \/>\n          \"position\": 6,<br \/>\n          \"name\": \"Open the Portainer UI and create the admin account\",<br \/>\n          \"text\": \"Point your browser to https:\/\/YOUR_VPS_IP:9443. Click through the self-signed cert warning. You'll land on the \"create the initial administrator user\" screen. Pick a username that isn't admin, set a strong password, and save it somewhere real. And\u2026 you're in!\"<br \/>\n        }<br \/>\n      ]<br \/>\n    }<br \/>\n  ]<br \/>\n}<br \/>\n<\/script><\/p>","protected":false},"excerpt":{"rendered":"<p>Run Docker on a VPS with Portainer&#8217;s web UI in front. Install steps, sizing, security, and the gotchas every install guide skips. Roughly 30 minutes start to finish.<\/p>\n","protected":false},"author":2,"featured_media":82008,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"toc_headlines":"[[\"h-what-is-portainer-exactly\",\"What Is Portainer, Exactly?\"],[\"h-do-you-need-portainer-if-you-already-have-docker\",\"Do You Need Portainer If You Already Have Docker?\"],[\"h-how-big-a-vps-do-you-need-to-run-docker-and-portainer\",\"How Big a VPS Do You Need To Run Docker and Portainer?\"],[\"h-how-do-you-install-docker-and-portainer-on-a-vps\",\"How Do You Install Docker and Portainer on a VPS?\"],[\"h-why-did-portainer-just-time-out-on-me\",\"Why Did Portainer Just Time Out on Me?\"],[\"h-how-do-you-stop-docker-from-bypassing-your-firewall\",\"How Do You Stop Docker From Bypassing Your Firewall?\"],[\"h-what-should-you-lock-down-right-after-the-first-login\",\"What Should You Lock Down Right After the First Login?\"],[\"h-how-do-you-actually-use-portainer-day-to-day\",\"How Do You Actually Use Portainer Day-to-Day?\"],[\"h-what-does-portainer-cost-and-when-does-free-stop-being-free\",\"What Does Portainer Cost? (And When Does Free Stop Being Free?)\"],[\"h-should-you-add-portainer-or-skip-it\",\"Should You Add Portainer or Skip It?\"],[\"h-frequently-asked-questions-about-docker-and-portainer\",\"Frequently Asked Questions About Docker and Portainer\"]]","hide_toc":false,"footnotes":""},"categories":[550,804],"tags":[],"class_list":["post-82006","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","category-web-hosting"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.3 (Yoast SEO v27.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>How to Run Docker and Portainer on a VPS (2026 Guide) - DreamHost<\/title>\n<meta name=\"description\" content=\"Run Docker on a VPS with Portainer&#039;s web UI in front. Install steps, sizing, security, and the gotchas every install guide skips. Roughly 30 minutes start to finish.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dreamhost.com\/blog\/docker-and-portainer-vps\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Run Docker and Portainer on a VPS (2026 Guide)\" \/>\n<meta property=\"og:description\" content=\"Portainer runs as a Docker container and manages everything else through the Docker socket, including itself. Here&#039;s how to install it on a VPS in 30 minutes, size the box correctly, and close the two security gaps every other guide skips.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dreamhost.com\/blog\/docker-and-portainer-vps\/\" \/>\n<meta property=\"og:site_name\" content=\"DreamHost Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/DreamHost\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-19T14:30:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-19T14:30:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/1220-x-628-OGIMAGE_Run-Docker-and-Portainer-on-a-VPS-2026-Guide_1x.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"author\" content=\"Dallas Kashuba\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"Run Docker and Portainer on a VPS (2026 Guide)\" \/>\n<meta name=\"twitter:description\" content=\"Portainer runs as a Docker container and manages everything else through the Docker socket, including itself. Here&#039;s how to install it on a VPS in 30 minutes, size the box correctly, and close the two security gaps every other guide skips.\" \/>\n<meta name=\"twitter:creator\" content=\"@http:\/\/twitter.com\/dallas\" \/>\n<meta name=\"twitter:site\" content=\"@dreamhost\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Dallas Kashuba\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutes\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"How to Run Docker and Portainer on a VPS (2026 Guide) - DreamHost","description":"Run Docker on a VPS with Portainer's web UI in front. Install steps, sizing, security, and the gotchas every install guide skips. Roughly 30 minutes start to finish.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dreamhost.com\/blog\/docker-and-portainer-vps\/","og_locale":"en_US","og_type":"article","og_title":"Run Docker and Portainer on a VPS (2026 Guide)","og_description":"Portainer runs as a Docker container and manages everything else through the Docker socket, including itself. Here's how to install it on a VPS in 30 minutes, size the box correctly, and close the two security gaps every other guide skips.","og_url":"https:\/\/www.dreamhost.com\/blog\/docker-and-portainer-vps\/","og_site_name":"DreamHost Blog","article_publisher":"https:\/\/www.facebook.com\/DreamHost\/","article_published_time":"2026-06-19T14:30:00+00:00","article_modified_time":"2026-06-19T14:30:15+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/1220-x-628-OGIMAGE_Run-Docker-and-Portainer-on-a-VPS-2026-Guide_1x.webp","type":"image\/webp"}],"author":"Dallas Kashuba","twitter_card":"summary_large_image","twitter_title":"Run Docker and Portainer on a VPS (2026 Guide)","twitter_description":"Portainer runs as a Docker container and manages everything else through the Docker socket, including itself. Here's how to install it on a VPS in 30 minutes, size the box correctly, and close the two security gaps every other guide skips.","twitter_creator":"@http:\/\/twitter.com\/dallas","twitter_site":"@dreamhost","twitter_misc":{"Written by":"Dallas Kashuba","Est. reading time":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dreamhost.com\/blog\/docker-and-portainer-vps\/#article","isPartOf":{"@id":"https:\/\/www.dreamhost.com\/blog\/docker-and-portainer-vps\/"},"author":{"name":"Dallas Kashuba","@id":"https:\/\/www.dreamhost.com\/blog\/#\/schema\/person\/f6a12ad459538e8e418cf31b8b603814"},"headline":"How To Run Docker and Portainer on a VPS (2026 Guide)","datePublished":"2026-06-19T14:30:00+00:00","dateModified":"2026-06-19T14:30:15+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dreamhost.com\/blog\/docker-and-portainer-vps\/"},"wordCount":3132,"publisher":{"@id":"https:\/\/www.dreamhost.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.dreamhost.com\/blog\/docker-and-portainer-vps\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/1460x1095-BLOG-HERO-Run-Docker-and-Portainer-on-a-VPS-2026-Guide_1x.webp","articleSection":["Tutorials","Web Hosting"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.dreamhost.com\/blog\/docker-and-portainer-vps\/","url":"https:\/\/www.dreamhost.com\/blog\/docker-and-portainer-vps\/","name":"How to Run Docker and Portainer on a VPS (2026 Guide) - DreamHost","isPartOf":{"@id":"https:\/\/www.dreamhost.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dreamhost.com\/blog\/docker-and-portainer-vps\/#primaryimage"},"image":{"@id":"https:\/\/www.dreamhost.com\/blog\/docker-and-portainer-vps\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/1460x1095-BLOG-HERO-Run-Docker-and-Portainer-on-a-VPS-2026-Guide_1x.webp","datePublished":"2026-06-19T14:30:00+00:00","dateModified":"2026-06-19T14:30:15+00:00","description":"Run Docker on a VPS with Portainer's web UI in front. Install steps, sizing, security, and the gotchas every install guide skips. Roughly 30 minutes start to finish.","breadcrumb":{"@id":"https:\/\/www.dreamhost.com\/blog\/docker-and-portainer-vps\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dreamhost.com\/blog\/docker-and-portainer-vps\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dreamhost.com\/blog\/docker-and-portainer-vps\/#primaryimage","url":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/1460x1095-BLOG-HERO-Run-Docker-and-Portainer-on-a-VPS-2026-Guide_1x.webp","contentUrl":"https:\/\/www.dreamhost.com\/blog\/wp-content\/uploads\/2026\/06\/1460x1095-BLOG-HERO-Run-Docker-and-Portainer-on-a-VPS-2026-Guide_1x.webp","width":1460,"height":1095,"caption":"How To Run Docker and Portainer on a VPS (2026 Guide)"},{"@type":"BreadcrumbList","@id":"https:\/\/www.dreamhost.com\/blog\/docker-and-portainer-vps\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.dreamhost.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How To Run Docker and Portainer on a VPS (2026 Guide)"}]},{"@type":"WebSite","@id":"https:\/\/www.dreamhost.com\/blog\/#website","url":"https:\/\/www.dreamhost.com\/blog\/","name":"DreamHost Blog","description":"","publisher":{"@id":"https:\/\/www.dreamhost.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dreamhost.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.dreamhost.com\/blog\/#organization","name":"DreamHost","url":"https:\/\/www.dreamhost.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dreamhost.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/dhblog.dream.press\/blog\/wp-content\/uploads\/2019\/01\/dh_logo-blue-2.png","contentUrl":"https:\/\/dhblog.dream.press\/blog\/wp-content\/uploads\/2019\/01\/dh_logo-blue-2.png","width":1200,"height":168,"caption":"DreamHost"},"image":{"@id":"https:\/\/www.dreamhost.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/DreamHost\/","https:\/\/x.com\/dreamhost","https:\/\/www.instagram.com\/dreamhost\/","https:\/\/www.linkedin.com\/company\/dreamhost\/","https:\/\/www.youtube.com\/user\/dreamhostusa"]},{"@type":"Person","@id":"https:\/\/www.dreamhost.com\/blog\/#\/schema\/person\/f6a12ad459538e8e418cf31b8b603814","name":"Dallas Kashuba","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/05ab6fb1606be97d16c74efb0fba01b3c11e91501dc5f9661bdfbb5c5b0cd113?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/05ab6fb1606be97d16c74efb0fba01b3c11e91501dc5f9661bdfbb5c5b0cd113?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/05ab6fb1606be97d16c74efb0fba01b3c11e91501dc5f9661bdfbb5c5b0cd113?s=96&d=mm&r=g","caption":"Dallas Kashuba"},"sameAs":["http:\/\/www.idallas.com\/","https:\/\/x.com\/http:\/\/twitter.com\/dallas"],"url":"https:\/\/www.dreamhost.com\/blog\/author\/dallas\/"}]}},"lang":"en","translations":{"en":82006},"pll_sync_post":{},"_links":{"self":[{"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/posts\/82006","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/comments?post=82006"}],"version-history":[{"count":5,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/posts\/82006\/revisions"}],"predecessor-version":[{"id":82022,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/posts\/82006\/revisions\/82022"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/media\/82008"}],"wp:attachment":[{"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/media?parent=82006"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/categories?post=82006"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dreamhost.com\/blog\/wp-json\/wp\/v2\/tags?post=82006"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}