Installieren
sudo apt-get install docker.io docker-compose
Den aktuellen Benutzer zur Gruppe docker hinzufügen, damit er auch als normaler Benutzer auf den Docker-Daemon und die laufenden Container einwirken kann.
sudo usermod -aG docker $USER
Dann einmal ab- und wieder anmelden!
Docker container laufen, aber sie sind nicht sichtbar in docker ps -a
oder docker images
? Dann ist docker vielleicht gleichzeitig per apt
und als snap module installiert? Mit
snap list
kann man das überprüfen und ggf. mit
sudo snap remove docker
korrigieren
log into bash
docker exec -it schnipsl /bin/bash
log into bash in einem temporären Container aus einem Image
docker run --rm -it --entrypoint bash <image-id>
run a text editor
docker run --name=nano -it --rm -v=schnips-backup:/tmp/myvolume piegsaj/nano nano
list content
docker run --rm -i -v=postgres-data:/tmp/myvolume busybox find /tmp/myvolume
# search for old container docker ps -a # remove it docker rm dazzling_davinci # find its old image docker images # remove it docker rmi 48b7e7bba360 # create from scratch docker -D build -t schnipsl:v1 . #run it first time docker run -i -v schnips-backup:/app/devices/master/volumes/backup -v schnips-runtime:/app/devices/master/volumes/runtime --network=host 0d72f342e1c2 # stop it docker stop priceless_pare # start it again docker start -i priceless_pare
Komischerweise muß man gemeinsame Netzwerke mit docker global definieren und kann sie dann erst von den Docker-Compose- Instanzen ansprechen?!?
docker network create external-example
version: '3' services: service1: image: busybox command: sleep infinity networks: default: external: name: external-example
Blöd, wenn man gezwungen ist, unter Windows zu entwickeln, aber keine Docker Desktop Lizenz bezahlt bekommt.
Lösungsansatz:
Docker in einer Ubuntu VM in Virtualbox laufen lassen und den Entwicklungsordner teilen.
Das Teilen findet dann entweder über die grafische Konfugurationsoberfläche von VB statt oder per Kommandozeile 1) auf dem Host:
VBoxManage sharedfolder add "VM name" --name sharename --hostpath "C:\test"
mit der Option --transient
bleibt die Verbindung einmalig nur für diese Session, die option --readonly
macht… guess what..
Damit das auch beim Start per Automount funktioniert, muss der Unix User Mitglied der Gruppe vboxsf sein
sudo usermod -aG vboxsf userName
mounten dann mit
mkdir /home/<user>/vboxshare sudo mount -t vboxsf -o uid=1000,gid=1000 sharename /home/<user>/vboxshare
Wieder mal ein erfülltes Wochenende…
Nach langem Gebastel habe ich begriffen, dass man ein Gebinde aus mehreren Containern mehrmals starten kann, wenn man den -p (–project-name) Parameter verwendet und docker-compose
dann die Container um dem Projektnamen erweitert, weil sonst bei jedem Start die Container alle gleich heißen und man letztlich keine Neuen startet, sondern nur die bereits gestarteten anspricht.
Der Spaß fängt an, wenn die Container ins Filesystem des Hosts gemountet sind, um gemeinsam Konfig- Dateien zu lesen, aber unabhängig Dateien schreiben sollen, ohne sich in die Quere zu kommen - denn leider kann 'docker-compose' in der docker-compose.yml
den aktuellen Projektnamen nicht als Variable benutzen. Und damit fing das Experimentieren an..
Docker-compose
kann aber Umgebungsvariablen in die Config übernehmen, aber auch da nur zur Manipulation der Werte, aber leider nicht zur Manipulation des Key-Namens.
Der Trick ist nun, erst eine Umgebungsvariable zu definieren und die dann gleichzeitig als Projektname und in der Config selber zu benutzen. Da sich hier im Beispiel die unterschiedlichen Instanzen durch den Port unterscheiden sollen, unter dem sie erreichbar sind, ist der Port hier quasi der Schlüssel:
export PORT=8504 ; docker-compose --project-name ${PORT:-8504} up
Damit kann man dann zum einen die Verzeichnisse manipulieren, wo die Instanzen ihre Daten speichern sollen
logbook_maria: image: mariadb:10 volumes: - ./logbookMaria/${PORT:-8504}:/var/lib/mysql
und man benutzt die Zahl auch gleich für den Port
logbook_nginx: ports: - "${BINDADRESS:-127.0.0.1}:${PORT:-8504}:80"
Und damit's so richtig ins Eingemachte geht: Je nach Syntax sind die Variablen an den verschiedenen neuralgischen Stellen sichtbar- oder eben leider nicht…
Variante | im Docker Compose Aufruf | im docker-config.yml | im Container selber |
---|---|---|---|
VAR=etwas | X | - | X |
export VAR=etwas | - | X | ? |
export VAR=etwas ; | X | X | ? |
Ich hoffe, ich hab das jetzt so richtig wiedergegeben..
Wird immer gerne vergessen: Der Befehl, um die Images zu löschen, die keinen Container mehr haben:
docker image prune [-a]
Remove all dangling images. If -a is specified, will also remove all images not referenced by any container.
Manche Tools (z.B. Python_on_Whales) vertrauen auf das Vorhandensein des docker compose
Befehls, was aber in vielen Distributionen noch gar nicht unterstützt wird, wo es noch das „pin-kompatible“ docker-compose
gibt.
Zum Glück haben die Docker- Macher aber einen Weg gefunden, ältere Versionen aufzurüsten:
# add docker compose for docker version < 2.0 # create the docker plugins directory if it doesn't exist yet mkdir -p ~/.docker/cli-plugins # download the CLI into the plugins directory curl -sSL https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose # make the CLI executable chmod +x ~/.docker/cli-plugins/docker-compose # and do the same because the pyEdge- Service runs as root, so also root need this extension # create the docker plugins directory if it doesn't exist yet sudo mkdir -p /root/.docker/cli-plugins sudo cp ~/.docker/cli-plugins/docker-compose /root/.docker/cli-plugins