Allgemein
Knowledge Base
- Neue Struktur (In Arbeit)
- Computertechnisches
Community
Privat
Mit docker-compose wird die Konfiguration von Dockerfiles in die Datei `docker-compose.yml` ausgelagert.
Mit docker-compose beschränkt sich das Bauen/Starten/Stoppen eines Containers einen Befehl mit einem Parameter.
# docker-compose build
baut den eigenen Container, wenn man das überhaupt möchte
# docker-compose up
Startet den Container
# docker-compose stop
Stoppt den Container
Beispiel für eine docker-compose.yml
Datei:
version: '3.1' services: hello: image: my-hello:0.0.1 container_name: my-world
build: .
volumes: - ./mein-verzeichnis:/data environment: IRGEND_EINE_VARIABLE: scheibenkaese
Neben dieser docker-compose.yml
muss ein Dockerfile
liegen, in dem der eigene Container beschrieben wird.
FROM bash:4.4.23 ADD hello.sh / RUN chmod +x /hello.sh CMD ["/hello.sh"]
Da wir eine hello.sh
ausführen, wollen wir diese hier auch angeben.
#!/usr/bin/env bash echo 'Hallo Welt' echo "Diese Variable ist aus dem docker-compose: $IRGEND_EINE_VARIABLE" if ; then echo echo "Ich sehe das Verzeichnis /data mit der Datei hello-world" echo fi
Eigentlich fehlt nur noch das Verzeichnis, das lokal hier existieren muss und die Datei da drin.
# mkdir mein-verzeichnis # touch mein-verzeichnis/hello-world
Jetzt können wir das Dockerfile bauen mit Hilfe von docker-compose. Dabei wird das Script hello.sh in unser Docker-Image kopiert und ausführbar gemacht.
# docker-compose build Building hello Step 1/4 : FROM bash:4.4.23 ---> b06292092bf4 Step 2/4 : ADD hello.sh / ---> Using cache ---> ef0e59d41832 Step 3/4 : RUN chmod +x /hello.sh ---> Using cache ---> c5ca3cec3a43 Step 4/4 : CMD ["/hello.sh"] ---> Using cache ---> 1ece9d679110 Successfully built 1ece9d679110 Successfully tagged my-hello:0.0.1
Zum Ausführen dieses Docker-Images einfach docker-compose up starten
# docker-compose up Creating network "dockertest_default" with the default driver Creating my-world ... done Attaching to my-world my-world | Hallo Welt my-world | Diese Variable ist aus dem docker-compose: scheibenkaese my-world | my-world | Ich sehe das Verzeichnis /data mit der Datei hello-world my-world | my-world exited with code 0
Stoppen brauchen wir das hier nicht mehr, da es sich selbst schon beendet hat.
Jetzt noch ein paar nützliche Dinge:
Wo sieht man jetzt, welche Container laufen, dazu gibt es docker ps
, das zeigt alle aktuell laufenden Container an.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Die Liste ist aber leer, weil unser Container sofort wieder beendet wurde.
Es gibt aber eine weitere Liste, die der installierten Images.
Ein Docker-Image ist wie eine Java-Klasse, ein Container ist eine mit 'new Klasse()' erstellte Instanz eines Images. Man kann mehrere Container eines Images erstellen und starten, der Port muss sich unterscheiden, mit dem ich die Container dann anspreche.
REPOSITORY TAG IMAGE ID CREATED SIZE my-hello 0.0.1 1ece9d679110 18 minutes ago 14.7MB bash 4.4.23 b06292092bf4 3 weeks ago 14.7MB
Hier sieht man, welche Docker-Images alle installiert sind, auch dessen Alter und Größe.
Zwei weitere Wege um unser Image jetzt zu starten:
# docker run -it my-hello:0.0.1 bash
oder
# docker run -it 1ece9d679110 bash
bequemer ist aber der Weg über docker-compose
# docker-compose up
Da es etwas altertümlich ist, mit docker ps
oder docker images
zu arbeiten, gibt es portainer. Das ist ein Docker Container, den man einmal bei sich installiert/startet und dann kann man über den angegeben Port seine Container verwalten.
# docker volume create portainer-data # docker run -d -p 8080:9000 --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer-data:/data portainer/portainer
Jetzt geht im lokalen Browser: http://127.0.0.1:8080 vergibt sich einen Username/Password und schon kann man seine Container sehen.
Das geht auch über das Netz dann muss man im Router den Port nach außen freigeben und wenn man dann vergessen hat, das heutzutage https StateOfTheArt? ist, gibt es ständig Post von der Telekom, das man einen offenen http basierten Port hat.
Aber das ist ein anderes Thema.