Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

pc:dockertricks

Docker Tricks

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 

Gemeinsames Netzwerk zwischen getrennten Docker-Compose

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 

Docker in einer Unix Client VM

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  

Docker-Compose, mehrere Instanzen und Umgebungsvariablen

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..

unbenutzte Images löschen

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.

Docker <2.0 um den Compose Befehl ergänzen

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
pc/dockertricks.txt · Zuletzt geändert: 2022/10/25 07:30 von admin