I'll get in trouble for this, but I'm going to say it anyway: Typo3 and Docker are not good friends! And here I'm going to tell you why.
Don't get me wrong: I do love Docker! It's so easy, useful, and it runs everywhere super smoothly (maybe not on Windows - but who develops with Windows anyway, right?). I also do love TYPO3, it's a very powerful CMS, super adaptable, and the documentation and community have gone a long way, since I've started using it.
However, together, they suck. It's like combining pizza and pineapple. Each of that is amazing by itself, but mixing it won't bring you much pleasure.
How Docker works
Long story short: Docker is a lightweight system that provides containers for one specific task or service. Containers should contain only one service at a time. One, not two, not three - one! For example: A web server, PHP, a database system, a bash script, or whatever—you name it. So if you want to set up a DAMP system (Docker, Apache, MySql, PHP) you should run three containers - one for each service.
It is possible to run multiple services in the same container together, but you shouldnt!
The Problem(s)
As long as you are working within a development environment, everything is fine. The real problems start when you want to deploy your system.
TYPO3, up to version 11.5, needs certain files to be available to the web server and the PHP process. I'm talking about stuff like images, CSS, JavaScript files etc. pp. This is very common throughout various frameworks and in general isn't that big of a problem. It's easy to share files between different Docker containers by using volumes. The problem here is the TYPO3 structure and how TYPO3 treats site packages.
The shared filesystem problem
TYPO3 generates a bunch of files at runtime. Think of things like compressed CSS and JavaScript bundles in typo3temp/Assets/, processed images in typo3temp/_processed_/, and user uploads in fileadmin/. All of these are written by the PHP container - but they need to be served directly by the web server container (Apache or Nginx). Since containers have isolated filesystems by default, you're immediately in trouble.
Yes, Docker volumes solve this in development. But in production you suddenly need to think about persistent storage, file ownership, user permissions across containers, and what happens when a container restarts or gets replaced. It's manageable - but it's a headache you simply don't have with a classic LAMP stack.

Site packages and asset paths
A TYPO3 site package stores its CSS, JavaScript, and images inside the extension directory - something like typo3conf/ext/my_sitepackage/Resources/Public/. Your web server needs to serve these files directly. That means your Nginx config needs to know about these paths, or you need a build step that copies everything to a shared public directory first.
Every time you add an extension or restructure your site package, your Docker and server configuration needs to reflect that change too. In a team where not everyone is a Docker wizard, this becomes a constant source of confusion - and ironic "it works on my machine" moments. Which is exactly what Docker is supposed to prevent.
TYPO3 is stateful, Docker wants stateless
The core philosophy of Docker is stateless, ephemeral containers. Spin one up, it does its job, throw it away, spin up a new one. TYPO3 is the opposite: it uses the file system as part of its application state. Uploads, generated caches, log files, session data - all of it lives on disk. Keeping that in sync across containers, especially when you want to scale horizontally, is a real architectural challenge.
Docker wants you to treat containers like cattle - replaceable and stateless. TYPO3 treats its file system like a pet - something you nurture and keep alive. That mismatch is the root of all the pain.
So... should you still use Docker with TYPO3?
For local development: absolutely yes. The benefits of a consistent dev environment still outweigh the quirks. But for production deployments, think twice. If you're not running complex infrastructure that genuinely needs containerization, a classic server setup with a proper deployment pipeline will save you a lot of Docker-related grey hairs.
In my next post I'll show you how to set up the perfect TYPO3 Docker development environment - because despite everything I just said, Docker for local TYPO3 development is still very much worth it!
And before anyone accuses me of just not understanding it: You're reading this post on a Typo3 run in docker-containers. It works - its just annoying the hell out of me!