Docker: Unterschied zwischen den Versionen
Codica (Diskussion | Beiträge) |
Codica (Diskussion | Beiträge) |
||
(14 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 3: | Zeile 3: | ||
== Installation == | == Installation == | ||
+ | ==== Installation unter Debian 9 Stretch ==== | ||
+ | |||
+ | Siehe | ||
+ | * https://linuxconfig.org/how-to-install-docker-engine-on-debian-9-stretch-linux | ||
+ | |||
+ | |||
+ | ==== Installation unter Ubuntu ==== | ||
sudo aptitude install lxc apparmor docker.io | sudo aptitude install lxc apparmor docker.io | ||
sudo addgroup USER docker | sudo addgroup USER docker | ||
Zeile 12: | Zeile 19: | ||
kann man sich anzeigen lassen, wo Docker Images u.Ä. abspeichert. In der <code>/etc/fstab</code> kann man das auf einen Ordner einer anderen Partition umhängen: | kann man sich anzeigen lassen, wo Docker Images u.Ä. abspeichert. In der <code>/etc/fstab</code> kann man das auf einen Ordner einer anderen Partition umhängen: | ||
/media/anderePartiton/aufsRoot /var/lib/docker/aufs none bind 0 0 | /media/anderePartiton/aufsRoot /var/lib/docker/aufs none bind 0 0 | ||
+ | |||
+ | |||
+ | Alternativ gibt man in der Datei <code>/etc/default/docker</code> in den <code>DOCKER_OPTS</code> den zusätzlichen Parameter <code>-g</code> an. Beispiel: | ||
+ | DOCKER_OPTS="-g /mnt/mybigdata/dockerroot" | ||
== Erstellen eines eigenen Basis-Images == | == Erstellen eines eigenen Basis-Images == | ||
Zeile 42: | Zeile 53: | ||
Dann wechselt man in das Verzeichnis mit <code>cd</code> und baut das Image mit folgendem Befehl: | Dann wechselt man in das Verzeichnis mit <code>cd</code> und baut das Image mit folgendem Befehl: | ||
+ | docker build -t IMAGENAME:IMAGETAG . | ||
== Ausführen einer Shell == | == Ausführen einer Shell == | ||
Zeile 56: | Zeile 68: | ||
+ | == Privates Repository == | ||
+ | |||
+ | |||
+ | === Installation und Start === | ||
+ | Für ein privates Repository startet man - ganz docker-like - einen entsprechenden Container mit dem Image "registry":<ref>Siehe https://docs.docker.com/registry/deploying/ .</ref> | ||
+ | docker run -d -p 5000:5000 --restart=always --name registry -v `pwd`/data:/var/lib/registry registry:2 | ||
+ | |||
+ | === Konfiguration einer unsicheren privaten Registry === | ||
+ | Für Testzwecke kann man auch von anderen Rechnern im privaten Netzwerk UNGESICHERT auf die Registry zugreifen. Dazu muss man dem Daemon das aber explizit erlauben, indem man folgende Zeile in <code>/etc/default/docker</code> einfügt: | ||
+ | DOCKER_OPTS="--insecure-registry registryrechner:5000" | ||
+ | |||
+ | Dann muss man diesen Daemon neu starten: | ||
+ | sudo service docker restart | ||
+ | |||
+ | === Eintragen eines Images im Registry === | ||
+ | |||
+ | Zunächst muss das vorhandene Image umgetaggt werden: | ||
+ | |||
+ | docker tag user/eigenesimage registryrechner:5000/user/eigenesimage | ||
+ | |||
+ | Dann muss es hochgeschoben werden: | ||
+ | docker push registryrechner:5000/user/eigenesimage | ||
+ | |||
+ | == Docker und Netzwerk == | ||
+ | |||
+ | Einen Port des Containers kann man mit der Option -p als Port des Hosts zur Verfügung stellen: | ||
+ | docker run -p 4304:4304 myimage | ||
+ | |||
+ | Leider scheint es Probleme mit IPv4-Adressen des Hosts zu geben. Abhilfe schafft in kleineren Fällen die Option <code>--net=host</code>. Diese sollte aber aus Sicherheitsgründen vermieden werden, weil damit von außen voller Zugriff auf alle Ports des Containers gegeben wird. | ||
+ | |||
+ | === Docker und IPv6 === | ||
+ | |||
+ | Docker hat standardmäßig die IPv6-Unterstützung nicht eingeschaltet. Das kann man aber | ||
+ | machen: | ||
+ | * https://docs.docker.com/config/daemon/ipv6/ | ||
+ | * https://gdevillele.github.io/engine/userguide/networking/default_network/ipv6/ | ||
+ | * https://medium.com/@skleeschulte/how-to-enable-ipv6-for-docker-containers-on-ubuntu-18-04-c68394a219a2 | ||
+ | * https://dev.to/joeneville_/build-a-docker-ipv6-network-dfj | ||
+ | |||
+ | == Docker updates == | ||
+ | |||
+ | Auch Docker container müssen auf neue Versionen überwacht werden. | ||
+ | |||
+ | === Monitoring container updates === | ||
+ | |||
+ | Mit [https://fmartinou.github.io/whats-up-docker/#/ What's up Docker] kann man sich z.B. eine Email zuschicken lassen, wenn ein Container-Image upgedatet wurde. | ||
+ | |||
+ | == Troubleshooting Docker == | ||
+ | |||
+ | === SystemD läuft nicht === | ||
+ | |||
+ | Es gibt grundsätzlich zwei Möglichkeiten, [[systemd]]-services bereitzustellen: | ||
+ | |||
+ | * SystemD installieren und viel Funktionalität zu entfernen oder | ||
+ | * https://github.com/gdraheim/docker-systemctl-replacement | ||
+ | |||
+ | === Chrome/Chromium startet nicht === | ||
+ | |||
+ | Wenn Chrome nicht startet (Fehlermeldung: <small>Failed to move to new namespace: PID namespaces supported, Network namespace supported, but failed: errno = Operation not permitted</small>), hilft das Argument <code>--no-sandbox</code>.<ref>Siehe https://github.com/wechaty/wechaty/issues/26</ref> | ||
+ | |||
+ | == Einzelne Images == | ||
+ | |||
+ | === MySQL-Image === | ||
+ | |||
+ | Siehe für ein einfaches Dockerfile für einen [[MySQL]]-Container: | ||
+ | * https://entwickler.de/online/docker-am-praktischen-beispiel-mit-wordpress-150107.html | ||
+ | |||
+ | Wenn MySQL nicht mit | ||
+ | mysqld | ||
+ | startet, kann es daran liegen, dass der Socket nicht erstellt werden kann. Dann: | ||
+ | mkdir /var/run/mysqld/ | ||
+ | chmod a+w /var/run/mysqld/ | ||
Aktuelle Version vom 23. Juli 2024, 13:10 Uhr
Docker ist eine Container-Lösung, eine Art "leichte" Virtualisierung.
Installation
Installation unter Debian 9 Stretch
Siehe
Installation unter Ubuntu
sudo aptitude install lxc apparmor docker.io sudo addgroup USER docker docker info
Speicherort für Images etc. umhängen
Mit
docker info
kann man sich anzeigen lassen, wo Docker Images u.Ä. abspeichert. In der /etc/fstab
kann man das auf einen Ordner einer anderen Partition umhängen:
/media/anderePartiton/aufsRoot /var/lib/docker/aufs none bind 0 0
Alternativ gibt man in der Datei /etc/default/docker
in den DOCKER_OPTS
den zusätzlichen Parameter -g
an. Beispiel:
DOCKER_OPTS="-g /mnt/mybigdata/dockerroot"
Erstellen eines eigenen Basis-Images
Auf Ubuntu / Debian-Basis lässt sich mit Hilfe von debootstrap und tar ein Basisimage erstellen. Siehe dazu die Docker-Anleitung.
Dazu erstellt man die Grundstruktur des neuen Systems mit debootstrap:
mkdir wheezyBaseFiles sudo debootstrap --variant=minbase wheezy wheezyBaseFiles
Anschließend wird die komplette Verzeichnisstruktur in ein tar-Archiv gepackt und über eine Linux-Pipe sofort in docker importiert:
sudo tar -C wheezyBaseFiles -c . | docker import - myuser/wheezy_base
Kleiner Test:
docker run myuser/wheezy_base cat /etc/os-release
oder die Shell starten mit
docker run -t -i myuser/wheezy_base /bin/bash
Bauen eines Images mit Dockerfile
Dazu erstellt man eine Datei namens Dockerfile
in einem (leeren) Verzeichnis mit folgendem Inhalt:
FROM wheezy_base MAINTAINER email@mailprovider.com RUN apt-get update && apt-get -y install apache2-mpm-prefork apache2 mediawiki
Dann wechselt man in das Verzeichnis mit cd
und baut das Image mit folgendem Befehl:
docker build -t IMAGENAME:IMAGETAG .
Ausführen einer Shell
Mittels der Flags -i
(für interaktiv) und -t
(für Binden von stdin und stdout ans Terminal) lässt sich auch eine interaktive Shell ausführen.
docker run -i -t wheezy_base /bin/bash
Starten eines zweiten Terminals
Braucht man eine zweite Shell für einen laufenden Container, sucht man zunächst den Containernamen
docker ps
Dann startet man die Bash das zweite Mal:
docker exec -t -i myuser/wheezy_base /bin/bash
Privates Repository
Installation und Start
Für ein privates Repository startet man - ganz docker-like - einen entsprechenden Container mit dem Image "registry":[1]
docker run -d -p 5000:5000 --restart=always --name registry -v `pwd`/data:/var/lib/registry registry:2
Konfiguration einer unsicheren privaten Registry
Für Testzwecke kann man auch von anderen Rechnern im privaten Netzwerk UNGESICHERT auf die Registry zugreifen. Dazu muss man dem Daemon das aber explizit erlauben, indem man folgende Zeile in /etc/default/docker
einfügt:
DOCKER_OPTS="--insecure-registry registryrechner:5000"
Dann muss man diesen Daemon neu starten:
sudo service docker restart
Eintragen eines Images im Registry
Zunächst muss das vorhandene Image umgetaggt werden:
docker tag user/eigenesimage registryrechner:5000/user/eigenesimage
Dann muss es hochgeschoben werden:
docker push registryrechner:5000/user/eigenesimage
Docker und Netzwerk
Einen Port des Containers kann man mit der Option -p als Port des Hosts zur Verfügung stellen:
docker run -p 4304:4304 myimage
Leider scheint es Probleme mit IPv4-Adressen des Hosts zu geben. Abhilfe schafft in kleineren Fällen die Option --net=host
. Diese sollte aber aus Sicherheitsgründen vermieden werden, weil damit von außen voller Zugriff auf alle Ports des Containers gegeben wird.
Docker und IPv6
Docker hat standardmäßig die IPv6-Unterstützung nicht eingeschaltet. Das kann man aber machen:
- https://docs.docker.com/config/daemon/ipv6/
- https://gdevillele.github.io/engine/userguide/networking/default_network/ipv6/
- https://medium.com/@skleeschulte/how-to-enable-ipv6-for-docker-containers-on-ubuntu-18-04-c68394a219a2
- https://dev.to/joeneville_/build-a-docker-ipv6-network-dfj
Docker updates
Auch Docker container müssen auf neue Versionen überwacht werden.
Monitoring container updates
Mit What's up Docker kann man sich z.B. eine Email zuschicken lassen, wenn ein Container-Image upgedatet wurde.
Troubleshooting Docker
SystemD läuft nicht
Es gibt grundsätzlich zwei Möglichkeiten, systemd-services bereitzustellen:
- SystemD installieren und viel Funktionalität zu entfernen oder
- https://github.com/gdraheim/docker-systemctl-replacement
Chrome/Chromium startet nicht
Wenn Chrome nicht startet (Fehlermeldung: Failed to move to new namespace: PID namespaces supported, Network namespace supported, but failed: errno = Operation not permitted), hilft das Argument --no-sandbox
.[2]
Einzelne Images
MySQL-Image
Siehe für ein einfaches Dockerfile für einen MySQL-Container:
Wenn MySQL nicht mit
mysqld
startet, kann es daran liegen, dass der Socket nicht erstellt werden kann. Dann:
mkdir /var/run/mysqld/ chmod a+w /var/run/mysqld/