Commit b248b091 authored by Nane Kratzke's avatar Nane Kratzke
Browse files

Registry Handling

parent b59b76e6
...@@ -9,7 +9,7 @@ to be done ...@@ -9,7 +9,7 @@ to be done
- [Übung 01: Installation von Docker](#übung-01-installation-von-docker) - [Übung 01: Installation von Docker](#übung-01-installation-von-docker)
- [Übung 02: Erstellung von einem Image](#übung-02-erstellung-von-einem-image) - [Übung 02: Erstellung von einem Image](#übung-02-erstellung-von-einem-image)
- [Aufgabe 02.1 HTTP-Service mittels eines NGINX-Basisimages](#aufgabe-021-http-service-mittels-eines-nginx-basisimages) - [Aufgabe 02.1 HTTP-Service mittels eines NGINX-Basisimages](#aufgabe-021-http-service-mittels-eines-nginx-basisimages)
- [Aufgabe 03.2: HTTP-Service mittels eines generellen Basisimages](#aufgabe-032-http-service-mittels-eines-generellen-basisimages) - [Aufgabe 03.2: HTTP-Service mittels eines generellen Basis-Images bauen](#aufgabe-032-http-service-mittels-eines-generellen-basis-images-bauen)
- [Übung 03: Vergleich von Imagegrößen](#übung-03-vergleich-von-imagegrößen) - [Übung 03: Vergleich von Imagegrößen](#übung-03-vergleich-von-imagegrößen)
- [Aufgabe 03.1: Unnötige Dateien löschen](#aufgabe-031-unnötige-dateien-löschen) - [Aufgabe 03.1: Unnötige Dateien löschen](#aufgabe-031-unnötige-dateien-löschen)
- [Aufgabe 03.2: Image Layer einsparen](#aufgabe-032-image-layer-einsparen) - [Aufgabe 03.2: Image Layer einsparen](#aufgabe-032-image-layer-einsparen)
...@@ -48,7 +48,7 @@ cd lab-containerization ...@@ -48,7 +48,7 @@ cd lab-containerization
### Aufgabe 02.1 HTTP-Service mittels eines NGINX-Basisimages ### Aufgabe 02.1 HTTP-Service mittels eines NGINX-Basisimages
1. Öffnen Sie nun bitte die Datei `Dockerfile.nginx` (diese ist recht übersichtlich, versuchen Sie diese zu verstehen und nachzuvollziehen) 1. Öffnen Sie nun bitte die Datei `Dockerfile.nginx` (diese ist recht übersichtlich, versuchen Sie diese zu verstehen und nachzuvollziehen)
2. Erzeugen Sie aus dieser nun das für Docker verarbeitete Dockerfile mittles `cp Dockerfile.nginx Dockerfile`. 2. Erzeugen Sie aus dieser nun das für Docker erforderliche Dockerfile mittels `cp Dockerfile.nginx Dockerfile`.
3. Bauen Sie nun ein Container-Image mittels `docker build -t web:nginx .` (vergessen Sie nicht die Punkt am Ende, der gibt das Current Directory an und ist wichtig!). 3. Bauen Sie nun ein Container-Image mittels `docker build -t web:nginx .` (vergessen Sie nicht die Punkt am Ende, der gibt das Current Directory an und ist wichtig!).
4. Prüfen Sie mittels `docker image list web*`, ob Ihr Image gebaut wurde. Sie sollten eine Ausgabe wie folgt (o. ähnl.) erhalten. 4. Prüfen Sie mittels `docker image list web*`, ob Ihr Image gebaut wurde. Sie sollten eine Ausgabe wie folgt (o. ähnl.) erhalten.
``` ```
...@@ -58,13 +58,13 @@ cd lab-containerization ...@@ -58,13 +58,13 @@ cd lab-containerization
5. Starten Sie dieses Image nun bitte mittels `docker run -p 8080:80 web:nginx` (Sie binden dadurch Ihren lokalen Port 8080 an den Port 80 des Containers). 5. Starten Sie dieses Image nun bitte mittels `docker run -p 8080:80 web:nginx` (Sie binden dadurch Ihren lokalen Port 8080 an den Port 80 des Containers).
6. Prüfen Sie, ob Ihre Website ausgeliefert wird, in dem Sie [http://localhost:8080](http://localhost:8080) aufrufen. Sie sollten dann folgende Webpage sehen. 6. Prüfen Sie, ob Ihre Website ausgeliefert wird, in dem Sie [http://localhost:8080](http://localhost:8080) aufrufen. Sie sollten dann folgende Webpage sehen.
![screenshot](index.html.png) ![screenshot](index.html.png)
7. Beenden Sie den HTTP-Service in dem Sie in Ihre Konsole CTRL-C drücken (Sie senden damit das SIGTERM Signal an den NGINX Server-Prozess und der Container wird terminiert). 7. Beenden Sie den HTTP-Service in dem Sie in Ihrer Konsole CTRL-C drücken (Sie senden damit das SIGTERM Signal an den NGINX Server-Prozess und der Container wird terminiert).
Das war ja einfach. Das war ja einfach.
### Aufgabe 03.2: HTTP-Service mittels eines generellen Basisimages ### Aufgabe 03.2: HTTP-Service mittels eines generellen Basis-Images bauen
In Fällen von weit verbreiteten Diensten und Produkten wie NGINX, Apache, Redis, Memcached, CouchDB, MySQL, usw. finden sich häufig solche Basisimages der entsprechenden Projekte. Das geht meist sehr schnell und ist unkompliziert, sie verlieren aber auch Kontrolle und Konfigurationsmöglichkeiten. In Fällen spezifischerer Produkte oder selbst geschriebener Software sind Sie sogar ggf. gezwungen selber ein Image zu erstellen und die entsprechende Software darauf zu installieren. Man geht in diesen Fällen üblicherweise von einem Distributions Basis-Image aus (wie bspw. dem Ubuntu 18.04 LTS Image). In Fällen von weit verbreiteten Diensten und Produkten wie NGINX, Apache, Redis, Memcached, CouchDB, MySQL, usw. finden sich häufig solche Basisimages der entsprechenden Projekte. Das geht meist sehr schnell und ist unkompliziert. Sie verlieren aber auch etwas Kontrolle und Konfigurationsmöglichkeiten. In Fällen spezifischerer Produkte oder selbst geschriebener Software sind Sie sogar ggf. gezwungen selber ein Image zu erstellen und die entsprechende Software darauf zu installieren. Man geht in diesen Fällen üblicherweise von einem Distributions Basis-Image aus (wie bspw. dem Ubuntu 18.04 LTS Image).
Wir wollen nun denselben Service mit einem anderen Image bauen, um diesen generelleren Ansatz zu demonstrieren. Wir wollen nun denselben Service mit einem anderen Image bauen, um diesen generelleren Ansatz zu demonstrieren.
...@@ -204,11 +204,42 @@ docker run -p 8080:80 web:alpine-cleaned ...@@ -204,11 +204,42 @@ docker run -p 8080:80 web:alpine-cleaned
docker run -p 8080:80 web:alpine-shrinked docker run -p 8080:80 web:alpine-shrinked
``` ```
und danach [http://localhost:8080](http://localhost:8080) aufrufen. und danach [http://localhost:8080](http://localhost:8080) aufrufen. Der erbrachte Dienst ist in allen Fällen derselbe.
## Übung 04: Push von einem Image in eine Registry ## Übung 04: Push von einem Image in eine Registry
Bislang haben Sie Images lokal auf Ihrem Host erzeugt. Das ist für lokale Entwicklungszwecke meist vollkommen ausreichend. Aber Sie haben auch bereits gesehen, dass Images in Public oder Private Registries bereitgestellt werden können. Die bereits in diesem Lab von Ihnen genutzten NGINX, Ubuntu und Alpine Images sind bspw. aus dem öffentlichen [Dockerhub](https://dockerhub.com) bezogen worden (ohne das Sie dies vermutlich recht zur Kenntnis genommen haben).
In der normalen Entwicklung stellt man Images normalerweise in Privaten Registries zur Verfügung, damit nicht alle Zugriff auf diese haben. Hierzu können Image Registries private gehostet werden. Bspw. kann dies mit dem [THL Gitlab Service](https://git.mylab.th-luebeck.de) in jedem Projekt gemacht werden.
Dies wollen wir nun demonstrieren:
__Hinweis:__ Dieser Teil kann auch mit dem Public [Gitlab.com](https://gitlab.com) Service analog nachvollzogen werden, falls Sie sich dort registriert haben.
1. Loggen Sie sich hierzu in den [THL Gitlab Service]](https://git.mylab.th-luebeck.de) ein.
2. Legen Sie in der Weboberfläche mittels "Neues Projekt" ein Test Repository namens `image-test` mit der Visibility `private` an.
3. Klicken Sie in diesem Repository auf "Packages & Registries -> Container Registry". Sie sollten dann eine (noch) leere Registry sehen.
![Registry](registry.png)
4. Ihnen sind ferner ein paar Kommandos vorgegeben, um sich mit der Registry von Docker aus zu verbinden (diese können Sie sogar komfortable aus der Web-Oberfläche kopieren).
5. Loggen Sie sich min ihrer Konsole in die Registry ein (geben Sie Ihre Zugangsdaten ein).
6. Arbeiten Sie nun mit NGINX-Image `cp Dockerfile.nginx Dockerfile`.
7. Bauen Sie nun dieses Image für Ihre Registry mittels `docker build -t git.mylab.th-luebeck.de:4181/<max>.<mustermann>/web/image-test:nginx .`.
8. Pushen Sie das Image anschließend in diese Registry mittels `docker push git.mylab.th-luebeck.de:4181/<max>.<mustermann>/image-test/web:nginx`. Ersetzen Sie dabei `<max>.<mustermann>` mit Ihrem Namen (oder kopieren Sie diesen aus der GitLab-Web-Oberfläche). Der Upload kann ggf. etwas länger daueern.
9. Navigieren Sie erneut zu Ihrer Registry. Sie sollten Ihr Image dort nun sehen.
![Registry-filled](registry-filled.png)
10. Mittels `docker pull git.mylab.th-luebeck.de:4181/<max>.<mustermann>/image-test/web:nginx` können Sie es von der Registry herunterladen.
11. Unterschiedliche Versionen von Images können Sie mit Tags kennzeichnen.
```
cp Dockerfile.alpine Dockerfile
docker build -t git.mylab.th-luebeck.de:4181/<max>.<mustermann>/web/image-test:alpine .
docker push git.mylab.th-luebeck.de:4181/<max>.<mustermann>/web/image-test:alpine
```
würde das Alpine-basierte Image erzeugen.
![registry-tag](registry-tags.png)
Dieses könnten Sie mittels `docker pull git.mylab.th-luebeck.de:4181/<max>.<mustermann>/web/image-test:alpine` auf ihren lokalen Host herunterladen.
Gebräuchlich ist dies, um unterschiedliche Versionen von Images mittels Versionsnummern wie `image:0.1.0` zu kennzeichnen.
Mittels dieser Tool-Chain lassen sich also Images in Registries zentral bereitstellen und für Deployments nutzen.
## Übung 05: Pipeline zum Bau und Test eines Images ## Übung 05: Pipeline zum Bau und Test eines Images
...@@ -221,10 +252,9 @@ und danach [http://localhost:8080](http://localhost:8080) aufrufen. ...@@ -221,10 +252,9 @@ und danach [http://localhost:8080](http://localhost:8080) aufrufen.
## Was sollten Sie mitnehmen ... ## Was sollten Sie mitnehmen ...
1. Mittels der den meisten Distributionen beiliegenden Package Managern ist es über 1. Mittels der den meisten Distributionen beiliegenden Package Managern ist es über `RUN`-Commands möglich in Basis-Images beliebige Software komfortabel und "non-interactive" zu installieren.
`RUN`-Commands möglich in Basis-Images beliebige Software komfortabel und "non-interactive" zu installieren.
1. Eigener Code, Content oder Konfigurationen können mittels `ADD`-Commands dem Container-Image hinzugefügt werden (und danach mittels `RUN`-Commands auch kompiliert und installiert werden). 1. Eigener Code, Content oder Konfigurationen können mittels `ADD`-Commands dem Container-Image hinzugefügt werden (und danach mittels `RUN`-Commands auch kompiliert und installiert werden).
2. Sie können Server-Dienste mittels TCP-Ports nach außen `EXPOSE`n. 2. Sie können Server-Dienste mittels TCP-Ports nach außen `EXPOSE`n.
3. Über `ENTRYPOINT` können Sie hierzu den Prozess starten, der durch den Container bereitgestellt werden soll (vermeiden Sie dabei Prozesse als Daemons zu starten). 3. Über `ENTRYPOINT` können Sie hierzu den Prozess starten, der durch den Container bereitgestellt werden soll (vermeiden Sie dabei Prozesse als Daemons zu starten).
4. Image-Größen lassen sich mittels **RUN-Chaining** und der Wahl kleiner Basis-Images signifikant reduzieren. 4. Image-Größen lassen sich mittels **RUN-Chaining** und der Wahl kleiner Basis-Images signifikant reduzieren.
5. Mittels `docker login` kann man sich auf entfernten Image-Registries einloggen um dann mittels `docker push` und `docker pull` Images auf privaten Registries hochladen bzw. herunterladen zu können.
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment