I feel like this is such a common pattern at this point that there should be a much clearer go-to solution than there is. OCI containers are the lingua franca of software distribution now -- why does it seem like the only option for deploying them that claims to be "production ready" is Kubernetes?
I'm currently responsible for one environment that uses Docker Compose to do this, but it has some sharp edges and I've read enough horror stories to believe it's not a clear winner. Also unless I'm mistaken, I'm pretty sure that Docker itself recommends against this. Also there's the infamous (and deeply frustrating) iptables problem.
I'm very aware of Podman, and though I've read much of the documentation and toyed with it a bit, I've not used it in production. When I investigated a year ago it seemed like everything was about deploying things with Kubernetes manifests. Now it seems like most new reference guides are about using Podman with Kubernetes.
People who are architecting your production environment with containers on a VM: how are you doing it and is it exceedingly boring? Please share the love if so.
my container host at home uses quadlet to do container stuff directly from systemd using podman. pretty nice and simple. The only annoyance I have run into is getting it to pull conainers from a private registry without tls. This is not production in the sense that I serve a business from it, but it currently runs about 16 different local services I run at home.
It is exceedingly simple compared to anything having to do with k8s.
We do something similar, but we use docker in systemd. In order to avoid the iptables problem, we only use port publishes on localhost, like
-p 127.0.0.1:8001:80. We also run HAProxy installed directly on the host which does forwarding to the correct containers.I've even made a custom solution for zero downtime deploys and failovers where we on deploy just swap out the backend server via the admin API socket in HAProxy. For soft failover, we pause the traffic and then wait for other server to start the container, and then we swap backend and unpauses. (Pausing is done by setting
maxconn = 0).My home setup is also mostly all containerized through the use of quadlet/systemd, and probably the most important thing for me is that it all just works with incredibly minimal babysitting. I also use podman-auto-update so I don't need to worry about updates and restarts and whatnot.
this is great, thank you! I'm struggling to find The Docs, but it does look like it's on official part of podman now so that definitely bodes well
You saw this article: https://matduggan.com/replace-compose-with-quadlet/ Discussed here: https://lobste.rs/s/ss8oea/replace_docker_compose_with_quadlet_for
I don't think I did see that, or if I did I don't remember. I'm sorry, I don't follow?
It's a quadlet howto, which seems like what you were interested in.
ah ok cool, thanks!
I've also been doing the podman+systemd thing for 4.5 years. I haven't moved to quadlet yet, but now that I'm on Podman 5 I should have that option. Even doing it "the hard way" has been very reliable and manageable, but the new way definitely makes getting up and running easier.
On Arch and even Ubuntu-based systems, I have found that Podman regularly breaks after updates. It happened enough to force me to switch to Docker, which seems much more stable.
Am I the only one with this experience? Am I doing it wrong? Or is everyone on Redhat OSes, where Podman probably works more reliably?
I'm using Podman on macOS and FreeBSD. The macOS version is somewhat cheating, it's actually podman-remote and a little bit of VM management, so is actually running an Fedora CoreOS VM that runs the containers. I've not had problems with either.
docker on macOS is also using sneaky VM's in the background. Not really other way to have linux ABI, is there?
No, but there's no reason that contains have a Linux ABI. OCI has specs for Linux and Windows containers ratified. Solaris uses the Linux ABI in branded zones, but the (not yet final) FreeBSD container spec uses native FreeBSD binaries. I'd like to be able to run Darwin binaries in containers on macOS. Apple had a job ad up recently for kernel engineers to work on OCI support, so hopefully that will come soon. The immutable system image model of macOS and APFS providing lightweight CoW snapshots should mean that a lot of building blocks are there.
Been doing it on Debian for over 4 years. I think there was one update that cost me a few hours, but no, I haven't run into any kind of frequent breakage.
On second thought, I was probably using bleeding-edge Podman (even on Ubuntu) because the Debian version was really old and lacking an important feature or bugfix that I needed.
Hmm, my experience was something like that too. Issues with the networking drivers and weird almost but not quite compatibility with Docker Compose (overpromising and under delivering), etc. (can't remember everything). I tried going back to it twice but finally gave up as each time I ended up wasting hours over something, whereas Docker has always just worked. Some of my issues could have been a result of using Arch, and perhaps Podman is in a much better state these days, but I've been burned too many times by it at this point to give it another go (I don't trust it anymore) and I don't really feel like I have anything to gain from it now anyway. Rootless Docker works well enough for me.
Do you write the quadlet
.services yourself? Use some generator? Or templates you copy-paste?I'm a little surprised that no one has mentioned the most boring option possible: just run the containers.
A container is just a fancy Linux process. We have tools for running those - systemd, openRC, pick your poison.
I set this up at a previous job where the devs were all in on docker for development, but we were building a single mobile app backed so a cluster was overkill. It worked. It was boring.
Granted, inter-container networking won't work out of the box - that's probably the main affordance of compse. But honestly, if you have a dedicated machine anyway, I would consider just whacking
-net=hoston the run command.It was my understanding that Docker changed its stance about production usage some years back.
https://docs.docker.com/compose/how-tos/production/
I've been using Docker Compose + a few systemd units for awhile now without any issues. Granted it's only a small app with a few hundred users.
ah this is super great, thank you. it does appear this is an official endorsement of production use by Docker.
I see the other +1s but wanted to point out some lesser-known downsides for completeness (see the "docker-compose as a deployment mechanism" section): https://www.macchaffee.com/blog/2024/docker-compose/
I would like to add my +1 for Docker and Docker Compose. I haven't run into rough edges, and these do seem like the "simple and boring" approach.
I've sunk some time into Nix, Kubernetes, and Podman, but Docker and Compose are the only tools I actually use in production
+1 too I'm also using Docker and Docker Compose in production at ${DAYJOB} for single-server deployments for some years, no issues so far on small to not so small loads.
microk8s, k3s, and “plain old” k8s if you’re looking for orchestration - otherwise some glue + docker-compose. i think those are the best supported options out there for running containers in production
a few systems (like nomad) make this claim, but i’m suspect of anything non-k8s honestly. it just has so much market capture that it’s hard to justify picking anything else.
i think this might be similar to the reason linux is used in 99% of cases over arguably more boring systems like freebsd - compatibility, ease of googling for solutions, familiarity for new hires - in other words, market share.
choosing something like nomad means people will need to spin up on it - but tons of ppl are already familiar with k8s concepts.
k8s systems are definitely more complex in a general sense - so many moving parts! but i’d also argue that k8s-like systems are the boring choices due to the sheer mass of their userbase.
to frame this another way: if you were choosing a database for production, would you choose sqlite or postgres? postgres is certainly more complex - but its popularity kinda shoehorns it into that “boring” category.
+1 for k3s, painless setup on a multi-node cluster, minimal overhead, good stability.
I'm one of those NixOS people, so in the lab at the minute I'm using it's wrapper around oci-containers to do declarative management, in the past I've done these sorts of "big boat" arrangements with plain old docker-compose; so long as you're careful it's perfectly safe to use, it's tablesaw dangerous, not lathe dangerous.
podman-compose might be what I'd use today for small scale deployments in a non-NixOS environment; and I'd deploy K8s after that if only because it's what I know, but it is a lot.
I use nomad and it's pretty close to trivially easy. Definitely boring once running. The next person who asks me to open source the saltstates I use for my single-node nomads will make it happen.
This seems very boring to me and got into my list of solutions to consider for problems: https://github.com/containrrr/watchtower
This also seems interesting and there was a lobste.rs post about it recently https://kamal-deploy.org/ https://lobste.rs/s/sa7vbo/ruby_on_rails_37signals_future_web https://lobste.rs/s/02njfl/kamal_2_0_released https://lobste.rs/s/gax96g/supercharge_one_person_framework_with https://lobste.rs/s/zhzzjz/elixir_clustering_on_kamal_hetzner
Hi, my name is Next Person. Would love to see a worked example of Nomad, I've been meaning to check it out.
Hi next person.
https://github.com/Vaelatern/salt-states-hashistack
I agree with Nomad. Such a great piece of technology and I’ve been thoroughly impressed with it. Single binary, no fuss.
I'd definitely like to see what a single-node nomad cluster looks like. I've been contemplating that for some developer environment stuff I'm working on, and I use Saltstack on QubesOS so that'll all tie together nicely!
https://github.com/Vaelatern/salt-states-hashistack if it's helpful
That is super interesting to hear. I did explore nomad for a while, but when I looked in to it, the documentation was very explicit about not running production loads on single node clusters.
I suppose there was no merit to this in the end?
The reason to avoid doing so is that if you lose the master disk and there is only one master disk, you will end up losing your master state. This would mean you lose whatever jobs you are running and whatever state they are in.
The fewer jobs you are running, the fewer things you have set... Basically, the more that your entire state can fit in a single directory, where you can just apply it again, the easier and more robust a single mode solution is.
If you are running a thousand workers across a fleet, then having one master instance is probably not responsible. Guidance to have either 3 or 5 masters would apply. But if your only worker is the same machine, so what? It does give you a natural extension onto your second machine if you need a second machine. And if you need a thousand more machines, well, you can expand your master to be a cluster instead.
Yeah, this makes a lot of sense.
Thanks for the explanation!
I've used dokku for 10+ years in various projects. It's reliable and simple. (And yes, you can use it with pre-built images.)
https://dokku.com/
Docker compose, though Kubernetes is kinda starting to win a lot of the remaining mindshare.
Single host? Just use docker-compose. What makes you think it's not a good idea? It's extremely straightforward and works great.
it's a fair question. until other commenters pointed out that compose in production is in fact endorsed by Docker, i would have (wrongly) said that it's because it's not endorsed by docker.
beyond that, it's some combination of "feeling scared" of the iptables problem (which I think is actually entirely solved by aggressive use of docker networks) and just the face that people make when you say you're using compose in production.
If you're using
ufw, there's ufw-docker.That said, the easiest way around Docker punching holes in the network is to not publish ports on all interfaces. Instead of doing
-p 8000:8000(which exposes the service on all network interfaces), bind the services explicitly to a single interface. For example, to expose it locally on the host, use-p 127.0.0.1:8000:8000.You can then manage access using tunnels or proxies in a way that abides with your firewall rules. For example, if you're trying to expose an HTTP service, you can open just 443 on your firewall, and have a web server like Caddy, Traefik, or Nginx proxy the request to the port on localhost or whichever interface you chose.
That may be my favourite thing about using podman. I used docker with ufw-docker before, but for podman this isn't necessary.
I do still have an Nginx reverse proxy running locally. I use it to directly connect to my home server with other devices when I'm on the home network, instead of via Nginx on a VPS. This way I can easily use the same URL when I'm at home or away while not adding latency and wasting VPS bandwidth when I'm at home.
Interesting, yeah I wouldn't worry about iptables. The use of networks doesn't have to be aggressive it's like a 2-liner to set up a private network.
I run 20+ containers on my home lab server. It used to be docker-compose, but it was never working properly. I had to ssh to restart a container once a month or something.
Nowadays it is systemd+podman. It took me a while to find a good unit file template, but I never had any problems with it since. The best part is that I can put mount dependencies in my unit files and things still work reliably if zfs pool failed to mount after power crash (the only real source of instability I’m having).
I do this as well, it's been a very robust and low-maintenance solution for several years. I generate systemd service files with
podman generate systemd. I also enable thepodman-auto-updateservice which keeps my containers (marked with theio.containers.autoupdatelabel) up-to-date automatically.On Debian all of this is available by simply installing
podmanfrom the standard repositories.I might check out Quadlet though, only because I find the generated service files rather verbose.
I didn’t know about podman-auto-update, extremely useful. I prefer not to roll most of my containers but I can see a use it for few.
I was considering Quadlet/systemd templates but decided to standardize my infra around Apple pkl. Will see…
I've been also looking for a good unit file template! Could you give any pointers or a link to it?
This is the original article that I based my templates on: https://www.redhat.com/sysadmin/podman-shareable-systemd-services
Here’s the actual pkl template that I use to generate the unit file: https://github.com/mikea/declix/blob/e3f5838ed37e6aa30f143f3a5cfeb579610682ae/modules/podman.pkl#L115 (sorry for linking to my own repo)
statically generating systemd unit files is deprecated:
dynamically generating systemd unit files is where it's at these days. drop some declarative (no tedious
ExecStart=podman …anymore!).containerfiles in/etc/containers/systemd/and it's good to go. this approach was named ‘quadlet’ before it became part of podman proper; details in docsah I could not find these docs! thank you so much for linking :D
At my $workplace, we have an environment with a predictable workload running on plain old VMs. Each VM has a single Podman/Quadlet unit that manages the start of a stateless container. Manually like a sidecar inside the vm we also deploy in the same way a couple of containers: node_exporter (expose vm metrics for prometheus) and promtail (that sends journald logs to loki).
We follow a DNS naming convention with app.env.local for the application/service and machine names like env-app-01.domain and env-app-02.domain. Most of the VMs in use are part of a two-node setup.
Load balancing is handled by a plain old proxy/balancer, which was originally done with Apache's mod_proxy_balance and is now managed by HAProxy, as the container is also deployed via systemd/Quadlet on a dedicated VM.
We have two primary balancers: one for internal "horizontal" traffic (service to service) and another for external "vertical" traffic (exposed service etc). Third party paid Web App Firewall is in front of the external proxy.
As a "docker swarm single node" we have a Grafana/Prometheus/Loki stack.
Currently, there isn't a direct replacement for Docker Swarm in a single-node setup.
I'm planning to try "podman compose", which is a community tool that could help in this situation. However, I’ve read there may be issues with the new Aardvark network stack, which replaced the previous slirp4netns networking stack in Podman,
All the db are as-a-service from the infra provider.
For a small multi-node setup for on-premise deployment, my first choice would be using K3s especially if I wanted to manage the control plane, runner up for mixed on-premise and cloud: ECS Anywhere; In the cloud I would go to ECS since we are alredy on the aws bandwagon.
Deployments and updates are handled by Jenkins jobs, which typically execute an Ansible playbook.
I think this is all pretty boring and classic compared to kubernetes, and our IT people is happy because you can go to the vm, lookup the service name, find the logs all in a old fashioned way.
The only configuration for a new service besides creating the new vm is the proxy config, but pretty straightforward and fast to do.
another fantastically detailed reply, thank you so much!
i focused my question on the "on a single VM" use case because VMs have unbeatable bang-for-buck, and one of the constraints for myself and many others is money. so unfortunately managed services from cloud providers is out for me
but your comment still has great info on the VM-only use case -- thank you!
I run 2 production systems, Incus for my personal setup and Nomad at $WORK. Both are great, though at $WORK, we do multi-node Nomad.
incus which does VM's and Docker. For instance, this is how I run Redis and what was once Firefox Send on my machine:
Be sure to read the docs on running docker images under incus, there is a little setup before the above commands will just work. Incus can expand to multi-node and grow as needed.
For Nomad it's 119 line file to run Send and 148 line file to run Redis. (That's including comments) a lot of it is boilerplate, the core of it looks like this(which also uses consul for service discovery):
Both work great and are very reliable, no complaints. If you may want to also run VM's then I'd recommend Incus over Nomad. Incus can go multi-node, but I have no experience with it.
I've found the OCI spec to be a source complexity and overhead that I could get rid of. I've essentially co-opted debian as a distribution platform for dependencies and I distribute my applications to VMs as tarballs, with contents that conforms to an activation script. Each VM runs a "root" installation of debian, with a second "sub" installation of debian using
debootstrap. I develop my software against debian, sometimes against the debian OCI images. Out of that comes a list of debian package dependencies. The root debian installation has a script to merge the dependencies of all applications deployed and install those into the sub-installation. Then each application is run withbubblewrap, via systemd from the root-installation with a non-privleged user, with read-only bind-mounts to the main sub-installation directories like/usrand/lib. The purpose of that sub-installation is to facilitate multiple sub-installations, sometimes for bug hunting and sometimes for migrating to a new debian version. What I think makes this boring is how much it achieves process isolation without changing how I use the software (usually locally) where I don't require process isolation. It also effectively requires me to make sure the software can run without admin privileges.Big caveat: This has not passed a significant security review yet.
thanks for the detailed description, this is great :)
Some things about Podman I have not seen written in other comments:
I've used docker on single-node hosts for several years and employing different strategies. I've used compose, I've used Ansible, and I've used bash scripts. This has all been "boring" to me in the sense that there haven't been issues that I cannot attribute to something other than my misunderstanding of OCI containers and Docker specifically as I learned their ins and outs.
These days I'm transitioning to Podman for rootless containers and pods. As for managing the containers, I'm exploring either continuing to use Ubuntu for tighter integration with systemd using Quadlet, or Alpine Linux as a minimal host with services configured using OpenRC.
Do note that Docker did recommend against running compose in production at one point, but that's no longer the case. For most single node setups, compose is good enough unless you require complex deployment strategies, replication, etc.
There's also kamal, but I've not used it personally.
thank you for sharing! though this is adjacent to my original post, I'd love to see a detailed writeup where someone explains how they do rootless podman in production. my experience trying to set up something rootless (I can't remember what it was) was a failure, I simply couldn't get it to work.
Fortunately, setting up rootless containers in Podman is far from setting up rootless containers in Docker. Podman's documentation is a good start. Granted, I'm still exploring it but getting up and running was pretty straightforward: I created a dedicated user to run the containers and updated
/etc/subuidand/etc/subgidfor said user. Again, I have not gotten into the weeds yet but I appreciated how simple it was to get going, particularly in Alpine Linux.I would say incus. I've been very impressed with its support and you can even run docker within a container which is even cooler!
Since Incus 6.3, it can also run OCI containers in addition to system containers: https://stgraber.org/2024/07/12/announcing-incus-6-3/
I'm excited to see where Incus goes. It appears to be a very thoughtfully designed project. I'm hopeful that one day it may be able to replace Docker for my uses.
I use Portainer - in fact I just migrated 5 containers from one machine to a new one w/no drama.
I use Docker Swarm for single VM deployments with multiple containers, both at work and my home server. I've been very happy with it. It meets the boring description in that it doesn't have loads of features compared to other orchestrators. You basically get the same service, network, secrets model as compose. The reason reason for choosing it over others for me was because it's easy to pick up for people to know compose, and I couldn't expect everyone who'd be using it to know/learn something with a steep learning curve.
You can configure it using docker-compose.yml files (via the
docker stackcommand-line) or manually withdocker service xxx. It's easy to learn for people used to compose because most of the concepts map across. You have an scale up path to make your swarm cluster multi-node if you need more capacity, but single machine cluster works well.I use Traefik to load balance to containers and terminate https. You configure labels on services to configure how services are exposed publicly by Traefik.
Over compose you gain 0-downtime deploys, docker's daemon-managed secrets, on-the-fly scale up/down of service instances (but not autoscaling, you have to tell it to change).
On the downside, the error reporting when it fails to deploy a service change is not very clear. Generally if you're using the cli to deploy a stack config (compose file) you don't get error messages there, just that it's rolled back. You have to
docker service inspect xxxto find status info in the service data. This might happen if you have an auth failure pulling images, or an image has the wrong arch for example. Also if a container fails to start it can be difficult to debug, because the failed containers get cleaned up quite quickly by swarm. Finally, service containers have more restrictions on privileges than regular containers — you can't just give them host permissions for special cases that require it.There's a site which has some decent info on configuring swarm deployments. Note that the author now suggests using Kubernetes because it's so widely adopted. OTOH, because swarm is very close to compose, if swarm was ever to be killed off, you could relatively easily use compose again. https://dockerswarm.rocks/
thanks so much for the highly detailed reply :)
No worries! :)
If swarm is ever killed off you can just use docker compose and the
overlaynetwork driver.I have several personal softwares in a VPS with docker-compose in a Linode VPS. Everything worked quite smoothly and no issue. The only exposed container is a caddy instance that act as RP to the internal containers exposing web applications.
What are the corner cases that you are mentioning?
that's a good question, i'll try to answer adequately.
so there is first the "unexpected exposed ports" issue that's been addressed very helpfully in a few other comments. where if you're not using host networking but your containers in this example are on the "default" docker network, and you have a backend receiving proxied requests from a web server, you would expect that
bind 1234:8080only makes the backend reachable onlocalhost:1234but it does not -- docker rewrites your iptables rules and makes<host_IP>:1234reachable from the internet. however other commenters have offered a few helpful solutions to this (i especially like the recommendation to justbind 127.0.0.1:1234:8080because it's very easy to see what's going on when you come back to it after a few months)second is basically "the entire safe deployment story." you get nothing for free in terms of private networking, zero-downtime deployments, or service template patterns. this is reasonable from a technical perspective, but i feel jealous of the common patterns that k8s users have access to and reference guides for for all of this, and am surprised that doing the same on a single-node host seems to involve either re-deriving all of this yourself and writing all your own glue, or taking on a major dependency like incus or portainer -- despite the fact that by-number-of-deployments "multiple containers on a single host" is probably the most common deployment pattern on earth right now.
nixos provides a declarative interface: https://search.nixos.org/options?channel=unstable&show=virtualisation.oci-containers.containers&from=0&size=50&sort=relevance&type=packages&query=oci-containers.containers
I think you best option is Podman + Quadlet + their Ansible modules. It is not a drop in replacement for Docker. It works best if you update your app to use Systemd APIs like sdnotify and socket activation. The K8s manifest format can be read by podman without K8s, and you don’t even have to use that.
Running Compose mostly works. I would not recommend using their remote contexts; just copy the compose file onto the server and run it from there. Contexts have footguns where some commands still work from the server but others do not. And the environment variable resolution is very unintuitive. Secrets need to be on disk for Compose to read them. You need to write a systemd timer unit to cleanup old container images. Set the “name” explicitly in the compose file so that it doesn’t depend on the parent directory.
Zero downtime deploys are a challenge with either approach. Some options: Systemd socket activation (Podman only), nginx-proxy, Traefik (heed warnings about docker socket), DIY scripts.
Kamal is too new to be boring but solves a lot of this.
I am doing single node Kubernetes with microk8s
Hashicorp Nomad is quite nice. I've used it for several production environments at moderately high scale, and it also shrinks nicely to a single box.
I have some stuff that's been running in a high-traffic production environment with docker compose for years at this point. It is rock solid.
I have a production system that uses just docker with several containers setup on a couple VMs. Very basic containers. No docker compose but not for any good reason. It uses a Docker systemd unit. The containers restart on reboot. Watchtower for deploy of new images. A 100k or so users. These containers had slow changes of their data and fronted by a CDN. We had problems with iptables/netfilter. There are several different solutions to this. Very boring OTOH I do think of this as something I'll move off of in the future.
interesting, thank you!
are you doing some magic to do zero-downtime deployments with watchtowerr, or do you just accept the downtime during deployments?
Is it minikube?
Selfhosting is a big topic at pico.sh since this is where we see ourselves fitting in the best. For our production systems, we use docker compose with great success.
This production system also leverages services that we self-host in our own homelabs using tuns.sh and for our static sites we lean heavily on pgs.sh. For any comms between services that live outside of our databases we lean heavily on pipe. Basically, we are trying to lean on managed services while still having all of our containers running on our own VMs with docker compose and basically making everything but running containers as simple as possible to manage.
Minikube is a development sandbox, not made for production use.
Do you want to rearchitect when you need multinode? Boring is boring for as long as it works. Multinode isn't always about scale, it's often about reliability.
Do you currently control the VM configuration somehow? What you have is always more boring than something new.
Do you have any networking/proxy requirements, or do things just directly hit the port on the app? The most boring network and SSL certificates make the world more boring.
Do your apps have state? The most boring solution for state makes the world very boring.
Not exactly an answer to your question, but: at $DAYJOB we don't do this, and having experienced many production environments that do, in a variety of roles (from "keeping it running" to "explaining to the exec team why it's hard to keep running") I'm very happy we don't.
valid, thank you :)
What we do is bake base images weekly; then at deployment time, bake a fresh AMI from the base image + the branch we want to deploy. That then gets deployed to one or more EC2 instances in an ASG.
Very straightforward tooling; was set up by one of my colleagues a few years ago. Easy to learn, easy to understand, and easy to modify. Far less complex than say K8s; it's basically just some shell scripts that invoke the AWS CLI as required.
Baking an AMI is nice because deployment of brand new infra is fast.
Curious, though. What runs your applications? What exactly happens when the box boots?
The applications are just launched as systemd units; we also use units to seed data into staging environments at first boot.
I've used Ansible to run a production cluster which ran multiple docker containers on multiple machines. Works, probably will use it again if needed, but not painless IMO. It's as "boring" as it gets: a Django app, so nginx fronting a bunch of sub containers all within a specific docker network on x machines, talking to a pg hosted on another machine, proxied to by pgbouncer deployed via similar setup.
The most I had to fight with were the weird oddities around "update" and "restart" semantics. There was no docker registry here, so I had to export and load the docker images onto each of those machines. Perhaps this entire ordeal was made slightly easier since we have a load balancer and firewalls pre-setup that helped me avoid fiddling with some security stuff at least.
I prefer not using the
latestimages, but actual releases instead. I currently use diun to notify me when a new image with the desired format (e.g. SemVer) is released. I'm mostly happy with this, but I'm wondering of others have similar but better solutions?In some cases one can avoid containers altogether (kinda like Cloudflare does with V8 isolates). https://smallweb.run/ is a good example of this.
If you’re really dedicated to a Boring Technology approach, you should really consider whether you should be running the containers in a VM at all. I understand that there are situations where this is necessary, but in my experience people can believe that they need to control the underlying infrastructure in cases where in fact they do not. So, for the OP, and for posterity in this thread, do consider whether something like AWS Fargate is enough for you. The point of Boring Technology is that it really is boring. The point of Boring Technology is that (often) it will feel like de-skilling. So why not take a long hard look at your thoughts about your production system and think “perhaps a boring managed solution could be all I need”.
Dokku?