Einleitung
Mit Docker kann man leichtgewichtige Images mit einer Applikation erstellen um diese schnellst möglich von A nach B zu bringen.
Ein solches Image sollte im Idealfall wenige Megabytes gross sein und schnellst möglich starten. Genau für dies eignet sich Docker.
Doch Vorsichtig, auch mit Docker hat man einiges zu Beachten, den aus einer Applikation welche nicht grösser ist als wenige MB, kann schnell ein Image entstehen mit mehreren hundert MB bis hin zu über 1Gb.
Ziele
Am Ende dieses Atickels:
- Verstehst du die Basics für den Einsatz von Multistage builds in docker-compose
- Weisst du wie du das nächste Docker-Compose File schreibst für deine Anwendung(en)
Voraussetzungen
Als erstes benötigst du:
Du findest den ganzen Code in dem go-multistage-builder Repository
Frontend
Ich benutze ein Bereits erstelltes FrontEnd welches ich auf GitHub habe
Siehe Hier: https://github.com/GrolimundSolutions/2vault-frontend
Backend
Als Backend nutze ich ebenfals eine kleine Applikation welche ich auf GitHub Hoste. Diese ist in GO geschrieben und benutzt das GoGin Framework
Siehe Hier: https://github.com/GrolimundSolutions/2vault
Der Plan
Es sollen 2 Container entstehen, welche aber möglichst klein bleiben (+1 Zusätzliches Layer). Diese Sollten Untereinander Kommunizieren und Arbeiten können. Die Frontend Applikation sollte aufgerufen werden können.
Umsetzung
Das Dockerfile für das Backend entspricht genau dem selben wie ich bereits hier beschrieben habe: How To build Multistage Dockerfile for GO
Nun erstellen wir noch eine Dockerfile für das Builden des Frontends
Dies erstelle ich in deployments\docker\frontend
FROM alpine:latest AS builder # install git RUN apk add --no-cache git WORKDIR /htdocs RUN git clone https://github.com/GrolimundSolutions/2vault-frontend.git . FROM httpd:latest COPY --from=builder /htdocs /usr/local/apache2/htdocs
Bei diesem Build liegt auch wieder der grosse Vorteil das die ganzen Ausführungen zu mehreren Layern im Image fürt, diese bleiben aber in dem builder
Image und die benötigten Daten werden anschliessend mit COPY --from=builder /htdocs /usr/local/apache2/htdocs
in das eigentliche Zielimage kopiert was nur +1 zusätzliches Layer erzeugt.
Wir haben nun also 2 Dockerfiles
einmal eines für das Backend
und einmal eines für das Frontend
. Nun fehlt nur noch das Docker-Composefile
für das verknüpfen dieser 2 Dockerfiles.
version: "3.7" services: # Backend backend: build: . ports: - "8080:8080" networks: - vaultnet # Frontend frontend: build: ./deployments/docker/frontend ports: - "8081:80" networks: - vaultnet networks: vaultnet:
Starten kann man dies nun mit docker-compose up
. Dies erstellt die beiden Images Pullt den Sourcecode verarbeitet diesen und Kopiert es in das Endgültige Image.

In dem Obenstehenden Bild ist gut zu erkennen, das das Hinzufügen des Frontendpackets lediglich 0.03Mb benötigt hat. Hätte man dies alles auf einem Image macht, so wären aus diesen 137Mb schnell 500Mb geworden.