Docker Support

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.

Dieses Kapitel bietet 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.

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 P0 - 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.

Anmerkung: 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.

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 Beschreibung unterhalb zeigt Ihnen die notwendigen Schritte um ein virtuelles Netzwerk zwischen zwei (oder mehr) Docker-Container(n) herzustellen, welches als Basis für ein redundantes oder verteiltes Projekt verwendet werden kann.

Das Tutorial nimmt an, dass Sie den Container myFirstContainer für das WinCC OA Projekt bereits konfiguriert haben. Dieser enthält den ersten Redundanzpartner.

Anmerkung: Bitte beachten Sie, das empfohlen wird entsprechendes Wissen über Docker, Docker Netzwerke und WinCC OA selbst aufzubauen, bevor Sie ein redundantes System innerhalb ihres virtualisierten Containernetzwerks aufbauen.

Wenn Sie WinCC OA als virtualisierten Docker-Container verwenden mag es hilfreich sein, eine redundante Konfiguration ihrer Projektumgebung zu erstellen. Diese Anleitung zeigt ihnen die notwendigen Schritte zum Anlegen dieser redundanten Umgebung zur Verwendung von WinCC OA in Docker.

  1. Erstellen Sie ein neues Netzwerk myNetwork, welches zur 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, welcher das Netzwerk myNetwork verwendet.
    $ 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 Dockerimage-Datei, welche in dem oben genannten Aufruf verwendet wird muss mit der von WinCC OA zur verfügung gestellten Dockerdatei erstellt werden. Eine Beschreibung zum Erstellen der Image-Datei kann im Kapitel Docker Support gefunden werden.
  3. Fügen Sie den existierenden container zum Netzwerk myNetwork hinzu.
    $ docker network connect myNetwork myFirstContainer
    Sowohl der Container myFirstContainer als auch der Container mySecondContainer, sind nun Teil des gleichen Netzwerks myNetwork und können eine Verbindung über das Docker Netzwerk Interface herstellen.
Nachdem Sie den oben genannten Schritten gefolgt sind, verwenden die beiden Docker-Container Instanzen das gleiche virtuelle Netzwerk. Hiermit wird die Kommunikation zwischen den Containern ermöglicht, womit auch die redundanten und verteilten Optionen innerhalb Ihrer Docker-Umgebung verwendet werden können.

Zur Überprüfung, ob die Verbindung erfolgreich hergestellt wurde, kann der folgende Docker-Befehl verwendet werden:

Pingen des Docker-Containers

Zum Absetzen eines Ping-Befehls von einem Docker-Container zum anderen kann der folgende exec-Befehl verwendet werden:

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

Um die IP-Adresse Ihres Docker-Containers abzurufen kann der folgende inspect-Befehl verwendet werden:

docker inspect