Docker-Windows-Container mit Ansible managen (1/2)

Seite 3: Vollautomatische Docker-Installation

Inhaltsverzeichnis

Die eigentliche Docker-Installation ist mittels Paketmanager chocolatey oder einem entsprechenden Docker-Paket vergleichsweise einfach. Lediglich auf die korrekte Registrierung des Windows-Services ist zu achten. Hierzu lohnt der Blick in das Playbook install-docker.yml :

- name: Checking if Docker Windows Service is already configured (to always ↵ 
ensure a fresh Windows Docker installation)
win_service:
name: docker
register: docker_service_info
ignore_errors: yes

- name: Stop old Docker Windows Service if there
win_service:
name: docker
state: stopped
when: docker_service_info|succeeded

- name: Remove old Docker Windows Service if there
win_shell: "C:\\ProgramData\\chocolatey\\lib\\docker\\tools\\docker↵
\\dockerd.exe --unregister-service"
when: docker_service_info|succeeded
ignore_errors: yes

- name: Install (or upgrade) Docker via chocolatey
win_chocolatey:
name: docker
state: latest

- name: Register Docker as a Windows Service
win_shell: "C:\\ProgramData\\chocolatey\\lib\\docker\\tools\\docker↵
\\dockerd.exe --register-service"
ignore_errors: yes

- name: Start Docker as Windows Service
win_service:
name: docker
state: started

- name: Pull the small Windows Docker Base Image microsoft/nanoserver from ↵
hub.docker.com
win_shell: docker pull microsoft/nanoserver

Zuerst prüft das Programm mit dem win_service-Modul, ob der Docker Windows Service installiert ist. Dieser und die beiden folgenden Schritte sind bei der ersten Ausführung des Playbook auf einer neuen Windows-Maschine nicht relevant. Da aber immer mit einer frischen Docker-Installation zu starten ist, beginnt das System stets mit einem entsprechenden Test. Gibt es eine ältere Docker-Installation, ist der Windows Service im zweiten Schritt mit dem win_service-Modul zu stoppen und die Registrierung durch den Befehl

dockerd.exe --unregister-service

aufzuheben. Dafür kommt wieder das win_shell-Modul zum Einsatz. Docker bietet die Funktion der Registrierung sowie deren Umkehrung durch dockerd.exe an, was tunlichst zu vermeiden ist. Ein etwaiger Versuch, den Windows-Docker-Service daran vorbei mithilfe des win_service-Moduls zu registrieren, führt zu einer nicht funktionsfähigen Docker-Installation.

Nun folgt die Installation von Docker mittels win_chocolatey-Modul. Da es die Einrichtung des Docker Windows Service außen vor lässt, folgt dessen Registrierung auf den Fuße – dieses Mal via dockerd.exe --register-service mit dem win_service-Modul. Danach lässt sich der Docker-Service starten, der nun der Windows-Diensteverwaltung bekannt ist. Im letzten Schritt des Playbooks install-docker.yml wird noch eines der beiden verfügbaren Docker-Basis-Images heruntergeladen. Damit steht alles für den ersten Testcontainer bereit.

Microsoft stellt zwei Basis-Images zur Verfügung: windowsservercore und nanoserver. Ersteres ist trotz des Namens mit circa 10 GByte vergleichsweise groß und bietet einen nahezu vollständigen Windows Server. Das Image muss allerdings nicht zwingend zum Einsatz kommen. Nur wenn die zu dockerisierende Anwendung beispielsweise sehr spezielle Windows-Bibliotheken nutzt, ist das Image herunterzuladen. Für die meisten Anwendungsfälle sollte das viel kleinere Nanoserver-Image völlig ausreichen. Es nutzt mit circa 600 MByte wesentlich weniger Downloadvolumen und ist auch später im Betrieb deutlich handlicher.

Um zu überprüfen, ob die Docker-Installation erfolgreich war, lässt sich ein einfaches Beispiel-Image mit Microsofts Dotnet-Bot verwenden. Wird ein davon abgeleiteter Container mit docker run microsoft/dotnet-samples:dotnetapp-nanoserver hochgefahren, schaut einem das unten gezeigte freche Kerlchen von der Kommandozeile aus entgegen, sofern Docker sauber installiert wurde. Der Test lässt sich auch automatisiert mit einem Ansible-Skript wie run-test-container.yml steuern. Als vorletzter Task in prepare-docker-windows.yml führt es zu folgender Ausgabe:

TASK [Docker is ready on your Box and waiting for your Containers :)] **********
ok: [127.0.0.1] => {
"msg": [
"",
" Dotnet-bot: Welcome to using .NET Core!",
" __________________",
" \\",
" \\",
" ....",
" ....'",
" ....",
" ..........",
" .............'..'..",
" ................'..'.....",
" .......'..........'..'..'....",
" ........'..........'..'..'.....",
" .'....'..'..........'..'.......'.",
" .'..................'... ......",
" . ......'......... .....",
" . ......",
" .. . .. ......",
" .... . .......",
" ...... ....... ............",
" ................ ......................",
" ........................'................",
" ......................'..'...... .......",
" .........................'..'..... .......",
" ........ ..'.............'..'.... ..........",
" ..'..'... ...............'....... ..........",
" ...'...... ...... .......... ...... .......",
" ........... ....... ........ ......",
"....... '...'.'. '.'.'.' ....",
"....... .....'.. ..'.....",
" .. .......... ..'........",
" ............ ..............",
" ............. '..............",
" ...........'.. .'.'............",
" ............... .'.'.............",
" .............'.. ..'..'...........",
" ............... .'..............",
" ......... ..............",
" .....",
"",
"",
"**Environment**",
"Platform: .NET Core 1.0",
"OS: Microsoft Windows 10.0.14393 ",
""
]
}