Verwendung von Docker mit NAV / Business Central

27. Februar 2018 18:31

Ich sammle hier mal einführende Hinweise und Links zum Arbeiten mit Docker.

Docker für Server 2016
Windows-Container unter Windows Server

Docker für Windows 10
16 GB Arbeitsspeicher sollte man hier schon verfügbar haben, mit 8 GB ärgert man sich nur über zahllose Abbrüche :wink: .
Windows-Container unter Windows 10

[Nachtrag 13.01.19] Mit Version 1809 ist Process Isolation für bessere Stabilität verfügbar.

Nach Installation die Computerverwaltung aufrufen und sich selber bei der Gruppe „docker-users“ eintragen. Danach neu anmelden, da Docker sonst nicht ausgeführt werden kann und einen sonst gleich mit der ersten Fehlermeldung begrüßt.
CompVerwDockerUsers.png

Docker ist vorgabemäßig auf Linux-Container eingestellt, als erstes hier mit „Switch to Windows Container“ auf letztere umstellen. Sonst kommen irreführende Fehlermeldungen mit Fehlern vom Hyper-V Start von MobyLinux.
Hier wurde bereits auf Windowscontainer umgestellt, dieser Menüpunkt ist dann tabu.
LinuxContainers.png


Beim nächsten Start diese Meldung mit Ok bestätigen (-> Neustart).
ContainersFeature.png

Eventuell kommt auch eine bzlg. Hyper-V, die analog bestätigt werden muss. Alternativ kann man im Suchfeld „Windows-Features“ diese Form aufrufen und dort die Haken setzen.
WindowsFeatures.png

Falls Docker nicht startet, "Experimental features" abschalten.
DockerExperimental.png

Achtung: Docker geht dann u.U. wieder auf Linux-Container und muss wieder auf Windows umgestellt werden. Nach docker pull… kommt sonst spätestens eine Fehlermeldung :mrgreen: .

PowerShell als Admin starten, um die speziellen Cmdlets für "NAV on Docker" zu installieren.
Code:
Install-module navcontainerhelper -force

Das Modul navcontainerhelper wird bei MS ständig weiterentwickelt. Für den aktuellen Stand:
Code:
Update-Module navcontainerhelper -force

Zum Prüfen der Versionsnummer.
Code:
Get-Module -ListAvailable -name navcontainerhelper

Da bei Updates des NavContainerHelpers ältere Versionen nicht entfernt werden…
navcontainerhelperversions.png

…hat man nach mehreren Updates leider den Effekt, dass die Cmdlets im Befehls-Add-on mehrfach angezeigt werden. Dieses kann durch den Parameter -AllVersions bei Deinstallieren
Code:
uninstall-module -Name navcontainerhelper -AllVersions

mit anschließendem Install-Module bereinigt werden.

Dokumentation
https://github.com/Microsoft/navcontainerhelper
Versionen (mit manueller Downloadoption)
https://www.powershellgallery.com/packages/navcontainerhelper/

Mit
Code:
Write-NavContainerHelperWelcomeText

erhält man aktuell diese Ausgabe.
DockerCmdlets.png


Docker in der PowerShell starten
Die Desktop-App Docker for Windows muss dafür vorher gestartet werden. Ein roter Wal in der Taskleiste bedeutet, dass es hat nicht geklappt hat. Dann klappt es aber meist beim zweiten Startversuch :roll: . Aufwendiger, aber stabiler ist diese Methode: Running NAV docker containers on a local Hyper-V Virtual Machine
Arbeitsspeicher zuweisen mit Schalter –m, Minimum 3GB oder mindestens 2500M. Wenn man davon genug hat, besser 4 GB :wink: .
Code:
docker run -e accept_eula=Y -m 3G microsoft/dynamics-nav


Image ziehen
Das Ziehen des ersten NAV-Images dauert relativ lange (im zweistelligen Gigabytebereich, typisch 15-17 GB (Nachtrag 1.12.18: Neue ltsc2019-Images nur noch 9-10 GB)), alle weiteren Pulls, die darauf aufbauen, laden nur die zusätzlich erforderlichen Teile dazu und gehen somit wesentlich schneller.
Dockerimages sind ab NAV 2016 verfügbar, die Technologie kann aber ggf. auch für ältere Versionen eingesetzt werden (s.u.). Support gibt es aber nur ab NAV 2016, und auch nur für Entwicklungs- und Testumgebungen, nicht für Echtsysteme :!: .
Syntax
Code:
docker pull microsoft/dynamics-nav:[version[-cu][-country]]

Für die W1 oder die jeweils aktuelle NAV-Version mit dem aktuellsten CU kann man alle Zusatzparameter weglassen.
Das Minimum ist also diese Zeile, zieht aktuell NAV 2018 CU 02 W1, im nächsten Monat dann NAV 2018 CU 03 W1 usw.
Code:
docker pull microsoft/dynamics-nav

Für NAV 2017 CU 15 DE dann dagegen so mit allen Parametern:
Code:
docker pull microsoft/dynamics-nav:2017-cu15-de


Die CU-Nummer ohne Vornullen, also cu2, nicht cu02:
Code:
docker pull microsoft/dynamics-nav:2018-cu2-ch

Für das RTM-Release -rtm verwenden, cu0 funktioniert leider nicht :wink: .

Für NAV 2015 (oder noch ältere) stellt MS nichts bereit, man kann aber für diese Versionen versuchen, selber einen Container auf Grundlage des Generic Images (das ist das Grundlagenimage, auf das alle weiteren Teile in einem speziellen Image aufsetzen (microsoft/dynamics-nav:generic) aufzubauen, Anleitung dazu hier. Das wird aber immer aufwendiger, je älter die Version ist, weil die eingesetzten sonstigen Technologien sich natürlich auch weiterentwickelt haben.

Das allgemeine NAV-Repository ist nach Ende der Betaphase mittlerweile public und nicht mehr private, daher ist eine vorherige Anmeldung an Azure (die sich teilweise noch in den alten Dokus befindet) nicht mehr erforderlich, für nicht-öffentliche Previews neuer Versionen dagegen natürlich weiterhin schon.

Artikel von FreddyDK zu den verschiedenen Repositories: Which Docker Image is right for you?

Für Erstellung von BC-Container (also z.B. Appentwicklung für die Cloud) wird anstatt dynamics-nav nur bcsandbox in der Pull-Zeile des Images eingetragen, gefolgt von dem Ländercode, falls nicht die W1 benötigt wird.
Code:
docker pull microsoft/bcsandbox
docker pull microsoft/bcsandbox:de
docker pull microsoft/bcsandbox:at
docker pull microsoft/bcsandbox:ch


Wenn im Ausnahmefall nicht das aktuelle, sondern ein spezielles (= älteres) Build benötigt wird, muss das bei BC-Images exakt angeben werden.
Code:
docker pull microsoft/bcsandbox:12.0.21229.0-de


Falls das Image im Repository keine Veränderung zu einem bereits heruntergeladenen lokalen Image gleichen Namens hat, erfolgt kein erneuter Pull, sondern es kommt nur diese Meldung, hier für die aktuelle Version von NAV 2018 DE.
Status: Image is up to date for microsoft/dynamics-nav:2018-de
Bei MS werden allerdings auch vorhandene Images im Repository von Zeit zur Zeit neu aufgebaut, damit Korrekturen am Generic Image auch älteren Images zugutekommen.
Details dazu siehe hier: NAV on Docker 0.0.5.5 or… – What’s new
Mit dem Parameter -alwaysPull bei Erstellen von Containern kann man sicherstellen, dass das Image und damit der daraus erzeugte Container immer auf dem letzten Stand sind.
Der Stand des Generic Images ist beim Pull nach der Ausgabe der der NAV-Version ersichtlich.
NAV Version: 11.0.19394.0-de
Generic Tag: 0.0.5.4


Neuen Container aufsetzen und hochfahren
Mit Windows 10 dauert dieser Schritt spürbar länger (meist 7-10 Minuten) als mit Windows Server (meist 1-3 Minuten).
Minimaleingabe, hier auf Basis Image 2018, da trägt man das benötigte ein:
Code:
New-NavContainer -containerName mycontainer -imageName microsoft/dynamics-nav:2018 -accept_eula

Container mit accept_eula starten, dann erscheint das Fenster zur Windowspassworteingabe
NewContainerPublic.png

Das hierbei eingegebene Passwort wird dabei auch mit dem Benutzer SA im Container gekoppelt.

Mit Zugang zu C/SIDE mit Export der Objekte als Text (in das Verzeichnis C:\ProgramData\NavContainerHelper\Extensions\...) zusätzlich Schalter und Pfad zur Lizenzdatei angeben
Code:
 -includeCSide  -licenseFile C:\temp\myLicenseFile.flf

Mit Zugang zu C/SIDE ohne Export der Objekte als Text
Code:
 -includeCSide  -doNotExportObjectsToText


Falls Datenbank im Container nicht angesprochen werden kann:
Hostsdatei
New-NAVContainer entweder mit zusätzlichem Parameter
Code:
-updateHosts

erzeugen (Achtung: löscht dabei eventuelle Kommentare dort)
oder die IP-Adresse des Containers (steht in der PowerShell-Ausgabe bei Containererzeugung) selber in die hosts-Datei eintragen, wenn man die direkten Desktoplinks nutzen möchte (Notepad++ dazu im Admin-Modus starten, das bietet das Programm aber ggf. beim Abspeicherversuch netterweise selbst an, wenn es merkt dass hierfür Adminrechte erforderlich sind :-) ).
Pfad: C:\Windows\System32\drivers\etc\hosts

Bei Wahl des Containernamens auf eventuelle Tippfehler achten :!: . Falls bereits ein Container gleichen Names existiert, wird dieser ohne Warnung entfernt und anhand der aktuellen Parameter neu erzeugt.

Zusammengesetzt hier eine typische Zeile für den aktuellen NAV 2018 DE-Container mit weiteren Parametern wie -enableSymbolLoading (falls ExtensionsV2 mit der Containerdatenbank entwickelt werden sollen) und -alwaysPull (um beim Aufsetzen jeweils den aktuellen Stand des Images zu ziehen)
Code:
New-NavContainer -containerName nav2018de-last -imageName microsoft/dynamics-nav:2018-de -accept_eula  -includeCSide -updateHosts  -licenseFile C:\temp\mylicense.flf -enableSymbolLoading -alwaysPull -doNotExportObjectsToText

Hier für einen Container einer RTM Version, hier Parameter rtm statt cu..
Code:
New-NavContainer -containerName nav2018de-cu00 -imageName microsoft/dynamics-nav:2018-rtm-de -accept_eula  -includeCSide -updateHosts  -licenseFile C:\temp\mylicense.flf -enableSymbolLoading -alwaysPull -doNotExportObjectsToText

Ab CU 01 dann so, weitere CUs analog.
Code:
New-NavContainer -containerName nav2018de-cu01 -imageName microsoft/dynamics-nav:2018-cu1-de -accept_eula  -includeCSide -updateHosts  -licenseFile C:\temp\mylicense.flf -enableSymbolLoading -alwaysPull -doNotExportObjectsToText


Datenbank mit C/SIDE öffnen
Falls nicht mit Windowsauthentifizierung möglich
DockerUntrustedWindowsLogin.png


• Umstellen auf Datenbankserver
• Benutzer: SA
• das eigene Windowskennwort eintippen (oder das, welches beim Containererstellen angegeben wurde)

Wichtig für den Zugriff vom Web- oder Windowsclient und VS Code aus:
Je nach Anmeldeverfahren die benötigten User für den Container nach der Erstellung manuell anlegen. Auch der Administrator wird nicht automatisch dort angelegt.
New-NavContainerWindowsUser
New-NavContainerNavUser

Jeder Container verfügt über mehrere Pfade, über die mit dem Host Dateien ausgetauscht werden können.
Hier visualisiert mit dem Tool Kitematic.
Swappingfolders.png

Alternativ über Cmdlet Get-NavContainerSharedFolders, mit Out-GridView bleiben auch lange Pfade in der Ausgabe komplett erhalten.
Code:
Get-navcontainersharedfolders <mycontainername> | Out-GridView

Ansonsten können mit
Code:
docker cp

Dateien vom Host in den Container kopiert werden.

Anzeige der gezogenen Images
Code:
docker images

DockerImages.png

Statusanzeige der Images (mit dem Schalter -a werden alle anzeigt, für die Anzeige der aktuell laufenden diesen weglassen)
Code:
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Status}}"

StatusImages.png


Image löschen
Code:
docker rmi <Image ID>


Container auflisten. Vorne steht die ID (nur die ersten 12 Stellen davon), hinten der Name
Code:
docker container ls


NAV-Container entfernen mit Remove-NAVContainer
Code:
Remove-NavContainer -containerName <MyContainerName>


Die aktuelle Extension für VSCode (.vsix) kann über den Browser über Port 8080 aus dem Container heruntergeladen werden. Der Link steht unten in der PowerShell nach Erzeugung des Containers.
z.B. http://mycontainername:8080/al-0.14.17291.vsix
Da das Build der VSCode-Extension ja immer genau zur NAV-Version der Datenbank des Containers passen muss, bekommt man diese hier praktischerweise also direkt mitgeliefert ( :greenarrow: Nachtrag: Diese Situation hat sich etwas entspannt, vsix ab Version 2.x sind nunmehr abwärtskompatibel. Die vsix des Containers benötigt man aber weiterhin, wenn man für Previews kommender Releases entwickeln möchte, da bei einem tagesaktuellen Stand die im Container vorhandenen AL Language Extension ein höheres Build als die öffentliche Version im AppSource aufweisen wird).

Die Logdaten wie die IP des Containers, Servernamen, Downloadpfad für vsix u.v.a.m., die immer direkt nach der Erstellung angezeigt werden, kann man für ältere Container über diese Eingabe erneut abrufen.
Code:
docker logs <containername>


Allgemeine Links
https://docs.docker.com/ (Download und Doku)
Eine eigene Docker-ID samt Login auf docker.com ist für die Nutzung der NAV-Funktionen nicht erforderlich. Wenn man eine hat, kann man aber u.a. in der Dockercloud eigene Repositories anlegen und neben vielen docker pull… auch mal docker push… nutzen :wink: .
https://docs.microsoft.com/de-de/virtualization/windowscontainers

Docker für NAV
https://hub.docker.com/r/microsoft/dynamics-nav/
http://aka.ms/navondockerhol (Download PDF Hands-on Lab)
http://www.github.com/microsoft/navcontainerhelper
http://www.github.com/microsoft/navcontainerhelper/issues


Troubleshooting
NAV/BC mit Docker
https://blogs.msdn.microsoft.com/freddy ... on-docker/
Falls der Dienst des Containers nach dem Erstellen nicht läuft (der Windowsclient meldet dann, dass unter Port 7046 kein Server gefunden wurde), mit dem PowerShell-Link in den Container gehen und dieses eingeben
Code:
start-navserverinstance -serverinstance NAV


Docker für Windows
https://github.com/docker/for-win/issues


Docker auf VM-Server (verschachtelte Virtualisierung)
Dieses wird nicht offiziell supportet, d.h. es kann funktionieren, muss aber nicht.
https://docs.docker.com/docker-for-wind ... -scenarios


Tools
Kitematic: https://github.com/docker/kitematic/releases
Portainer: https://portainer.io/ (nicht für Windows Server oder ID/Edge, geht nur mit Chrome, siehe Hinweise im Hands-on Lab PDF)

Sonstige Links
NAV mit Docker
https://community.dynamics.com/business/b/freddysblog (Voriger Blog: https://blogs.msdn.microsoft.com/freddyk/)
https://www.axians-infoma.de/navblog/
http://www.dynamicsblog.at/schnelleinstieg-docker-und-dynamics-nav/

Blogartikel von A.J. Kauffmann
Docker Tips for NAV Development Preview September Update
Running NAV docker containers on a local Hyper-V Virtual Machine

Container in Azure
https://demiliani.com/2018/03/22/nav-on-docker-running-it-on-an-azure-container-instance/
https://www.axians-infoma.com/techblog/running-multiple-nav-bc-containers-on-an-azure-vm/
https://www.axians-infoma.de/techblog/traefik-support-for-navcontainerhelper-the-nav-arm-templates-for-azure-vms-and-local-environments/

Videos
Docker and Dynamics NAV - Practical Use Cases

Docker-Technologie allgemein
https://jaxenter.de/docker-virtuelle-maschine-61779
https://jaxenter.de/docker-vs-vm-54816
https://fntlnz.wtf/post/why-containers/
Video auf Deutsch: https://www.axians-infoma.com/techblog/a-german-introduction-to-windows-containers/
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: Verwendung von Docker mit NAV / Business Central

12. April 2019 23:14

FreddyK beschreibt hier, wie man die Datenbankdateien aus dem Container auslagern kann.
Placing the database on the host

Re: Verwendung von Docker mit NAV / Business Central

31. Juli 2019 15:54

Kowa hat geschrieben:Zusammengesetzt hier eine typische Zeile […] mit weiteren Parametern wie -enableSymbolLoading

Ab BC 2019 Release Wave 2 (15.x) ist dieser Parameter nicht mehr zulässig, da nicht mehr notwendig.
EnableSymbolLoading.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: Verwendung von Docker mit NAV / Business Central

20. August 2019 12:03

FreddyK erklärt hier u.a. die Funktion der verschiedenen Parameter bei der Containererzeugung.
Business Central on Docker for non-experts…