Data Nexus

Infrastructure · We run it ourselves

Docker

Process isolation with the filesystem and dependencies pinned, so a program runs the same on a laptop and on a server.

The interesting use of a container is not that it deploys tidily. It is that untrusted code can run inside one without reaching the machine around it.

docker.com

01/Why this one

  1. 01

    It closes the gap between environments. 'It worked locally' stops being a diagnosis when the image is the same object in both places.


  2. 02

    Isolation is the real reason we reach for it. A scraper and a browser-driving bridge pull in a surface a web service has no use for, and giving each its own image keeps a dependency added for one of them out of the rest — the alternative is one fat base that every service inherits and nobody dares to trim.


  3. 03

    Compose files split by environment rather than one file with conditionals, so the difference between development and production is readable rather than inferred.

02/What you can check

An entry that cannot point at something you can open, run or read does not compile. That is a property of the type, not a promise in a paragraph.

In our code
carfleet/apps/{web,scraper,wa-bridge,telegram-bridge}/Dockerfile — Four services, four images, split along the lines that actually differ: a scraper and a browser-driving bridge do not inherit the base a web app needs.

In our code
mozg/compose.build.yml, compose.dev.yml, compose.override.yml — Environment differences carried in separate compose files rather than in branches inside one.
03/Where it stops

Invariant

A container is not a security boundary on its own — it shares a kernel, and an escape is a kernel bug away. Where the threat model is genuinely hostile code rather than untrusted input, the isolation has to go a level down to a virtual machine, and we say so rather than selling the container as more than it is.