Docker ist aktuell die führende Virtualisierung für Micro-Services.

!!!Windows
Inzwischen gibt es eine native [Docker-Installation für Windows|https://docs.docker.com/engine/getstarted/step_one/]. Einfach das Paket installieren und dann testen:

{{{
docker run hello-world
}}}

!!Prozesse
"docker ps" listet die laufenden Prozesse, "docker ps -a" listet die auf der Maschine befindlichen Images.

!!!Virtualbox
Unter Windows läuft Docker momentan mit einem Image boot2docker.iso, welches mit "Docker Toolbox" geliefert wird. Die Installation erfolgt üblicherweise in C:\Program Files\Docker Toolbox, das sollte sich im System-Path befinden.

Die Maschine wird gelöscht und angelegt mit:

{{{
$ docker-machine rm default
$ docker-machine create --driver virtualbox default
}}}

__Hinweis:__ "default" ist der Standardname der Docker-Maschine.

!!Environment
Die Docker-Maschine kann dann unter Windows abgefragt werden mit:

{{{
docker-machine env
}}}

!!SSH Verbindung
Mit dem Command docker-machine kann man sich auch verbinden:

{{{
docker-machine ssh default
}}}

!!!Images
Standard-Images werden vom Docker-Hub über das Internet heruntergeladen. Da sind einfache Linuxe mit Java, Tomcat, MySQL etc. verfügbar.

!!!Netwerk
Netzwerk konfigurieren

{{{
ifconfig eth0 192.168.3.1 netmask 255.255.0.0 broadcast 192.168.255.255 up
}}}

!!!Deployen
Die eigene Anwendung wird mit dem Docker-Command deployed oder über das Maven-Plugin com.spotify:docker-maven-plugin.

!!Maven
Das Plugin arbeitet mit einem Spring-Boot JAR wie folgt:

{{{
<plugin>
	<groupId>com.spotify</groupId>
	<artifactId>docker-maven-plugin</artifactId>
	<version>0.4.13</version>
	<configuration>
		<imageName>${project.artifactId}</imageName>
		<dockerHost>https://192.168.99.101:2376</dockerHost>
		<dockerCertPath>${env.USER_HOME}\.docker\machine\machines\default</dockerCertPath>
		<baseImage>java:8-jdk</baseImage>
		<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
		<exposes>
			<expose>80</expose>
		</exposes>
		<resources>
			<resource>
				<targetPath>/</targetPath>
				<directory>${project.build.directory}</directory>
				<include>${project.build.finalName}.jar</include>
			</resource>
		</resources>
	</configuration>
</plugin>
}}}

!!!Docker Console
Innerhalb der Docker-VM oder einer anderen Docker-Installation stellt das Command "docker" die Verbindung zum Docker-System her. Mit "docker ps" kann man die laufenden Container auflisten lassen.

!!!Docker Maschine
Customizing findet statt durch /etc/docker/docker.json innerhalb der virtuellen Docker-Maschine.

||Key||Value||Bedeutung
|bip|192.168.1.5/24|Netzwerk range
|fixed-cidr|192.168.1.20|IP-Adresse der eigenen Maschine

!!!Docker auf Linux
Die fertigen Images bringen erhebliche Einschränkungen mit sich. Daher ist es besser, Docker direkt auf einem Linux zu installieren.

!!Installation
Besser ist ein Standard-Linux (etwa Ubuntu) zu verwenden und Docker darauf zu installieren:

{{{
curl https://get.docker.com | bash
}}}

!!Einstellungen
Die eigentliche Konfigurationsdatei liegt unter /lib/systemd/system/docker.service. Diese Datei wird aber automatisch verwaltet. Für Änderungen kann eine neue Datei erzeugt werden:

{{{
mkdir /etc/systemd/system/docker.service.d/
nano /etc/systemd/system/docker.service.d/docker.conf
}}}

Der Inhalt kann etwa wie folgt aussehen:

{{{
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 --containerd=/run/containerd/containerd.sock
}}}

Der Daemon dockerd hat viele Parameter ([Docker Daemon Parameters|https://docs.docker.com/engine/reference/commandline/dockerd/]), unter anderem das Port-Binding mit -H. Neben dem Parameter -H fd:// (UNIX Pipe) kann man -H tcp://0.0.0.0:2375 hinzufügen (ohne SSH) oder tcp://0.0.0.0:2376 (mit SSH). Dann sind folgende Befehle auszuführen:

{{{
systemctl daemon-reload
systemctl restart docker.service
}}}

Mit

{{{
systemctl stop docker.service
systemctl start docker.service
}}}

kann der Service gestoppt und gestartet werden.

!!DNS konfigurieren
Grundsätzlich verwendet [Docker] den DNS-Server des unterliegenden [Linux-Systems|Ubuntu] und sollte dort richtig einstellt werden.

In docker.service können zusätzliche DNS-Server angegeben werden:

{{{
ExecStart=/usr/bin/dockerd --dns 192.168.1.1 [...]
}}}

!!Docker Toolbox
Unter Windows kann man sich mit der Linux-Variante verbinden, etwa:

{{{
set DOCKER_HOST=tcp://192.168.1.99:2375
}}}

Damit kann man ganz normal das docker command (docker ps etc. [Docker Toolbox|https://docs.docker.com/toolbox/toolbox_install_windows/]) nutzen.

!!!Docker Commands
Das Command docker ist sowohl auf der installierten Docker-Version verfügbar, als auch auf Windows durch die Installation von Docker-Toolbox. Genau genommen braucht nur docker.exe in den Windows-Path kopiert werden.

!!Container Bash
Im Docker-Container kann eine Bash geöffnet werden:

{{{
docker exec -it <container-name> bash
}}}

__Hinweis:__ Manche Container nutzen "sh" statt "bash".

!!!Volumes
Mit der Volumes Option -v können Dateien und Laufwerke verbunden werden. Laufwerke werden mit

{{{
docker volume create --name <name>
}}}

erzeugt werden. Dieser werden dann verbunden mit

{{{
docker run [...] -v <volume>:/<container-path>
docker run [...] -v /<host-path>:/<container-path>
}}}

!!!Portainer
Portainer ist die Oberfläche für Docker. In der Regel ist sie der einzige Container, der manuell über die Shell installiert wird.

Die Installation braucht eine Volume:

{{{
docker volume create portainer-data
docker run --name portainer --restart always -p 9000:9000 -v portainer-data:/data portainer/portainer
}}}

__Hinweis:__ Das Passwort wird beim ersten Start eingerichtet.

Von da ab kann man die meisten Operationen über Portainer ausführen.

!!!Automatische Updates
Container die aus Images von Docker Hub erzeugt wurden, können mit [containrrr/watchtower|https://hub.docker.com/r/containrrr/watchtower] automatisch aktualisiert werden.

Der Zugriff auf Docker erfolgt durch ein Binding: /var/run/docker.sock:/var/run/docker.sock

Wichtige Konfigurationsparameter werden in das Feld Command eingetragen:

* __Update Interval:__ --interval 86400 (täglich, default ist 5 min.)
* __Update Containers:__ <container-1> <container-2> [...]
* __Logging:__ --debug (sonst sieht man gar nichts)

Zusammen sieht das dann etwa so aus:

{{{
watchtower mongo mongo-express jenkins portainer rabbitmq --debug --interval 86400
}}}

Die Dokumentation findet man auf [Github|https://containrrr.github.io/watchtower/].

__Hinweis:__ Watchtower kann sich selbst updaten.

!!!Links
* __Download:__ [http://docs.master.dockerproject.org/engine/installation/binaries/]
* [https://docs.docker.com/machine/drivers/hyper-v]
* [https://docs.docker.com/v17.09/engine/userguide/networking/default_network/custom-docker0/]
* [https://docs.docker.com/engine/reference/commandline/dockerd/]