Das Projekt stellt eine einfache Möglichkeit dar, einem lokal laufenden Docker Container eine Domain zuzuweisen. Somit kann z.B. der Entwicklungsprozess analog zu einer Online Variante ablaufen, ohne auf einzelne Ports achten zu müssen. Die Standard-Domain lautet https://local.de. Ob Services über eine Subdomain oder Pfade freigegeben werden, ist egal.
!!!# Der Proxy läuft als normaler Docker Container und nicht als Swarm Service, da Docker Swarm nicht weiter entwickelt wird.
Der Proxy besteht aus folgenden Containern:
- Traefik Reverse Proxy: lauscht auf Port
80und443und leitet Anfragen an die entsprechenden Container weiter. Das Dashboard ist über https://proxy.local.de aufrufbar. - mkcert: erzeugt ein Wildcard TLS/SSL Zertifikat im Docker Volume
proxy_certsbzw.local-dev-proxy_certs(je nach Installationmethode). - hosts-updater: Fügt automatisch freigegebene Domains zur lokalen Datei
/etc/hostshinzu. Somit entfällt die manuell Einrichtung eines DNS Servers wie BIND oder dnsmasq.
Im Verzeichnis befindet sich ein Makefile, mit vordefinierten Befehlen. Somit muss nicht jeder Befehl gemerkt werden. Befehle können über make <befehl> aufgerufen werden. Die Docker Images werden über hub.docker.com gebaut und gehosted. Um ein Image manuell zu pushen, muss vorher ein Login auf hub.docker.com erfolgen.
# installieren
make up
# deinstallieren
make stopDer Proxy enthält ein Installationsscript, welches direkt als Docker Befehl in andere Projekte eingebettet werden kann.
## Installieren
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:ro datalyze/local-dev-proxy:installer install
# lokal: make install
## Neustart
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:ro datalyze/local-dev-proxy:installer restart
# lokal: make stop up
## Deinstallieren
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock:ro datalyze/local-dev-proxy:installer uninstall
# lokal: make uninstallUm einen Container über eine Domain bereitzustellen, muss sich dieser mit dem Proxy im selben Docker Netzwerk befinden. Zusätzlich ist es notwendig, dass bestimmte Container Labels gesetzt sind. Um die Konfiguration übersichtlicher zu gestalten, bietet sich die YAML extension-fields an.
version: '2.4'
x-labels-test: &labels-test
"traefik.enable": "true"
"traefik.port": "80"
"traefik.frontend.rule": "Host:my-test.local.de"
"traefik.frontend.headers.SSLRedirect": "true"
services:
test:
image: nginx:stable-alpine
networks:
- proxy
labels:
<< : *labels-test
networks:
proxy:
external: true
name: proxyUm eine Webseite per HTTPS Basic Auth zu schützen, kann dies direkt über die Labels eines Container erfolgen.
sudo apt update
sudo apt install apache-utils
htpasswd -n -C 31 admin
# ausgabe:
# admin:$apr1$V7ajhSVk$o/BfWK8eNPf8Kn.JiYolr0Die Ausgabe von htpasswd kann nicht direkt kopiert werden, da YAML andernfalls die $ falsch interpretiert. Dazu muss jedes $ als $$ escaped werden.
"traefik.api.frontend.auth.basic": "admin:$$apr1$$V7ajhSVk$$o/BfWK8eNPf8Kn.JiYolr0"Die Datei test.yml enthält eine Testwebseite für die Domain https://test.local.de.
# starten
make test-page
# stoppen
make test-page-stopDer Proxy funktioniert für lokale Single Node Docker Swarm Installationen. Hierfür muss der Proxy zu einem Swarm Netzwerk hinzugefügt werden und die spezifischen Labels zusätzlich als Service Labels gesetzt werden. Da der hosts-updater nicht auf Änderungen von Services reagiert, sondern nur auf Änderungen von Containern, sind sowohl Container als auch Service Labels nötig.
Da Docker Swarm nicht mehr aktiv weiterentwickelt wird und zusätzlich das Handling mit Configs und Secrets das Setup verkomplizieren kann, wird vom Einsatz abgeraten.
-
Swarm Network erstellen
make network-swarm
-
Swarm Network in der Config aktivieren
networks: proxy: external: true name: proxy proxy-swarm: external: true name: proxy-swarm
-
Networks des Proxy Service anpassen
networks: proxy: proxy-swarm:
-
Proxy neustarten
make up
version: '3.7'
x-labels-test: &labels-test
"traefik.enable": "true"
"traefik.port": "80"
"traefik.frontend.rule": "Host:my-test.local.de"
"traefik.frontend.headers.SSLRedirect": "true"
services:
test:
image: nginx:stable-alpine
networks:
- proxy
labels:
<< : *labels-test
deploy:
labels:
<< : *labels-test
networks:
proxy:
external: true
name: proxy-swarmWenn der Proxy ohne den hosts-updater verwendet werden soll, muss lokal ein DNS Server installiert und entsprechend konfiguriert werden.
Diese Variante bietet die Vorteile, dass Wildcard Auflösungen gesetzt werden können und der DNS Service leicht deaktivierbar ist.
Wird systemd verwendet, was bei vielen neueren Linux Distributionen (z.B. ab Ubuntu 16.04) der Fall ist, kollidiert die Installation mit dem systemd-resolver Service. Hier müssen dann umfangreichere Änderungen durchgeführt werden.
sudo apt update
sudo apt install dnsmasq
echo "address=/local.com/127.0.0.1" | sudo tee -a /etc/dnsmasq.conf
sudo service dnsmasq restartFolgende Anweisungen basieren auf folgender Anleitung.
sudo apt update
sudo apt install dnsmasq
sudo mkdir -p /etc/systemd/resolved.conf.d/
sudo tee /etc/systemd/resolved.conf.d/noresolved.conf << EOF
[Resolve]
DNSStubListener=no
EOF
sudo systemctl daemon-reload
sudo systemctl restart systemd-resolved
sudo rm /etc/resolv.conf
sudo tee /etc/resolv.conf << EOF
nameserver 127.0.0.1
EOF
sudo tee /etc/NetworkManager/conf.d/disableresolv.conf << EOF
[main]
dns=none
EOF
sudo systemctl restart NetworkManager
sudo tee /etc/dnsmasq.d/nmresolv.conf << EOF
resolv-file=/var/run/NetworkManager/resolv.conf
EOF
sudo systemctl stop dnsmasq
sudo systemctl start dnsmasq
echo "address=/local.com/127.0.0.1" | sudo tee -a /etc/dnsmasq.confDie mit in der jeweiligen Distribution mitgelieferten Pakete für Docker sind nicht auf dem aktuellen Stand und enthalten oft Änderungen, die den korrekten Betrieb stören können. Besser ist die Befolgung der offiziellen Anleitung.
Desweiteren sollte docker-compose ebenfalls aus der offiziellen Anleitung installiert werden.
Schlägt docker login hub.docker.com fehl und es ist sichergestellt, dass die Logindaten korrekt sind, kann die Installation der folgenden Pakete Abhilfe schaffen: sudo apt install gnupg2 pass.