Inhalte
Docker erleichtert nicht nur den Entwicklern die Arbeit. Sondern auch allen Systemadministratoren, die Container oder VMs regelmäßig deployen müssen. Docker ist eine containerbasierte Virtualisierungslösung und ersetzt bzw. verbessert die alte Linux Container Lösungen wie LXC. Docker ist dabei ressourcenschonender als herkömmliche Virtualisierungswege und ist dabei noch komplett Quelloffen. Docker ist auch gleichzeitig das größte GitHub Projekt und wird ständig weiterentwickelt. Grund genug, um jetzt ein Beitrag zu schreiben.
Was ist Docker und wofür verwendet man es?
Anders als bei einer herkömmliche Virtualisierung(VM), dass auf dem Hypervisor bzw. auf dem Host System verschiedene Gastsysteme installiert, benutzt Docker Container, die auf einen Docker Engine hören. Die Anwendungen werden als isolierte Prozesse auf dem Host-System ausgeführt und brauchen daher nur wenig Ressourcen. Anders als bei der herkömmlicher Virtualisierung (VMs), braucht ein Docker Container nicht das komplette Betriebssystem zu laden, sodass Docker schneller und portierbarer ist. Der Docker Container benutzt mithilfe der Docker Engine den Kernel des Hostsystems. D.h. Ein komplettes Betriebssystem wird für ein einzelnen Container nicht mehr gebraucht. Das Bild verdeutlicht es. Auch ist ein Docker Container, anders als eine VM, nicht gigantisch groß. Nur die Libarys und die entsprechende Anwendung ist in einem Container drinnen. Doch Docker hat noch mehr anzubieten. Docker besitzt ein großes vorgefertigtes Repository/Registry, um fertige Container zu laden. Das Docker Hub. Das Repository ist standardmäßig in Docker vorkonfiguriert und ermöglicht aus hunderten vorgefertigten Vorlagen, ein eigenen fest individuelles Image zu erstellen.
Docker kann noch vieles vieles mehr….Doch genug mit der Theroie. Wenn ihr mehr wissen wollt, dann schaut auch mal bei Wikipedia oder auf der Docker Webseite vorbei 🙂
Klassische Installation auf Debian Buster
Um Docker zu installieren müssen wir als erstes unser Betriebssystem aktualisieren und die standard Tools wie curl
oder Stammzertifikate ggf. updaten oder nachinstallieren.
sudo apt update && apt upgrade -y apt install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
Nach der Installation der Tools kann es los gehen. Wir fügen nun das offizielle Repository von Docker auf dem Host-System hinzu.
curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add - add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian buster stable" apt update
Sollte kein Fehler auftauchen, haben wir nun die Grundlagen geschaffen. Nun installieren wir die Docker Engine:
apt install -y docker-ce docker-ce-cli containerd.io
Fertig! Nun haben wir Docker in der Grundkonfiguration installiert. Mit docker version
können wir überprüfen, ob die Engine auch wirklich erfolgreich installiert worden ist. Wird alles richtig angezeigt, können wir nun ein Docker Container erstellen. Dies machen wir jetzt auch. Mithilfe des Hallo-World Image, können wir feststellen, ob Docker auch richtig funktioniert. Wir erstellen nun ein HalloWorld-Container.
docker run hello-world
Der Befehl docker run <imagenamen>
erzeugen wir nun ein Container. Er sucht lokal nach dem Image hello-world
und wenn nichts gefunden worden ist, wird es das Image aus dem DockerHub heruntergeladen und gestartet. Die Ausgabe des Containers könnte so aussehen:
root@Docker:~# docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 0e03bdcc26d7: Pull complete Digest: sha256:e7c70bb24b462baa86c102610182e3efcb12a04854e8c582838d92970a09f323 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
Sollten wir diese Ausgabe sehen, hat alles wunderbar funktioniert. Damit ist Docker erfolgreich auf dem System installiert.
Docker Composer
Nun haben wir Docker mit der Engine auf unserem Debian Buster installiert und können schon jetzt Container erstellen und starten. Mithilfe von Ports können wir vom Host aus in den Container reinhorchen. Doch Docker kann noch viel mehr. Wie wäre es, wenn wir eine Datei mit unseren Anforderungen des Container definieren und Docker angeben, dass es daraus ein Container erstellen soll? Genau das erledigt uns der Docker Composer. Der große Vorteil des Composer ist es jedoch auch, dass mehrere Anwendungen aus verschiedenen Containern zu einem Container verbunden werden können. Dies erleichert später komplexe Container Szenarien. Erst mit dem Docker Composer, macht es Docker zu einem sehr leicht konfigurierendes und mächtiges Virtualisierungs-Tool. Die Installation ist superleicht. Legen wir Los..Wir holen uns die letzte Version des Composer aus dem GitHub Projekts:
curl -s https://api.github.com/repos/docker/compose/releases/latest | grep browser_download_url | grep docker-compose-Linux-x86_64 | cut -d '"' -f 4 | wget -qi -
und verschieben die Binary in das bin
Verzeichnis und machen es ausführbar.
mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose
Fertig. Nun testen wir den Composer indem wir eine Datei Namens docker-compose.yml
erstellen mit folgendem Inhalt.
version: '3' services: web: image: nginx:latest ports: - "8080:80" links: - php php: image: php:7-fpm
Beschreibung der Datei:
- version: Der Composer mit der Version 3 wird benutzt
- image: Das Nginx(Webserver) wird als Grundimage benutzt. Falls nicht vorhanden, wird es aus dem Docker Hub gedownlaodet.
- ports: Vom Hostsystem aus erreichen wir den Container mit dem Port 8080. Alle Anfragen werden in den Container weitergeletet intern im Container wird der Port 80 benutzt.
- links: Verknüpfung zum anderem Container
- php – Neuer Container mit dem php:7-fpm image
Nun starten wir den Composer mit dem Docker Composer Befehl.
docker-compose up -d
Nun liest der Composer die Datei ein und beginnt anhand der Konfiguration ein Container zu erstellen. Rufen wir die HostIP Adresse mit dem Port 8080 auf, so werden wir die Standardseite des Nginx Server sehen.
Mit docker ps
können wir alle Docker Container anschauen. Bsp:
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 46aca9a07640 collabora/code:latest "/bin/sh -c 'bash st…" 23 hours ago Up 23 hours 0.0.0.0:9980->9980/tcp collabory_app_3 6945b9dc1053 ghost:latest "docker-entrypoint.s…" 3 days ago Up 25 hours 0.0.0.0:32768->2368/tcp Ghost 7e2ff07f69c5 portainer/portainer "/portainer" 3 days ago Up 25 hours 0.0.0.0:8000->8000/tcp, 0.0.0.0:9000->9000/tcp portainer
Portainer installieren
Wunderbar! Bis zu diesem Schritt haben wir nun ein funktionierenden Docker Host + Composer installiert und können nun per CLI oder per File Container erstellen. Doch es geht noch einfacher! Wir installieren nun eine grafische Oberfläche für Docker. Mithilfe der Gui können wir dann später sehr leicht Container von einer Weboberfläche erstellen und managen. Auch können wir mehrere Host-Systeme zu einem Super Cluster verbinden. Da die Gui auch nur ein Docker Container ist, können wir dies sehr leicht erstellen.
docker volume create portainer_data docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
Wir erstellen mit docker volume
ein Speicherplatzbereich auf dem Host System. Danach starten wir den Container mit den entsprechenden Parametern. Wichtig ist, dass der Paramenter -v /var/run/docker.sock
auch wirklich zu der von Docker ausgeben socket hinzeigt. Auch das Volume, dass wir gerade erstellt haben, binden wir mit mit dem Paramenter -v
ein. Nach kurzer zeit, können wir uns dann auf die Weboberfläche einloggen. Dazu loggen wir uns mit der Host IP und dem Port 9000 in Portainer ein und können dann als ersten Step ein Adminstrationspasswort vergeben. Im darauffolgenden Schritt wählen wir die local Maschine als Host/Endpoint aus und können dann alle Container sehen und bzw. verwalten.
Fertig! Damit hätten wir erst einmal alle Grundlagen von Docker durch. Viel Spaß beim ausprobieren und nachbauen.