Anmelden
Anmelden

Selenium mit Chrome in Docker ausführen

Selenium mit Chrome in Docker ausführen
Hostman Team
Technischer Redakteur
Docker-Plattform
30.10.2025
Reading time: 6 min

Manchmal ist es hilfreich, Selenium in Python innerhalb eines Docker-Containers zu verwenden. Dabei stellen sich Fragen zu den Vorteilen dieser Methode, zur Versionskompatibilität zwischen ChromeDriver und Chromium sowie zu den technischen Feinheiten der Implementierung. In diesem Artikel werden die wichtigsten Aspekte erklärt und typische Probleme mit ihren Lösungen behandelt.

Warum Selenium in Docker ausführen?

Das Ausführen von Selenium in einem Container bietet mehrere Vorteile:

  • 🧩 Portabilität:
    Die Umgebung kann leicht zwischen verschiedenen Maschinen übertragen werden, ohne Versionskonflikte oder betriebssystemspezifische Abhängigkeiten.

  • 🧱 Isolation:
    Der Selenium-Container kann unabhängig von anderen Komponenten schnell ersetzt oder aktualisiert werden.

  • ⚙️ CI/CD-Kompatibilität:
    Dockerisiertes Selenium lässt sich perfekt in CI/CD-Pipelines integrieren – bei jedem Testlauf kann eine frische, saubere Umgebung bereitgestellt werden.

Vorbereitung eines Ubuntu-Servers für Selenium mit Docker

Zuerst sicherstellen, dass Docker und Docker

Compose installiert sind:

docker --version && docker compose version

Hinweis: In einigen Docker-Compose-Versionen lautet der Befehl docker-compose (mit Bindestrich) anstelle von docker compose.

Wenn die Tools installiert sind, werden ihre Versionen angezeigt. Falls nicht, folge der entsprechenden Installationsanleitung.

Selenium in Docker – Beispielkonfiguration

Beim Ausführen von Selenium in Docker-Containern sollte man die Host-Architektur, Funktionsanforderungen und Performance berücksichtigen.

Die offiziellen Images selenium/standalone-* sind für AMD64 (x86_64)-Prozessoren optimiert, während die seleniarm/standalone-*-Images für ARM-Architekturen (z. B. Apple Silicon, ARM64-Server) gedacht sind.

Erstelle zunächst im Projektstamm eine Datei docker-compose.yml mit folgendem Inhalt:

version: "3"

services:
  app:
    build: .
    restart: always
    volumes:
      - .:/app
    depends_on:
      - selenium
    platform: linux/amd64

  selenium:
    image: selenium/standalone-chromium:latest # For AMD64
#    image: seleniarm/standalone-chromium:latest # For ARM64
    container_name: selenium-container
    restart: unless-stopped
    shm_size: 2g
    ports:
      - "4444:4444"  # Selenium WebDriver API
      - "7900:7900"  # VNC Viewer
    environment:
      - SE_NODE_MAX_SESSIONS=1
      - SE_NODE_OVERRIDE_MAX_SESSIONS=true
      - SE_NODE_SESSION_TIMEOUT=300
      - SE_NODE_GRID_URL=http://localhost:4444
      - SE_NODE_DETECT_DRIVERS=false

Wähle das richtige Image für deine Architektur, indem du die entsprechende Zeile aktivierst.

Der Service app führt deinen Python-Code aus. Definiere dafür eine Dockerfile:

# Use a minimal Python image
FROM python:3.11-slim

# Set working directory
WORKDIR /app

# Install Python dependencies
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt

# Copy project files
COPY . /app/

# Set environment variables (Chromium is in a separate container)
ENV SELENIUM_REMOTE_URL="http://selenium:4444/wd/hub"

# Run Python script
CMD ["python", "main.py"]

Diese Dockerfile verwendet ein leichtes Python-Image und installiert automatisch alle Abhängigkeiten.

Beispielskript – main.py

import time  # Used to create a delay for checking browser functionality
import os

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

# WebDriver settings
chrome_options = Options()
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--disable-webrtc")
chrome_options.add_argument("--hide-scrollbars")
chrome_options.add_argument("--disable-notifications")
chrome_options.add_argument("--start-maximized")

SELENIUM_REMOTE_URL = os.getenv("SELENIUM_REMOTE_URL", "http://selenium:4444/wd/hub")

driver = webdriver.Remote(
    command_executor=SELENIUM_REMOTE_URL,
    options=chrome_options
)

# Open a test page
driver.get("https://www.hostman.com")

time.sleep(9999)

# Shut down WebDriver
driver.quit()

requirements.txt

attrs==25.1.0
certifi==2025.1.31
h11==0.14.0
idna==3.10
outcome==1.3.0.post0
PySocks==1.7.1
selenium==4.28.1
sniffio==1.3.1
sortedcontainers==2.4.0
trio==0.28.0
trio-websocket==0.11.1
typing_extensions==4.12.2
urllib3==2.3.0
websocket-client==1.8.0
wsproto==1.2.0

Container starten

Starte die Container mit:

docker compose up -d

Docker baut die Images und startet sie im Hintergrund.

Überprüfe den Status:

docker compose ps

Wenn zwei Container laufen, ist alles korrekt eingerichtet – du kannst jetzt mit Selenium auf beliebige Websites zugreifen.

Selenium in Docker debuggen (VNC-Zugriff)

In offiziellen Selenium-Docker-Images (z. B. selenium/standalone-chrome oder seleniarm/standalone-chromium) wird der direkte Zugriff auf das Chrome DevTools Protocol (CDP) von Selenium Grid überschrieben.

Parameter wie --remote-debugging-port=9229 werden ignoriert oder von Selenium neu zugewiesen. Daher ist direkter Zugriff von außen nicht möglich.

Stattdessen bieten diese Images integrierten VNC-Zugriff (Virtual Network Computing) – ähnlich wie TeamViewer oder AnyDesk, aber auf Container-Ebene.

⚠️ VNC funktioniert nur, wenn der Headless-Modus deaktiviert ist, da es den echten Bildschirminhalt überträgt.

Du kannst die VNC-Weboberfläche öffnen unter:

http://<server_ip>:7900

Beim ersten Zugriff wird ein Passwort verlangt. Erstelle es direkt im Container:

docker exec -it selenium-container bash
x11vnc -storepasswd

Gib ein Passwort ein, bestätige es, und verwende es dann auf der VNC-Webseite, um Zugriff auf den laufenden Chrome-Browser im Container zu erhalten. Dort kannst du die Chrome DevTools öffnen und Netzwerkaktivitäten oder DOM-Elemente untersuchen.

Fazit

Das Ausführen von Selenium in Docker-Containern erhöht die Portabilität, beseitigt Versionskonflikte und erleichtert die Integration in CI/CD-Pipelines. Dank der integrierten VNC-Unterstützung kannst du Tests visuell debuggen und bei Bedarf mit grafischer Oberfläche arbeiten.

Achte lediglich darauf:

  • das passende Image (AMD64 oder ARM64) zu verwenden

  • und den Headless-Modus zu deaktivieren, wenn du den Browser sehen möchtest.

So erhältst du eine flexible, stabile und reproduzierbare Testumgebung für automatisierte Browser-Tests mit Selenium und Docker.

Docker-Plattform
30.10.2025
Reading time: 6 min

Ähnlich

Docker-Plattform

Bitwarden in Docker installieren

Bitwarden ist ein kostenloser, quelloffener Passwortmanager, der vertrauliche Informationen in einem verschlüsselten Tresor speichert. Er ist in C# geschrieben und nutzt .NET Core sowie ASP.NET Core. Die zugrunde liegende Datenbank basiert auf T-SQL/SQL Server. Bitwarden ist ein Cloud-Dienst, der über verschiedene Client-Anwendungen zugänglich ist und daher plattformübergreifend funktioniert: über das Web, Desktop-Apps (Windows, macOS, Linux), mobile Anwendungen, Browser-Erweiterungen (Chrome, Firefox, Safari, Edge, Opera, Vivaldi, Brave, Tor) oder über die Befehlszeile. Ein wesentlicher Grund für die Nutzung von Bitwarden besteht darin, keine Drittanbieter-Passwortmanager zu verwenden, bei denen vertrauliche Daten auf externen Servern gespeichert werden. Stattdessen kann Bitwarden auf einem eigenen, sicheren Server betrieben werden. Bitwarden besteht aus einer Gruppe von Containern, von denen jeder eine separate Funktion des Managers enthält — beispielsweise die Datenbank oder den Webserver. Daher ist für die Installation und den Betrieb von Bitwarden ein Containerisierungssystem erforderlich — und dieses ist Docker. Hauptfunktionen von Bitwarden Open Source 256-Bit-AES-Verschlüsselung zum Schutz von Benutzerdaten Unterstützung für Zwei-Faktor-Authentifizierung Passwort-Auditierung und -Verifizierung Unterstützung biometrischer Authentifizierung Möglichkeit, den Server lokal zu hosten Cross-Platform-Clients für alle gängigen Systeme Voraussetzungen Diese Anleitung verwendet Befehle für UNIX-ähnliche Systeme, insbesondere Debian/Ubuntu, die häufig für Serverbereitstellungen eingesetzt werden. Bevor Sie Bitwarden installieren und konfigurieren, stellen Sie sicher, dass alle erforderlichen Systempakete installiert und aktuell sind: sudo apt update sudo apt upgrade Wenn Ihr Server neu ist, empfiehlt es sich, einige grundlegende Tools zu installieren: sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common Als Nächstes stellen Sie sicher, dass Docker und Docker Compose installiert sind, um die Bitwarden-Container zu verwalten. Schritt 1: Docker und seine Komponenten installieren Zuerst fügen Sie den GPG-Schlüssel von Docker hinzu, der zum Signieren von Paketen verwendet wird: curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - Dann fügen Sie das Docker-Repository hinzu, um die neueste Version zu beziehen: sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" Aktualisieren Sie das System erneut: sudo apt update Schließlich installieren Sie Docker und Docker Compose: sudo apt install docker-ce docker-ce-cli containerd.io docker-compose Schritt 2: Bitwarden-Setup absichern Zur Erhöhung der Sicherheit erstellen Sie einen dedizierten Benutzer mit eingeschränkten Berechtigungen. Erstellen Sie ein Verzeichnis für Bitwarden: sudo mkdir /opt/bitwarden Erstellen Sie den Benutzer: sudo adduser bitwarden Weisen Sie dem Benutzer Besitzrechte zu: sudo chmod -R 700 /opt/bitwarden sudo chown -R bitwarden:bitwarden /opt/bitwarden Erlauben Sie dem Benutzer, Docker-Befehle auszuführen: sudo usermod -aG docker bitwarden Wechseln Sie danach zum Bitwarden-Benutzer: su bitwarden cd /opt/bitwarden Schritt 3: Bitwarden in Docker installieren und starten Selbst wenn Sie Docker nicht gut kennen, stellen die Entwickler von Bitwarden ein Installationsskript bereit, das den Prozess automatisiert.Laden Sie es herunter und machen Sie es ausführbar: curl -Lso bitwarden.sh https://go.btwrdn.co/bw-sh && chmod 700 bitwarden.sh Starten Sie anschließend das Skript: ./bitwarden.sh install Das Skript fragt Sie nach mehreren Konfigurationsparametern, darunter: Domainname für Bitwarden Datenbankname Ob Let’s Encrypt für ein kostenloses SSL-Zertifikat verwendet werden soll Sie benötigen außerdem eine Installations-ID und einen Schlüssel, die Sie auf der offiziellen Bitwarden-Seite generieren können. Schritt 4: SMTP-Mailserver konfigurieren Die Einrichtung eines SMTP-Servers ist optional, wird aber empfohlen, um Administrator-Anmeldungen und Benachrichtigungen zu ermöglichen. Bearbeiten Sie die Datei ./bwdata/env/global.override.env und fügen Sie die SMTP-Parameter hinzu, z. B.: globalSettings__mail__smtp__host=smtp.gmail.com globalSettings__mail__smtp__port=587 globalSettings__mail__smtp__ssl=true globalSettings__mail__smtp__username=your_email@gmail.com globalSettings__mail__smtp__password=your_password adminSettings__admins=your_email@gmail.com Wenn Sie mit Docker vertraut sind, können Sie auch einen eigenen Mailserver verwenden, z. B. docker-mailserver, der gut mit Bitwarden funktioniert. Alternativ können Sie öffentliche Mailserver wie Gmail verwenden (weniger sicher, aber einfacher). In diesem Fall: globalSettings__mail__replyToEmail=your_email@gmail.com globalSettings__mail__smtp__host=smtp.gmail.com globalSettings__mail__smtp__username=your_email globalSettings__mail__smtp__password=your_password globalSettings__mail__smtp__ssl=true globalSettings__mail__smtp__port=587 globalSettings__mail__smtp__useDefaultCredentials=false globalSettings__disableUserRegistration=true Bitwarden sendet dann Benachrichtigungen über Gmail. Achten Sie darauf, in Ihrem Gmail-Konto den Zugriff für weniger sichere Apps zu aktivieren, sonst blockiert Google den Zugriff. Wenn Sie einen anderen E-Mail-Dienst verwenden, tragen Sie dessen SMTP-Daten entsprechend in global.override.env ein. Bei Problemen können Sie ein Online-SMTP-Testtool nutzen, um die Konfiguration zu prüfen. Schritt 5: Server starten und Funktion prüfen Starten Sie den Server mit demselben Skript: ./bitwarden.sh start Öffnen Sie im Browser die IP-Adresse oder Domain Ihres Servers. Für den Adminbereich hängen Sie /admin an die URL an. Die Seite fordert Sie auf, die E-Mail-Adresse anzugeben, die in der global.override.env-Datei konfiguriert ist. Der Mailserver sendet einen Link, über den Sie sich ohne Passwort im Adminbereich anmelden können. Ab diesem Punkt können Sie jeden Bitwarden-Client verwenden — z. B. die Desktop-App, um sich mit Ihrem Server zu verbinden und Passwörter sicher zu speichern. Server stoppen und entfernen Falls es zu Problemen kommt oder Sie eine Neuinstallation durchführen möchten, stoppen Sie Bitwarden vollständig: ./bitwarden.sh stop Löschen Sie das Datenverzeichnis: rm -r ~/bwdata Und installieren Sie Bitwarden bei Bedarf erneut: ./bitwarden.sh install Fazit Die Installation von Bitwarden ist unkompliziert, da die Entwickler den größten Teil des Prozesses automatisiert haben. Nach der Einrichtung können Sie Ihre sensiblen Daten sicher verwalten und dabei DNS, SSL und SMTP verwenden. Weitere nützliche Hinweise zur praktischen Nutzung finden Sie in der offiziellen Bitwarden-Dokumentation.
07 November 2025 · 6 min to read
Docker-Plattform

Externe Docker-Registrys konfigurieren

Externe Docker-Registrys konfigurieren Bei der Arbeit mit Docker werden sogenannte Images verwendet – ausführbare Dateien, die alles enthalten, was zum Ausführen einer Anwendung erforderlich ist, einschließlich Quellcode, Bibliotheken und Abhängigkeiten. Diese Images werden in speziellen Repositories gespeichert, den sogenannten Registrys, die entweder privat oder öffentlich sein können. Die bekannteste öffentliche Registry ist Docker Hub, wo viele offizielle Images wie Nginx, PostgreSQL, Alpine, Ubuntu, Node und MongoDB zu finden sind. Benutzer können sich bei Docker Hub registrieren und dort eigene Images speichern – standardmäßig mit einem öffentlichen und drei privaten Repositories. Docker Hub ist die Standard-Registry, die Docker zum Herunterladen (Pull) von Images verwendet. Dieser Leitfaden zeigt, wie man die Standard-Registry in Docker auf eine andere umstellt. Verwendung externer Docker-Registrys Eine einfache Möglichkeit, externe Registrys zu nutzen, besteht darin, Drittanbieter-Registrys zu verwenden, die von Unternehmen wie Google oder Amazon bereitgestellt werden. Hier eine Liste öffentlicher Registrys, die verwendet werden können: Registry-URL Anbieter https://mirror.gcr.io Google https://public.ecr.aws Amazon https://quay.io Red Hat https://registry.access.redhat.com Red Hat https://registry.redhat.io Red Hat ⚠️ Hinweis: Die Nutzung externer Docker-Registrys kann Sicherheitsrisiken bergen – gehe daher vorsichtig vor. Im Folgenden wird beschrieben, wie du die Standard-Registry (Docker Hub) auf eine andere umstellst. Linux-Konfiguration Öffne die Datei daemon.json mit einem beliebigen Texteditor. Wenn Docker nicht im Rootless-Modus installiert wurde, befindet sich die Datei unter: /etc/docker/daemon.json Falls sie nicht existiert, wird sie mit diesem Befehl erstellt: nano /etc/docker/daemon.json Für Rootless Docker liegt die Datei im Benutzerverzeichnis unter: ~/.config/docker/daemon.json Erstelle sie ggf. mit: nano ~/.config/docker/daemon.json Füge den folgenden Parameter hinzu, um eine neue Standard-Registry festzulegen (im Beispiel: Google Mirror Registry): {   "registry-mirrors": ["https://mirror.gcr.io"] } Speichere und schließe die Datei. Starte anschließend den Docker-Dienst neu, um die Änderungen zu übernehmen: systemctl reload docker Nun verwendet Docker beim Herunterladen von Images die neue Registry. Beispiel: Ziehe das Alpine-Image aus der Google-Registry: docker pull mirror.gcr.io/alpine Du kannst auch eine bestimmte Version angeben, z. B.: docker pull mirror.gcr.io/nginx:1.25.2 Windows-Konfiguration (Docker Desktop) Öffne die Datei daemon.json, die sich hier befindet: C:\Users\<dein_benutzername>\.docker\daemon.json Füge den Registry-Mirror-Parameter hinzu: {   "registry-mirrors": ["https://mirror.gcr.io"] } Speichere die Datei und starte Docker neu. Klicke dazu mit der rechten Maustaste auf das Docker-Symbol in der Taskleiste und wähle "Restart". Alternativ kannst du die Einstellung direkt über die Docker Desktop-Oberfläche vornehmen - Navigiere zu Settings → Docker Engine und füge Folgendes hinzu: {   "registry-mirrors": ["https://mirror.gcr.io"] }   Klicke anschließend auf Apply & Restart, um die Änderungen zu übernehmen. Nach dem Neustart wird Docker die neue Registry für Image-Pulls verwenden.Beispiel: Lade ein curl-Image herunter: docker pull mirror.gcr.io/curlimages/curl Oder ziehe eine bestimmte Version: docker pull mirror.gcr.io/node:21-alpine Verwendung von Nexus als Docker-Registry Alternativ kannst du Nexus verwenden, um Docker-Images zu verwalten. Nexus unterstützt sogenannte Proxy-Repositories, die Images aus externen Registrys wie Docker Hub zwischenspeichern (cachen). So kann Nexus als Caching-Proxy fungieren, falls externe Registrys vorübergehend nicht erreichbar sind. Einrichten eines Proxy-Repositories in Nexus Melde dich in Nexus mit einem Administrator oder einem Benutzer mit Repository-Verwaltungsrechten an. Gehe zu Server Administration and Configuration → Repositories. Klicke auf Create repository und wähle den Typ docker (proxy). Fülle die erforderlichen Felder aus: Name: Vergib einen eindeutigen Namen für das Repository. Online: Aktivieren, damit das Repository Anfragen annehmen kann. Proxy-Server: Wenn Nexus hinter einem Proxy (z. B. Nginx) läuft, sind keine Ports für Authentifizierung erforderlich.Ohne Proxy sollte ein eindeutiger Port für HTTP oder HTTPS zugewiesen werden. Allow anonymous docker pull: Aktivieren, um Images ohne Anmeldung zu ziehen.Falls deaktiviert, ist ein Login erforderlich. Remote storage: Gib die URL der externen Registry an (z. B. https://registry-1.docker.io für Docker Hub). Nach dem Erstellen des Repositories kannst du dich – falls erforderlich – bei Nexus anmelden: docker login <nexus_registry_address> Ein Image wird dann wie folgt heruntergeladen: docker pull <nexus_registry_address>/image_name:tag Beispiel: Ziehe ein Python-Image mit Tag 3.8.19-alpine: docker pull nexus-repo.com/python:3.8.19-alpine ⚠️ Sicherheits-Tipp: Verwende nicht den Tag latest, da er potenziell instabile oder unsichere Versionen enthalten kann. Fazit Dieser Artikel hat verschiedene Methoden gezeigt, um Docker-Images herunterzuladen und zu speichern. Externe Registrys können nützlich sein, wenn die Standard-Registry (Docker Hub) nicht verfügbar ist. Wenn du externen Anbietern nicht vertraust, kannst du jederzeit deine eigene private oder öffentliche Docker-Registry einrichten – etwa über Nexus oder Harbor.
05 November 2025 · 5 min to read

Haben Sie Fragen,
Anmerkungen oder Bedenken?

Unsere Fachleute stehen Ihnen jederzeit zur Verfügung,
egal ob Sie Hilfe benötigen oder nicht wissen, wo Sie anfangen sollen.
E-Mail an uns
Hostman's Support