Hi everyone !
Intro
Was a long ride since 3 years ago I started my first docker container. Learned a lot from how to build my custom image with a Dockerfile, loading my own configurations files into the container, getting along with docker-compose, traefik and YAML syntax… and and and !
However while tinkering with vaultwarden’s config and changing to postgresSQL there’s something that’s really bugging me…
Questions
- How do you/devs choose which database to use for your/their application? Are there any specific things to take into account before choosing one over another?
- Does consistency in database containers makes sense? I mean, changing all my containers to ONLY postgres (or mariaDB whatever)?
- Does it make sense to update the database image regularly? Or is the application bound to a specific version and will break after any update?
- Can I switch between one over another even if you/devs choose to use e.g. MariaDB ? Or is it baked/hardcoded into the application image and switching to another database requires extra programming skills?
Maybe not directly related to databases but that one is also bugging me for some time now:
- What’s redis role into all of this? I can’t the hell of me understand what is does and how it’s linked between the application and database. I know it’s supposed to give faster access to resources, but If I remember correctly, while playing around with Nextcloud, the redis container logs were dead silent, It seemed very “useless” or not active from my perspective. I’m always wondering “Humm redis… what are you doing here?”.
Thanks :)
You can’t decide what database to use for a container, its developers choose an engine (and sometimes a version) and code for that specific combination.
This is why it’s best to keep database containers separate even if multiple apps use Postgres, for example, because it might not be the same version of Postgres, or may be configured differently.
There isn’t that much overhead by doing so, and in return you usually benefit from the developer helping you install their database more easily.
Redis is a key-value database, it’s optimized for looking up pairs of data very fast. Postgres, Maria, SQLite are relational databases, they’re good for arranging data in tables where you can sort and filter it and set up relations between tables.
There are also many other types of databases which are optimized for various data arrangements and use cases. To decide which to use when you’re developing your own app you have to think about your data very carefully to figure out your needs.
But the reason Postgres is used so often is that it’s an excellent engine and can probably do almost anything you want so if you’re ever in doubt, pick Postgres.
Hi! Boy, I can’t wait to see the other comments.
- My database choice starts with any dependencies. Of any core complement has a preference (or requirement) for a particular DB, that’s the one I use. DB admin is probably my least favorite thing in the world, and having to manage multiple can put me entirely off a project. For this same reason, if I have a completely free choice, I’ll choose a NoSQL DB, as they’re almost always easier to admin (with the almost singular exception of embedded DBs like Sqlite). But I’m also a little biased against SQL because (a) it’s a domain specific language with some pitfalls not hard to hit with sufficient complexity; (b) each DB implementation has dialect specifics which are irritating when you have to bounce between different DBs; and © I’m simply neither confident in my knowledge, not have interest in maintaining expertise. I acknowledge the strengths of a SQL DB; it’s simply not where I want to spend my time.
- Yes, DB containers are significant. If you only use PostgreSQL, and you’re for some reason running multiple instances, those containers will share the same images. This will only save you disk space, but with people basing their images on, e.g. Ubuntu, container image sizes can be significant - GBs of space. However, if space isn’t a concern, this may not matter.
- It’s probably likely that your DB upgrades will be driven by your proglang DB interface library requirements. Personally, I wouldn’t upgrade the DB unless there’s a CVE or some other external demand, such as when the library requires it. And - yes - it can easily break your application, like any dependency. Rails is particularly horrible about tight DB version coupling, at least on PGSQL.
- If you’re careful about the SQL you craft; or the ORM or abstraction library supports it; and all your tooling (upgrade/rollback/DB initialization) supports it, then maybe you can swap out DBs with little trouble. The data migration might be the hardest part, and the older your application gets, the more fraught swapping DB backbends will become. I’d suggest that by doing this, you’re exposing yourself to a number of possible essentially runtime bugs from incompatibility or simply differences in how DBs function. You may be confident in data integrity in case of programming bugs with one DB, only to discover difficult to track down bugs because the DB handles errors differently. You might have to change libraries to use a different DB, introducing more variables and potential runtime bugs.
You can add another abstraction layer to your DB interface, and write a bunch of tests for it; if I really thought I’d ever need to change DB backbends, that’s what I’d do.
Redis is a very simply DB for very simple data. It’s a persistent key/value cache. It’s not meant to fulfill the role of a relational or structured data database. It’s meant to be for fast lookups of simple data. It has a trivial query language. It’s a hash map.