Virtueller Desktop in Docker + Internet Browserzugriff
Spätestens jetzt habe ich wirklich keinen Bedarf mehr für einen VPN- Tunnel ins eigene Heimnetzwerk: Eine Desktop Infrastructure (CDI) ermöglicht mir den Zugriff von einem Browser direkt auf eine virtuelle Linux-Arbeitsfläche im eigenen Netzwerk: Bereitgestellt über einen Container.
Docker Basics
Docker ermöglicht es, Services oder Applikationen per Befehl in einem sogenannten Container zu starten.Ein Container ist eine vom Betriebssystem (OS) unabhängige isolierte Umgebung:
Beim ersten Start eines Containers, lädt Docker selbstständig alle notwendigen Quellen
aus dem Internet.
Docker kann unter Windows, macOS oder einer Linux-Distribution installiert werden,
siehe auch: Docker
Für den Start reicht ein simpler docker run - Befehl und der Desktop kann über den Browser mit Port 6901 erreicht werden:
sudo docker run --rm -it --shm-size=512m -p 6901:6901 -e VNC_PW=password kasmweb/desktop:1.15.0
Damit Kasm Desktop sicher vom Internet erreicht werden kann, setze ich Traefik als Let's Encrypt Reverse-Proxy ein.
Der Reverse-Proxy stellt eine verschlüsselte HTTPS-Verbindung zur Verfügung und ermöglicht es mehrere Websites auf einem Server zu betreiben. Alternativ zu einem Reverse-Proxy kann auch ein Cloudflare-Tunnel für das Veröffentlichen von Webservices aus dem eigenen Netzwerk verwendet werden:
Schritt für Schritt Kasm Desktop in Docker inklusive Zugriff vom Internet
Hardwareanforderung:
Voraussetzungen für den Internetzugriff:
Nachdem der hier vorgestellt Container https mit einem Self-Signed Zertifikat verwendet, benötigt Traefik als Voraussetzungen folgende zusätzliche Option:
siehe auch: Cloudflare oder Reverse Proxy
- '--serverstransport.insecureskipverify'
Docker-Compose YAML mit Zugriff über das Internet
version: "3.8"
services:
kasmweb:
image: kasmweb/desktop:1.15.0
#Labels für ReverseProxy, siehe: https://www.libe.net/traefik
labels:
- "traefik.enable=true"
- "traefik.http.routers.workspace.rule=Host(`workspace.domain.tld`)"
- "traefik.http.routers.workspace.entrypoints=web"
- "traefik.http.routers.workspace.entrypoints=websecure"
- "traefik.http.routers.workspace.tls=true"
- "traefik.http.routers.workspace.tls.certresolver=myresolver"
- "traefik.http.services.workspace.loadbalancer.server.scheme=https"
- "traefik.http.services.workspace.loadbalancer.server.port=6901"
- "traefik.http.routers.workspace.middlewares=forward-auth-verify"
volumes:
- ./profile:/home/kasm-user
shm_size: '1g'
restart: always
environment:
- VNC_PW=password
expose:
- "6901"
#Für einen direkten Test-Zugriff, in den folgenden 2 Zeilen "#" entfernen. Aufruf: http://localhost:83 oder http://ServerIP:83
ports:
- "6901:6901"
#Ohne dem Einsatz eines Reverse Proxy (https://www.libe.net/traefik) fehlt voraussichtlich das Netzwerk webproxy
#und die folgenden Zeilen können entfernt oder auskommentiert werden. Alternativ kann das Netzwerk mit "docker network create webproxy" erstellt werden
networks:
default:
external:
name: webproxy
Die Datei verwendet keine Volumes, sondern Unterordner unterhalb der Datei docker-compose.yml. Siehe: Docker Daten speichern: Docker Volumes vs. Host-Ordner. Für den Aufruf aus dem Internet verwende ich zusätzlich zum Benutzernamen und dem Passwort eine Anmeldung über das Google-Konto. Verantwortlich dafür ist eine eigene Middleware, welche über das Label: "traefik.http.routers.workspace.middlewares=forward-auth-verify" zwischengeschaltet wird. Siehe: Traefik und oAuth: Eigene Webservices mit Google anmelden.
Starten - docker compose up
In dem Beispiel werden die Profildaten auf einen persistenten Ordner umgeleitet. Als Voraussetzung muss dieser vor dem eigentlichen Start angelegt werden:
mkdir profile
sudo chmod 777 ./profile/ -R
docker compose up -d
Root Berechtigungen
Um im Desktop ohne Passwort zum Root-Account wechseln zu können, habe ich das Docker-Image, wie in der Dokumentation beschrieben erweitert:
zusätzliche Datei: Dockerfile (ohne Endung), Inhalt:
FROM kasmweb/desktop:1.15.0
USER root
ENV HOME /home/kasm-default-profile
ENV STARTUPDIR /dockerstartup
ENV INST_SCRIPTS $STARTUPDIR/install
WORKDIR $HOME
######### Customize Container Here ###########
RUN apt-get update \
&& apt-get install -y sudo \
&& echo 'kasm-user ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers \
&& rm -rf /var/lib/apt/list/*
######### End Customizations ###########
RUN chown 1000:0 $HOME
RUN $STARTUPDIR/set_user_permission.sh $HOME
ENV HOME /home/kasm-user
WORKDIR $HOME
RUN mkdir -p $HOME && chown -R 1000:0 $HOME
USER 1000
Quelle:
- kasmweb.com/docs/latest/how_to/building_images.html und
- kasmweb.com/docs/latest/how_to/running_as_root.html
In der docker-compose.yml - Datei kann dann das angepasste Image für den Build / Start verwendet werden:
Inhalt docker-compose.yml- Datei:
version: "3.8"
services:
kasmweb:
container_name: kasmweb-desktop
build:
context: ./
dockerfile: Dockerfile
#Labels für ReverseProxy, siehe: https://www.libe.net/traefik
labels:
- "traefik.enable=true"
- "traefik.http.routers.workspace.rule=Host(`workspace.domain.tld`)"
- "traefik.http.routers.workspace.entrypoints=web"
- "traefik.http.routers.workspace.entrypoints=websecure"
- "traefik.http.routers.workspace.tls=true"
- "traefik.http.routers.workspace.tls.certresolver=myresolver"
- "traefik.http.services.workspace.loadbalancer.server.scheme=https"
- "traefik.http.services.workspace.loadbalancer.server.port=6901"
- "traefik.http.routers.workspace.middlewares=forward-auth-verify"
shm_size: '1g'
restart: always
volumes:
- ./profile:/home/kasm-user
environment:
- VNC_PW=???
expose:
- "6901"
#Für einen direkten Test-Zugriff, in den folgenden 2 Zeilen "#" entfernen. Aufruf: http://localhost:83 oder http://ServerIP:83
ports:
- "6901:6901"
#Ohne dem Einsatz eines Reverse Proxy (https://www.libe.net/traefik) fehlt voraussichtlich das Netzwerk webproxy
#und die folgenden Zeilen können entfernt oder auskommentiert werden. Alternativ kann das Netzwerk mit "docker network create webproxy" erstellt werden
networks:
default:
external:
name: webproxy
mögliche Clients
Um beispielsweise Debian zu verwenden, muss lediglich das Image in der Docker-compose-Datei ausgetauscht werden:
version: "3.8"
services:
kasmweb:
..
image: kasmweb/debian-bookworm-desktop:1.15.0
..
Oder beim Einsatz des Dockerfile der From Befehl zu Beginn des Dockerfile:
FROM kasmweb/debian-bookworm-desktop:1.15.0
...
Fazit
Alternativ zu einem VPN-Zugriff und einer Remote-Verbindung auf einen bestehenden physischen oder virtuellen Client kann mit einer CDI (Container Desktop Infrastructure) ein Zugriff auf eine Desktopoberfläche innerhalb des eigenen Netzwerks ermöglicht werden. Im Vergleich zu virtuellen Servern oder Clients ist ein containerbasierter Desktop ressourcenschonender und kann daher schnell mal auf einer möglicherweise bereits vorhanden Hardware betrieben werden. Siehe auch: Günstiger und sparsamer Docker Mini Server für zu Hause.
{{percentage}} % positiv