Docker Support

Eine Einführung, wie WinCC OA innerhalb eines Docker-Containers verwendet werden kann, welche Besonderheiten zu beachten sind und wo Sie zusätzliche Informationen zu diesem Thema finden können.

Was ist Docker?

Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure in order to deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production. Entnommen von docs.docker.com

Weiterführende Informationen zu Docker können Sie auf der offiziellen Docker Website finden.

Tipp: Bitte lesen Sie die Best Practices for writing Dockerfiles, um häufige Probleme oder unerwünschte Fehlkonfigurationen zu vermeiden.

WinCC OA und Docker

Beginnend mit Version 3.18 von WinCC OA wird nun, auch für den produktiven Einsatz, der Betrieb von WinCC OA innerhalb eines Docker-Containers unterstützt.

Einschränkung:

Das WinCC OA-Video Feature kann nicht mit Docker verwendet werden, da die erforderlichen vimacc-Komponenten nicht innerhalb eines Containers installiert werden können.

Definieren eines eigenen Build-Images

Für die Verwendung von WinCC OA in Docker ist es erforderlich ein spezifisches Build-Image zu erstellen.

WinCC OA stellt ein vordefiniertes Dockerfile zur Verfügung, welches für das Erstellen eines Build-Images verwendet werden kann.

Das Dockerfile befindet sich innerhalb des Debian-Installationspaketes von WinCC OA (WinCC OA 3.20 P5 - Debian 11 (Bullseye) - x86_64.zip). Die Installation finden Sie auf winccoa.com. Diese Datei kann direkt verwendet und an die spezifischen Projektanforderungen angepasst werden.

Anmerkung: Innerhalb der vorkonfigurierten Datei wird das Shell-Skript docker-entrypoint.sh referenziert und verwendet um den WinCC OA PMON sowie das CodeMeter-Service ordnungsgemäß herunterzufahren, wenn der WinCC OA Docker-Container gestoppt wird.

Angepasstes Build-Image

Um Anpassungen für die spezifischen Projektanforderungen durchzuführen, wird empfohlen sich mit Docker auseinanderzusetzen. Die vollständige Dokumentation für das Erstellen von angepassten Build-Images und Docker generell finden sich in der offiziellen Docker-Dokumentation.

Erstellen eines Build-Images

Um ein konfiguriertes Docker-Build-Image innerhalb der Docker Umgebung zu erstellen, muss der Befehl docker build aufgerufen werden, z.B.:

docker build -t winccoa31X ."

Innerhalb des Beispiels wird davon ausgegangen, dass der Aufruf im Verzeichnis aufgerufen wurde, in welchem sich das Dockerfile befindet. Aus diesem Grund kann der erforderliche PATH als . angegeben werden. Der optionale Parameter -t winccoa31X wird verwendet, um diesem Docker build mit dem Tag "winccoa31X" zu versehen.

Weitere Beispiele und Informationen für das Ausführen des konfigurierten Images finden sich direkt innerhalb der Dockerfile-Datei, welche mit WinCC OA zur Verfügung gestellt wird.

Anmerkung: Um ein Docker-Image als Vorlage zu erstellen, bei der keine Pakte direkt installiert werden, kann der Paramter --target noinstall an den docker build Aufruf angefügt werden, z.B.:
docker build --target noinstall -t winccoa320temp .

Ausführen des Docker-Containers

Um einen Container, unter Verwendung des erstellten Docker Build-Images, zu starten, wird der Befehl docker run verwendet.

Es muss sichergestellt werden, dass das WinCC OA Projekt in das korrekte Verzeichnis gemountet wurde.

Standardmäßig wird der Pfad home/winccoa/oaproj/ verwendet. Um einen abweichenden Pfad festzulegen wird das optionale -v Argument des docker run Befehls verwendet.

Um die erforderlichen Ports des Projektes mit dem Docker-Container abzugleichen wird das optionale -p Argument des docker run Befehls verwendet.

Ein Beispiel für das Ausführen eines Docker-Containers sieht wie folgt aus:

docker run -d --rm --name winccoa -v /home/myuser/myproj:/home/winccoa/oaproj/ -p 4999:4999 -p 5678:5678 -p 8079:8079 winccoa31X

Es ist auch möglich, WinCC OA Docker-Images mit einem vordefinierten Projekt auszuführen. Dies kann mit der folgenden Änderung am Skript docker-entrypoint.sh erfolgen:

$OAPROJEXTRACT - <der Pfad innerhalb des Containers>

Wenn dieser Pfad existiert, wird er nach $OAPROJ extrahiert, vorausgesetzt, dass $OAPROJ/config/config nicht existiert. Die Projektdatei kann eine .tar- oder eine zip-Datei sein.

Der Start des WinCC OA-Prozesses kann mit der Variable $OASLEEP verzögert werden - wenn diese definiert ist, wird sie als Schlafzeit in Sekunden verwendet, z.B.

$OASLEEP=150

WinCC OA Lizenzierung für Docker

Für die Lizenzierung von WinCC OA innerhalb eines Docker Containers ist es erforderlich einen eigenen CodeMeter Lizenzserver bereitzustellen.

Der CodeMeter Lizenzserver kann wahlweise auf einem eigenständigen Server betrieben werden, oder als Service auf dem Host Rechner der Docker Umgebung betrieben werden.

Ein CodeMeter Lizenzserver erfordert die Installation und entsprechende Server-Konfiguration der CodeMeter Runtime. Diese wird als Teil des WinCC OA Setups zur Verfügung gestellt, kann, für Linux, separat von winccoa.com heruntergeladen oder direkt über den Hersteller unter wibu.com bezogen werden.

Unter wibu.com finden Sie auch ausführliche Beschreibungen für die Konfiguration eines CodeMeter Lizenzservers.

Hinzufügen eines Lizenzservers

  • Geben Sie auf dem zentralen Lizenzserver in der Weboberfläche unter Configuration > Server > Server Access im Feld License Access Permissions den IP-Bereich für Clients an, die Lizenzen verwenden dürfen.
  • Fügen Sie in der Docker-Instanz den zentralen Lizenzserver mit dem folgenden Befehl hinzu:
    cmu --add-server <server-IP>
  • Führen Sie den folgenden Befehl aus, um zu überprüfen, ob der Server in der Serversuchliste enthalten ist:

    cmu --show-serversearchlist
  • Um die Adresse des Lizenzservers an einen Docker-Container zu übergeben, anstatt sie manuell hinzuzufügen, gibt es zwei Optionen:
    1. Erstellen und Ausführen eines Docker-Containers mit einem dedizierten Lizenzserver:
      docker run -d --rm --name winccoa -v /home/myuser/myproj:/home/winccoa/oaproj/ -p 4999:4999 -p 5678:5678 -p 8079:8079 -e LICENSESERVER=10.0.0.2 winccoa
    2. Starten Sie einen Docker-Container mit der Umgebungsvariable:
      VN = LICENSESERVER [, separated if multiple license servers are used]
Anmerkung: Wenn der Docker die Verbindung zum Lizenzcontainer verliert, ist die Lizenz nach 30 Minuten wieder verfügbar.

Hinweise und Einschränkungen

Bitte beachten Sie folgende Hinweise und Einschränkungen bei der Verwendung von WinCC OA innerhalb eines Docker Containers.

  • Die Verwendung von WinCC OA innerhalb eines Docker Containers wird nur unter Linux unterstützt.
  • Ein Docker-Container ist nicht dazu vorgesehen Konfigurationen, Werte oder Historien zu speichern, welche im Rahmen des Betriebs anfallen! Eine Sicherung muss entsprechend vorgesehen werden und auf Speichermedien außerhalb des Containers eingerichtet werden. Der Stopp eines Containers setzt diesen wieder auf seinen Ausgangszustand zurück!
  • Zusätzliche Informationen darüber, wie Sie WinCC OA in Docker sicher betreiben können, finden Sie in den WinCC OA Security Guidelines .
  • Das WinCC OA User Interface kann nicht innerhalb eines Docker-Containers verwendet werden.
  • Bitte beachten Sie insbesondere bei der Verwendung von WinCC OA innerhalb von Docker die WinCC OA Betriebsbedingungen .

Docker - Netzwerk

Die folgende Anleitung erklärt die Schritte, um ein virtuelles Netzwerk zwischen zwei oder mehr Docker-Containern zu erstellen. Dieses Netzwerk kann als Grundlage für ein redundantes oder verteiltes Projekt genutzt werden.

Dieses Tutorial setzt voraus, dass Sie den Container myFirstContainer für das WinCC OA-Projekt bereits eingerichtet haben. Dieser Container dient als erster Redundanzpartner.

Anmerkung: Es wird empfohlen, sich vorab mit Docker, Docker-Netzwerken und WinCC OA vertraut zu machen, bevor Sie ein redundantes System in Ihrem virtualisierten Container-Netzwerk aufbauen.

Wenn Sie WinCC OA als virtualisierten Docker-Container nutzen, kann es hilfreich sein, eine redundante Konfiguration Ihrer Projektumgebung zu erstellen. Diese Anleitung zeigt Ihnen die Schritte, um eine solche redundante Umgebung für die Nutzung von WinCC OA in Docker einzurichten.

  1. Erstellen Sie ein neues Netzwerk myNetwork, das für die Kommunikation zwischen den WinCC OA-Projekten verwendet wird.
    $ docker network create --driver=bridge --subnet=172.28.0.0/16 --ip-range=172.28.5.0/24 --gateway=172.28.5.254 myNetwork
  2. Erstellen Sie einen neuen Container mySecondContainer, der das Netzwerk myNetwork nutzt.
    $ docker run --name myNewContainer --hostname <HOSTNAME_IHRES_PROJEKTS> --network myNetwork -u <Benutzername>:<Benutzername> -it -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v /etc/hosts:/etc/hosts -v /etc/localtime:/etc/localtime:ro <Dockerimage-Name>
    Die Docker-Image-Datei, die im obigen Befehl verwendet wird, muss mit der von WinCC OA bereitgestellten Docker-Datei erstellt werden. Eine Anleitung zum Erstellen der Image-Datei finden Sie hier: Erstellen eines Build-Images
  3. Fügen Sie den bestehenden Container dem Netzwerk myNetwork hinzu.
    $ docker network connect myNetwork myFirstContainer
    Die Container myFirstContainer und mySecondContainer sind nun Teil desselben Netzwerks myNetwork und können über das Docker-Netzwerk-Interface miteinander kommunizieren.
Nachdem Sie die oben genannten Schritte ausgeführt haben, nutzen die beiden Docker-Container dasselbe virtuelle Netzwerk. Dadurch wird die Kommunikation zwischen den Containern ermöglicht, was die Nutzung von redundanten und verteilten Optionen in Ihrer Docker-Umgebung unterstützt.

Um zu überprüfen, ob die Verbindung erfolgreich hergestellt wurde, können Sie die folgenden Docker-Befehle verwenden:

Docker-Container anpingen

Um einen Ping-Befehl von einem Docker-Container zu einem anderen zu senden, verwenden Sie diesen exec-Befehl:

docker exec -it <Docker image name> ping <IP address of your second container>
IP-Adresse abrufen

Um die IP-Adresse Ihres Docker-Containers zu ermitteln, verwenden Sie diesen inspect-Befehl:

docker inspect