Inhaltsverzeichnis

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

Docker und time permisson error

Auf dem Raspi 4 kam es beim Versuch, einen neuen Container zu installieren, zu einem nur aufwendig zu behebenden Fehler. Es beginnt mit dieser Fehlermeldung:

  docker build -t zuulac  https://github.com/stko/zuul-ac.git
  
Step 2/5 : RUN pip install --user --no-cache-dir Flask requests
---> Running in 9ccdcb51ccec
Traceback (most recent call last):
File "/usr/local/bin/pip", line 5, in <module>
from pip._internal.cli.main import main
File "/usr/local/lib/python3.10/site-packages/pip/_internal/__init__.py", line 4, in 
<module>
from pip._internal.utils import _log
File "/usr/local/lib/python3.10/site-packages/pip/_internal/utils/_log.py", line 8, in 
<module>
import logging
File "/usr/local/lib/python3.10/logging/__init__.py", line 57, in <module>
_startTime = time.time()
PermissionError: [Errno 1] Operation not permitted

Diese Website wußte Hilfe, hier die daraus extrahierte Zusammenfassung:

Ein paar Pakete aktuallisieren:

# Get signing keys to verify the new packages, otherwise they will not install
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 04EE7237B7D453EC 648ACFD622F3D138
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0E98404D386FA1D9 6ED0E7B82643E131
# Add the Buster backport repository to apt sources.list
echo 'deb http://httpredir.debian.org/debian buster-backports main contrib non-free' | sudo tee -a /etc/apt/sources.list.d/debian-backports.list
 
sudo apt update
sudo apt install libseccomp2 -t buster-backports

und auch docker selbst braucht ein Update…

neue Datei

 sudo nano /etc/apt/sources.list.d/bullseye-testing-docker.list

mit

 deb http://mirrordirector.raspbian.org/raspbian/ bullseye main

Jetzt bloß kein apt upgrade starten!, denn erst muß das Update- Verhalten auf nur Docker eingeschränkt werden mit

 sudo nano /etc/apt/preferences.d/bullseye-docker.pref

und dem Inhalt

Package: * 
Pin: release n=bullseye 
Pin-Priority: 50

Dann erst ein beherztes

sudo apt update

docker stoppen

 systemctl stop docker

und

 sudo apt install docker.io/bullseye

und jetzt zeigt docker auch hoffentlich eine Version >= 20. an

docker -v

und kann mit

sudo systemctl restart docker

wieder angestartet werden.

Danach ließ sich der neue Container „builden“

Aus einem Container aus Virtualbox auf den Host zugreifen

Was macht man, wenn man aus einem Container in einer Virtualbox- Linux- VM auf Daten des Virtualbox- Hosts zugreifen will?

(siehe auch hier)

Zuerst richtet man für die VM in Virtualbox einen gemeinsamen Ordner ein mit folgenden Parametern ein

Name Der „Share“ Name, der später in der VM als Share des Mount- Befehls verwendet wird (Development)
Pfad Der Pfad auf dem Host, der in den Container gemappt werden soll
Zugriff Voll (oder halt weniger)
Automatisches Einbinden Normalerweise „Ja“
Nach Der Pfad, unter dem es in der VM selber gemountet wird (dies ist nicht der Pfad im endgültigen Container! ) (/media/host/development)

Nach dem Starten der VM legt man einmalig den Mount- Ordner an

sudo -p /media/host/development
sudo chmod -R a+rwx  /media/host/development

und mountet man erstmal den geteilten Ordner in den VM client

sudo mount -t vboxsf Development /media/host/development

um diesen Ordner dann zu guter Letzt zum Beispiel so an einen Container als Volume zu übergeben

docker run --rm -it -v /media/host/development/:/tmp debian:10-slim /bin/bash

Self certified certificates in Docker übernehmen

Wirft docker eine Fehlermeldung wie

$ docker run --rm -it burda/thunder-php:latest
Unable to find image 'burda/thunder-php:latest' locally
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": tls: failed to verify certificate: x509: certificate signed by unknown authority.

dann lieg's gerne mal am firmen-eigenen Certificate des Firmen- Proxies. Abhilfe

Eine externe HTTPS Website im Windows- Chrome- Browser öffnen, Zertifikat ansehen, das Firmen- eigene Root- CA lokalisieren, als company-CA.crt speichern und per scp auf den Zielrechner übertragen

  sudo apt-get install -y ca-certificates
  sudo cp company-ca.crt /usr/local/share/ca-certificates
  sudo update-ca-certificates
  
  sudo cp company-CA.crt /etc/docker/certs.d/docker.io/
  service docker restart

Einen Container testweise kopieren und mit anderem Entry- Point starten

Container stoppen

 docker stop container_name

Container- id raussuchen

 docker ps -a

den Container in ein neues „Copy-Image“ kopieren

docker commit <CONTAINER_ID> user/test_image

die Kopie mit neuem Entry- Point starten

docker run -ti --entrypoint=sh user/test_image