nginx dynamic SNI TCP forwarding with docker

I have a bunch of puppet docker containers. One for each environment because puppet-libs are only loaded once.
I didn't want to expose a different port for each puppet-container each time a new environment is built. The goal is to talk to each container with \.puppet fqdn.

Turns out there is a pretty simple way to realize that by putting nginx in front of them.


user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/;

events {
  worker_connections  1024;

stream {
  server {
    listen 8140;
    ssl_preread on;
    proxy_pass  $ssl_preread_server_name:8140;

External requests for \.puppet are routet to nginx. nginx does one mor DNS-lookup on docker internal resolver. If \.puppet matches a conainer-name it gets forwarded to that container.

Last update: March 22, 2021