Clean up the setup page a little
This commit is contained in:
parent
6beeb53eac
commit
08bc8dfe2a
@ -1,5 +1,7 @@
|
||||
+++
|
||||
title = 'My Setup - p1'
|
||||
subtitle = 'Containers!'
|
||||
summary = "I go over the things I've learned about docker, and how I've used it to host my website."
|
||||
date = 2024-10-25T23:11:17+03:00
|
||||
draft = false
|
||||
+++
|
||||
@ -25,71 +27,69 @@ This is a cumbersome process. The whole point of using hugo is to *focus on the
|
||||
writing*, so having to zip and reupload for every typo is... not great. I
|
||||
wanted to be able to do a simple `git push`, and not worry about the rest.
|
||||
|
||||
The previous "manual" approach also depends on me having already installed all
|
||||
The "manual" approach also depends on me having already installed all
|
||||
necessary software. If you have a dedicated server that you're running yourself,
|
||||
that's probably okay, you just have to setup once, but I'm running this on a VPS
|
||||
that I'm not sure I'll keep forever. The ability to reproduce this exact setup
|
||||
within minutes actually matters.
|
||||
|
||||
After reading a bit on this topic, I decided I would use podman for this. Docker
|
||||
After reading a bit on this topic, I decided I would use docker for this. Podman
|
||||
would work just as nicely (any containerization software would work, really),
|
||||
but I decided on podman because it can run without a daemon and without root
|
||||
privilages. Also, it has pretty neat support for kubernetes pods (which are
|
||||
honestly a lot more useful than I would've given them credit for before I started
|
||||
this whole project).
|
||||
|
||||
That's really why I'm writing this. So that you, the reader (or possibly my future self) can
|
||||
understand the methodology of podman, how to create pods, run containers and configure all
|
||||
of this automatically, and so that I may demonstrate and share what I've learnt during
|
||||
this process.
|
||||
but I decided on docker because it's been the standard for a while now
|
||||
|
||||
## Motivation
|
||||
|
||||
Basically, I'm already running a web server. Why shouldn't I also host several other services
|
||||
for friends and family while I'm at it? Why shouldn't I make the entire setup reproducable?
|
||||
Basically, I'm already running a web server. Why shouldn't I also host several
|
||||
other services for friends and family while I'm at it? Why shouldn't I make the
|
||||
entire setup reproducible?
|
||||
|
||||
Here are some of the services I wanted to self-host:
|
||||
- Web server: obviously, who doesn't want a website?
|
||||
- Some git server: having my own place to show off all the things I've done is certainly really cool.
|
||||
- Wireguard: Free VPN along with the website? sign me up.
|
||||
- CI/CD: automatic testing and releases of my software is cool, and also incredibly useful because that's
|
||||
how I plan to handle the website as well.
|
||||
|
||||
Of course, there are always more things I could be self-hosting. So it makes sense to automate
|
||||
the setup, and that's where podman comes in.
|
||||
- Web server: obviously, who doesn't want a website?
|
||||
- Some git server: having my own place to show off all the things I've done is
|
||||
certainly really cool. For this, something like [Gitea](https://about.gitea.com/)
|
||||
would normally be great. I went with [Gogs](https://gogs.io/) instead, because
|
||||
it is far more lightweight.
|
||||
- Wireguard: Free VPN along with the website? sign me up.
|
||||
- CI/CD: automatic testing and releases of my software is cool, and also
|
||||
incredibly useful.
|
||||
|
||||
## Basics of podman
|
||||
Of course, there are always more things I could be self-hosting. So it makes
|
||||
sense to automate the setup, and that's where docker comes in.
|
||||
|
||||
Before we can get to the exciting stuff, we need to go over what podman is, and how to
|
||||
use it. Essentially, podman is a container engine: it lets you build and run applications in
|
||||
a containerized environment. Containers are useful because they provide security,
|
||||
easy setup and most importantly, reproducability.
|
||||
## Basics of docker
|
||||
|
||||
Before we can get to the exciting stuff, we need to go over what docker is, and how to
|
||||
use it. Essentially, docker is a container engine: it lets you build and run
|
||||
applications in a containerized environment. Containers are useful because they
|
||||
provide security, easy setup and most importantly, reproducibility.
|
||||
|
||||
I'm not going to spend any more time explaining what containers are and why they're
|
||||
good, that's been done to death already. Right now, what matters is the actual setup,
|
||||
so let's get on with it.
|
||||
|
||||
If you've used docker before, you'll feel right at home. Many commands are unchanged
|
||||
from docker, making podman a suitable drop-in replacement. Some things like network
|
||||
from docker, making docker a suitable drop-in replacement. Some things like network
|
||||
setups tend to be a little different, but that won't matter too much right now.
|
||||
|
||||
In case you're unfamiliar with docker, here are some basic commands:
|
||||
In case you're unfamiliar with docker, here are some basic commands (run these
|
||||
either as root, or as a user in the `docker` group):
|
||||
|
||||
```sh
|
||||
# Search for container images (on docker.io unless you configure otherwise)
|
||||
$ podman search <image name>
|
||||
$ docker search <image name>
|
||||
|
||||
# Download (pull) an image from remote repo
|
||||
$ podman pull <image name>
|
||||
$ docker pull <image name>
|
||||
|
||||
# list the images you have pulled.
|
||||
$ podman images
|
||||
$ docker images
|
||||
|
||||
# run a container.
|
||||
$ podman run <image name>
|
||||
$ docker run <image name>
|
||||
|
||||
# run a container, but with a LOT of flags. I just listed the most useful ones.
|
||||
$ podman run
|
||||
$ docker run
|
||||
-i # interactive, so you can e.g. run a shell in the container
|
||||
-t # allocates a tty. useful with -i so that shell completion etc. can work
|
||||
-d # opposite of -i, detach and run in the background
|
||||
@ -99,35 +99,31 @@ $ podman run
|
||||
<command> # ... want a shell?
|
||||
|
||||
# list running containers. add -a to list ALL containers, running or stopped.
|
||||
# podman ps <-a>
|
||||
$ docker ps <-a>
|
||||
|
||||
# stop a running container.
|
||||
$ podman stop <id>
|
||||
$ docker stop <id>
|
||||
|
||||
# stopped containers don't automatically get removed. This command removes it.
|
||||
$ podman rm <id>
|
||||
$ docker rm <id>
|
||||
```
|
||||
|
||||
## Pods are nice.
|
||||
## Compose is nice.
|
||||
|
||||
Pods are basically just a collection of containers - multiple programs working
|
||||
with each other.
|
||||
Docker compose is a nice way to essentially "group together" some containers,
|
||||
and ship them in an easy way.
|
||||
|
||||
Usually, on a server, each application *isn't* totally separate from each other
|
||||
- for my own usecase, I want my git server (e.g. gogs) to automatically build
|
||||
- for my own use case, I want my git server (e.g. gogs) to automatically build
|
||||
and update my website whenever I push to its git repository. That means my git
|
||||
server and web server can't be *totally* separate, there's some amount of
|
||||
relation. Pods can help with this.
|
||||
relation.
|
||||
|
||||
Pods allow you to create a "pod" containing several containers, sharing resources
|
||||
with each other, etc. For example, I could run a pod with nginx and gogs running
|
||||
in seperate containers - then, the nginx server could act as a reverse proxy
|
||||
based on host name, showing the web page on emin.software, and the git server on
|
||||
git.emin.software. Nginx redirects to gogs which only binds to *the pod's
|
||||
localhost address*, so only nginx can reach it. Likewise, a database server can
|
||||
be added to the pod only for the git server to use, so that it can't be reached
|
||||
from the outside the pod - and it is logically grouped along with the rest of
|
||||
the pod.
|
||||
At the same time... I don't really want to set up both containers, then their
|
||||
volumes, and their ports etc. by hand. Sure I could stick it in a shell script,
|
||||
but that's hardly elegant.
|
||||
|
||||
On top of this, pods can be built purely from a kubernetes-compatible
|
||||
configuration file, so setting them up is relatively easy.
|
||||
Docker compose helps with this: you can create a
|
||||
`compose.yaml` file, and define containers, ports, volumes, secrets all inside
|
||||
this file. Then, when you run `docker compose up` this configuration is read,
|
||||
and all of it is processed as you would want it to.
|
||||
|
@ -13,7 +13,7 @@
|
||||
<link>https://emin.software/posts/setup_p1/</link>
|
||||
<pubDate>Fri, 25 Oct 2024 23:11:17 +0300</pubDate>
|
||||
<guid>https://emin.software/posts/setup_p1/</guid>
|
||||
<description>My Setup In this &lsquo;series&rsquo; I will be walking you through my process of how I host everything on this server.
I&rsquo;m currently running, on top of my blog, a gogs instance.
When first creating this website, I just had my blog. I generated this blog using hugo: a static site generator. Hugo allowed me to focus on writing whatever I wanted in Markdown format, it would take care of converting my writing into HTML and CSS.</description>
|
||||
<description>I go over the things I&rsquo;ve learned about docker, and how I&rsquo;ve used it to host my website.</description>
|
||||
</item>
|
||||
<item>
|
||||
<title>About</title>
|
||||
|
@ -158,9 +158,7 @@
|
||||
My Setup - p1
|
||||
</h4>
|
||||
<p class="mb-4 line-clamp-6 text-base text-slate-500 dark:text-slate-400">
|
||||
My Setup In this ‘series’ I will be walking you through my process of how I host everything on this server.
|
||||
I’m currently running, on top of my blog, a gogs instance.
|
||||
When first creating this website, I just had my blog. I generated this blog using hugo: a static site generator. Hugo allowed me to focus on writing whatever I wanted in Markdown format, it would take care of converting my writing into HTML and CSS.
|
||||
I go over the things I’ve learned about docker, and how I’ve used it to host my website.
|
||||
</p>
|
||||
</div>
|
||||
<div class="flex flex-row justify-between">
|
||||
|
@ -13,7 +13,7 @@
|
||||
<link>https://emin.software/posts/setup_p1/</link>
|
||||
<pubDate>Fri, 25 Oct 2024 23:11:17 +0300</pubDate>
|
||||
<guid>https://emin.software/posts/setup_p1/</guid>
|
||||
<description>My Setup In this &lsquo;series&rsquo; I will be walking you through my process of how I host everything on this server.
I&rsquo;m currently running, on top of my blog, a gogs instance.
When first creating this website, I just had my blog. I generated this blog using hugo: a static site generator. Hugo allowed me to focus on writing whatever I wanted in Markdown format, it would take care of converting my writing into HTML and CSS.</description>
|
||||
<description>I go over the things I&rsquo;ve learned about docker, and how I&rsquo;ve used it to host my website.</description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
|
@ -46,9 +46,7 @@
|
||||
<meta property="og:url" content="https://emin.software/posts/setup_p1/">
|
||||
<meta property="og:site_name" content="haxala1r">
|
||||
<meta property="og:title" content="My Setup - p1">
|
||||
<meta property="og:description" content="My Setup In this ‘series’ I will be walking you through my process of how I host everything on this server.
|
||||
I’m currently running, on top of my blog, a gogs instance.
|
||||
When first creating this website, I just had my blog. I generated this blog using hugo: a static site generator. Hugo allowed me to focus on writing whatever I wanted in Markdown format, it would take care of converting my writing into HTML and CSS.">
|
||||
<meta property="og:description" content="I go over the things I’ve learned about docker, and how I’ve used it to host my website.">
|
||||
<meta property="og:locale" content="en_us">
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="article:section" content="posts">
|
||||
@ -58,9 +56,7 @@ When first creating this website, I just had my blog. I generated this blog usin
|
||||
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:title" content="My Setup - p1">
|
||||
<meta name="twitter:description" content="My Setup In this ‘series’ I will be walking you through my process of how I host everything on this server.
|
||||
I’m currently running, on top of my blog, a gogs instance.
|
||||
When first creating this website, I just had my blog. I generated this blog using hugo: a static site generator. Hugo allowed me to focus on writing whatever I wanted in Markdown format, it would take care of converting my writing into HTML and CSS.">
|
||||
<meta name="twitter:description" content="I go over the things I’ve learned about docker, and how I’ve used it to host my website.">
|
||||
|
||||
|
||||
<script>
|
||||
@ -154,7 +150,7 @@ When first creating this website, I just had my blog. I generated this blog usin
|
||||
My Setup - p1
|
||||
</h1>
|
||||
<h2 class="mt-4 text-2xl text-slate-500 dark:text-slate-400">
|
||||
|
||||
Containers!
|
||||
</h2>
|
||||
<div class="mb-4 mt-2 text-sm text-slate-500 dark:text-slate-400">
|
||||
Oct 25, 2024 - 5 minute read
|
||||
@ -180,58 +176,58 @@ updated version to my server and put it in the web directory.</p>
|
||||
<p>This is a cumbersome process. The whole point of using hugo is to <em>focus on the
|
||||
writing</em>, so having to zip and reupload for every typo is… not great. I
|
||||
wanted to be able to do a simple <code>git push</code>, and not worry about the rest.</p>
|
||||
<p>The previous “manual” approach also depends on me having already installed all
|
||||
<p>The “manual” approach also depends on me having already installed all
|
||||
necessary software. If you have a dedicated server that you’re running yourself,
|
||||
that’s probably okay, you just have to setup once, but I’m running this on a VPS
|
||||
that I’m not sure I’ll keep forever. The ability to reproduce this exact setup
|
||||
within minutes actually matters.</p>
|
||||
<p>After reading a bit on this topic, I decided I would use podman for this. Docker
|
||||
<p>After reading a bit on this topic, I decided I would use docker for this. Podman
|
||||
would work just as nicely (any containerization software would work, really),
|
||||
but I decided on podman because it can run without a daemon and without root
|
||||
privilages. Also, it has pretty neat support for kubernetes pods (which are
|
||||
honestly a lot more useful than I would’ve given them credit for before I started
|
||||
this whole project).</p>
|
||||
<p>That’s really why I’m writing this. So that you, the reader (or possibly my future self) can
|
||||
understand the methodology of podman, how to create pods, run containers and configure all
|
||||
of this automatically, and so that I may demonstrate and share what I’ve learnt during
|
||||
this process.</p>
|
||||
but I decided on docker because it’s been the standard for a while now</p>
|
||||
<h2 id="motivation">Motivation</h2>
|
||||
<p>Basically, I’m already running a web server. Why shouldn’t I also host several other services
|
||||
for friends and family while I’m at it? Why shouldn’t I make the entire setup reproducable?</p>
|
||||
<p>Here are some of the services I wanted to self-host:
|
||||
- Web server: obviously, who doesn’t want a website?
|
||||
- Some git server: having my own place to show off all the things I’ve done is certainly really cool.
|
||||
- Wireguard: Free VPN along with the website? sign me up.
|
||||
- CI/CD: automatic testing and releases of my software is cool, and also incredibly useful because that’s
|
||||
how I plan to handle the website as well.</p>
|
||||
<p>Of course, there are always more things I could be self-hosting. So it makes sense to automate
|
||||
the setup, and that’s where podman comes in.</p>
|
||||
<h2 id="basics-of-podman">Basics of podman</h2>
|
||||
<p>Before we can get to the exciting stuff, we need to go over what podman is, and how to
|
||||
use it. Essentially, podman is a container engine: it lets you build and run applications in
|
||||
a containerized environment. Containers are useful because they provide security,
|
||||
easy setup and most importantly, reproducability.</p>
|
||||
<p>Basically, I’m already running a web server. Why shouldn’t I also host several
|
||||
other services for friends and family while I’m at it? Why shouldn’t I make the
|
||||
entire setup reproducible?</p>
|
||||
<p>Here are some of the services I wanted to self-host:</p>
|
||||
<ul>
|
||||
<li>Web server: obviously, who doesn’t want a website?</li>
|
||||
<li>Some git server: having my own place to show off all the things I’ve done is
|
||||
certainly really cool. For this, something like <a href="https://about.gitea.com/">Gitea</a>
|
||||
would normally be great. I went with <a href="https://gogs.io/">Gogs</a> instead, because
|
||||
it is far more lightweight.</li>
|
||||
<li>Wireguard: Free VPN along with the website? sign me up.</li>
|
||||
<li>CI/CD: automatic testing and releases of my software is cool, and also
|
||||
incredibly useful.</li>
|
||||
</ul>
|
||||
<p>Of course, there are always more things I could be self-hosting. So it makes
|
||||
sense to automate the setup, and that’s where docker comes in.</p>
|
||||
<h2 id="basics-of-docker">Basics of docker</h2>
|
||||
<p>Before we can get to the exciting stuff, we need to go over what docker is, and how to
|
||||
use it. Essentially, docker is a container engine: it lets you build and run
|
||||
applications in a containerized environment. Containers are useful because they
|
||||
provide security, easy setup and most importantly, reproducibility.</p>
|
||||
<p>I’m not going to spend any more time explaining what containers are and why they’re
|
||||
good, that’s been done to death already. Right now, what matters is the actual setup,
|
||||
so let’s get on with it.</p>
|
||||
<p>If you’ve used docker before, you’ll feel right at home. Many commands are unchanged
|
||||
from docker, making podman a suitable drop-in replacement. Some things like network
|
||||
from docker, making docker a suitable drop-in replacement. Some things like network
|
||||
setups tend to be a little different, but that won’t matter too much right now.</p>
|
||||
<p>In case you’re unfamiliar with docker, here are some basic commands:</p>
|
||||
<p>In case you’re unfamiliar with docker, here are some basic commands (run these
|
||||
either as root, or as a user in the <code>docker</code> group):</p>
|
||||
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#75715e"># Search for container images (on docker.io unless you configure otherwise)</span>
|
||||
</span></span><span style="display:flex;"><span>$ podman search <image name>
|
||||
</span></span><span style="display:flex;"><span>$ docker search <image name>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Download (pull) an image from remote repo</span>
|
||||
</span></span><span style="display:flex;"><span>$ podman pull <image name>
|
||||
</span></span><span style="display:flex;"><span>$ docker pull <image name>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#75715e"># list the images you have pulled.</span>
|
||||
</span></span><span style="display:flex;"><span>$ podman images
|
||||
</span></span><span style="display:flex;"><span>$ docker images
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#75715e"># run a container.</span>
|
||||
</span></span><span style="display:flex;"><span>$ podman run <image name>
|
||||
</span></span><span style="display:flex;"><span>$ docker run <image name>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#75715e"># run a container, but with a LOT of flags. I just listed the most useful ones.</span>
|
||||
</span></span><span style="display:flex;"><span>$ podman run
|
||||
</span></span><span style="display:flex;"><span>$ docker run
|
||||
</span></span><span style="display:flex;"><span> -i <span style="color:#75715e"># interactive, so you can e.g. run a shell in the container</span>
|
||||
</span></span><span style="display:flex;"><span> -t <span style="color:#75715e"># allocates a tty. useful with -i so that shell completion etc. can work</span>
|
||||
</span></span><span style="display:flex;"><span> -d <span style="color:#75715e"># opposite of -i, detach and run in the background</span>
|
||||
@ -241,34 +237,30 @@ setups tend to be a little different, but that won’t matter too much right
|
||||
</span></span><span style="display:flex;"><span> <command> <span style="color:#75715e"># ... want a shell?</span>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#75715e"># list running containers. add -a to list ALL containers, running or stopped.</span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#75715e"># podman ps <-a></span>
|
||||
</span></span><span style="display:flex;"><span>$ docker ps <-a>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#75715e"># stop a running container.</span>
|
||||
</span></span><span style="display:flex;"><span>$ podman stop <id>
|
||||
</span></span><span style="display:flex;"><span>$ docker stop <id>
|
||||
</span></span><span style="display:flex;"><span>
|
||||
</span></span><span style="display:flex;"><span><span style="color:#75715e"># stopped containers don't automatically get removed. This command removes it.</span>
|
||||
</span></span><span style="display:flex;"><span>$ podman rm <id>
|
||||
</span></span></code></pre></div><h2 id="pods-are-nice">Pods are nice.</h2>
|
||||
<p>Pods are basically just a collection of containers - multiple programs working
|
||||
with each other.</p>
|
||||
</span></span><span style="display:flex;"><span>$ docker rm <id>
|
||||
</span></span></code></pre></div><h2 id="compose-is-nice">Compose is nice.</h2>
|
||||
<p>Docker compose is a nice way to essentially “group together” some containers,
|
||||
and ship them in an easy way.</p>
|
||||
<p>Usually, on a server, each application <em>isn’t</em> totally separate from each other</p>
|
||||
<ul>
|
||||
<li>for my own usecase, I want my git server (e.g. gogs) to automatically build
|
||||
<li>for my own use case, I want my git server (e.g. gogs) to automatically build
|
||||
and update my website whenever I push to its git repository. That means my git
|
||||
server and web server can’t be <em>totally</em> separate, there’s some amount of
|
||||
relation. Pods can help with this.</li>
|
||||
relation.</li>
|
||||
</ul>
|
||||
<p>Pods allow you to create a “pod” containing several containers, sharing resources
|
||||
with each other, etc. For example, I could run a pod with nginx and gogs running
|
||||
in seperate containers - then, the nginx server could act as a reverse proxy
|
||||
based on host name, showing the web page on emin.software, and the git server on
|
||||
git.emin.software. Nginx redirects to gogs which only binds to <em>the pod’s
|
||||
localhost address</em>, so only nginx can reach it. Likewise, a database server can
|
||||
be added to the pod only for the git server to use, so that it can’t be reached
|
||||
from the outside the pod - and it is logically grouped along with the rest of
|
||||
the pod.</p>
|
||||
<p>On top of this, pods can be built purely from a kubernetes-compatible
|
||||
configuration file, so setting them up is relatively easy.</p>
|
||||
<p>At the same time… I don’t really want to set up both containers, then their
|
||||
volumes, and their ports etc. by hand. Sure I could stick it in a shell script,
|
||||
but that’s hardly elegant.</p>
|
||||
<p>Docker compose helps with this: you can create a
|
||||
<code>compose.yaml</code> file, and define containers, ports, volumes, secrets all inside
|
||||
this file. Then, when you run <code>docker compose up</code> this configuration is read,
|
||||
and all of it is processed as you would want it to.</p>
|
||||
|
||||
</span>
|
||||
</article>
|
||||
|
Loading…
Reference in New Issue
Block a user