Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
docker [19/09/2022 - 17:54] – thommie4 | docker [08/06/2025 - 10:35] (aktuell) – thommie_netzwissen.de | ||
---|---|---|---|
Zeile 9: | Zeile 9: | ||
* Docker UI: [[http:// | * Docker UI: [[http:// | ||
- | Docker Daten-Ablage verlagern | + | Docker Daten-Ablage |
+ | root@docker3:/ | ||
< | < | ||
- | root@docker3:/ | ||
{ | { | ||
- | "graph": | + | " |
+ | "data-root": | ||
} | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== Docker Build ===== | ||
+ | |||
+ | [[https:// | ||
+ | |||
+ | Der Build geht immer von einem Dockerfile aus: [[https:// | ||
+ | < | ||
+ | |||
+ | # Use official Alpine release | ||
+ | FROM alpine: | ||
+ | |||
+ | # Maintainer | ||
+ | LABEL maintainer=" | ||
+ | LABEL version=" | ||
+ | LABEL description=" | ||
+ | |||
+ | ENV RADSECVERSION 1.11.0 | ||
+ | ENV RADSECURL https:// | ||
+ | ENV RADSECFILENAME radsecproxy-${RADSECVERSION}.tar.gz | ||
+ | |||
+ | # Change working dir | ||
+ | WORKDIR /root | ||
+ | |||
+ | # Update apk | ||
+ | RUN apk update | ||
+ | |||
+ | # Install buildtools | ||
+ | RUN apk add --no-cache make g++ openssl-dev nettle-dev musl-dev | ||
+ | |||
+ | # Create output dir | ||
+ | RUN mkdir output | ||
+ | |||
+ | # Download radsecproxy source files | ||
+ | RUN wget ${RADSECURL}${RADSECFILENAME} | ||
+ | |||
+ | # Untar radsecproxy | ||
+ | RUN tar xf ${RADSECFILENAME} --strip-components=1 | ||
+ | |||
+ | # Configure | ||
+ | RUN ./configure --prefix=/ | ||
+ | |||
+ | # Make and install to output dir | ||
+ | RUN make && make install | ||
+ | |||
+ | # Create radsecproxy container | ||
+ | FROM alpine: | ||
+ | |||
+ | # Update apk | ||
+ | RUN apk update | ||
+ | |||
+ | # Install openssl, ca-certificates, | ||
+ | RUN apk add --no-cache openssl ca-certificates bash nettle tini | ||
+ | |||
+ | # Copy from ' | ||
+ | COPY --from=build / | ||
+ | # COPY --from=build / | ||
+ | |||
+ | # create config directory and add certs | ||
+ | RUN mkdir / | ||
+ | COPY radsecproxy/ | ||
+ | COPY certs/ | ||
+ | |||
+ | # Copy start.sh | ||
+ | COPY start.sh / | ||
+ | |||
+ | # Make start.sh executeable | ||
+ | RUN chmod u+x / | ||
+ | |||
+ | # Create Radsecproxy logging | ||
+ | RUN mkdir / | ||
+ | |||
+ | # Export volumes | ||
+ | VOLUME / | ||
+ | |||
+ | # Make Radsecproxy' | ||
+ | EXPOSE 2083 | ||
+ | |||
+ | # Set Tini entrypoint | ||
+ | # https:// | ||
+ | ENTRYPOINT ["/ | ||
+ | |||
+ | # Start Radsecproxy | ||
+ | CMD ["/ | ||
+ | |||
+ | </ | ||
+ | |||
+ | Dockerfile Syntax check | ||
+ | |||
+ | < | ||
+ | docker build --check . | ||
+ | |||
+ | </ | ||
+ | |||
+ | Der Build wird normalerweise gecacht, das kann man abschalten: | ||
+ | |||
+ | < | ||
+ | docker --no-cache build . | ||
+ | |||
+ | </ | ||
+ | |||
+ | Docker build ohne cache, aber mit tag: | ||
+ | |||
+ | < | ||
+ | docker build --no-cache -t thommie/ | ||
+ | |||
+ | </ | ||
+ | |||
+ | Danach kann man das image in einen Registry schieben, z.B. die Docker Registry. | ||
+ | |||
+ | < | ||
+ | docker login | ||
+ | |||
+ | </ | ||
+ | |||
+ | Neu: mit Versionsnummer taggen | ||
+ | |||
+ | < | ||
+ | docker tag thommie/ | ||
+ | |||
+ | </ | ||
+ | |||
+ | Und dann hochladen: | ||
+ | |||
+ | < | ||
+ | thommie@odysseus4: | ||
+ | fef40b964b90: | ||
+ | a0cb24bdb2c8: | ||
+ | a105c78eaead: | ||
+ | b10598bffc84: | ||
+ | 5e1cdb76f1d7: | ||
+ | c903625bb716: | ||
+ | 8b191fa4fbcc: | ||
+ | 4b606c4525db: | ||
+ | 7e4e46af816c: | ||
+ | b895814e9e64: | ||
+ | v1: digest: sha256: | ||
+ | |||
+ | </ | ||
+ | |||
+ | < | ||
+ | thommie@odysseus3: | ||
+ | Sending build context to Docker daemon | ||
+ | Step 1/3 : FROM freeradius/ | ||
+ | | ||
+ | Step 2/3 : COPY raddb/ /etc/raddb/ | ||
+ | | ||
+ | Step 3/3 : EXPOSE 1812-1813/ | ||
+ | | ||
+ | Removing intermediate container 6d5f572b0a8b | ||
+ | | ||
+ | Successfully built c6c0d41f944a | ||
+ | |||
</ | </ | ||
Zeile 37: | Zeile 192: | ||
discourse/ | discourse/ | ||
xbrowsersync/ | xbrowsersync/ | ||
+ | |||
</ | </ | ||
Zeile 43: | Zeile 199: | ||
< | < | ||
docker image rm [id] | docker image rm [id] | ||
+ | |||
</ | </ | ||
- | Image Repo aufräumen und ungenutzte Images löschen | + | Image Repo aufräumen und ungenutzte Images löschen |
< | < | ||
docker image prune [OPTIONS] | docker image prune [OPTIONS] | ||
+ | |||
</ | </ | ||
Zeile 55: | Zeile 213: | ||
< | < | ||
docker image prune -a | docker image prune -a | ||
- | </ | ||
- | ==== Container Management ==== | ||
- | |||
- | Alle Container auf einmal stoppen | ||
- | |||
- | < | ||
- | docker kill $(docker ps -q) | ||
- | docker rm $(docker ps -a -q) | ||
- | docker rmi $(docker images -q) | ||
</ | </ | ||
- | Container aus heruntergeladenem Image erzeugen | + | ==== Container aus heruntergeladenem Image erzeugen |
'' | '' | ||
+ | |||
+ | < | ||
+ | docker run --name radiusclient -p 1812-1813: | ||
+ | |||
+ | </ | ||
Alle laufenden und gestoppten Container zeigen: | Alle laufenden und gestoppten Container zeigen: | ||
Zeile 83: | Zeile 237: | ||
7c3cd1abf744 | 7c3cd1abf744 | ||
05f7f43d0493 | 05f7f43d0493 | ||
+ | |||
</ | </ | ||
Zeile 95: | Zeile 250: | ||
b39916cf84e2 | b39916cf84e2 | ||
e6e7c809ad34 | e6e7c809ad34 | ||
+ | |||
</ | </ | ||
Zeile 105: | Zeile 261: | ||
< | < | ||
docker stop $ (docker ps -a -q) docker rm $(docker ps -a -q) | docker stop $ (docker ps -a -q) docker rm $(docker ps -a -q) | ||
+ | |||
</ | </ | ||
Zeile 112: | Zeile 269: | ||
root@develd: | root@develd: | ||
e6e7c809ad34 | e6e7c809ad34 | ||
+ | |||
</ | </ | ||
Zeile 118: | Zeile 276: | ||
< | < | ||
docker container prune | docker container prune | ||
+ | |||
</ | </ | ||
Restart policy ändern | Restart policy ändern | ||
- | < | + | < |
+ | docker update --restart=no matrix_synapse_1 | ||
</ | </ | ||
+ | ==== Container Management ==== | ||
+ | |||
+ | Alle Container auf einmal stoppen | ||
+ | |||
+ | < | ||
+ | docker kill $(docker ps -q) | ||
+ | docker rm $(docker ps -a -q) | ||
+ | docker rmi $(docker images -q) | ||
+ | |||
+ | </ | ||
==== Einen Container betreten ==== | ==== Einen Container betreten ==== | ||
- | < | + | < |
+ | docker exec -t -i container_ID /bin/bash | ||
</ | </ | ||
Alternativ: stdin/out an den Container hängen: | Alternativ: stdin/out an den Container hängen: | ||
- | < | + | < |
+ | docker attach [OPTIONS] CONTAINER | ||
</ | </ | ||
Achtung: wieder raus mit **CTRL-p CTRL-q. **Details siehe [[https:// | Achtung: wieder raus mit **CTRL-p CTRL-q. **Details siehe [[https:// | ||
- | ===== Docker Compose | + | ===== Image Management ===== |
+ | |||
+ | Image wegsichern | ||
+ | < | ||
+ | |||
+ | docker save -o mariadb: | ||
+ | |||
+ | </ | ||
+ | |||
+ | Das image kann man dann woanders hin transferieren (scp) und mit docker load dort neu bereitstellen. Ein schon vorhandenes Image mit gleichem Namen wird umbenannt: | ||
+ | |||
+ | < | ||
+ | root@docker3a:/ | ||
+ | 270a1170e7e3: | ||
+ | 6d035e66c4fd: | ||
+ | 1a966a87cda4: | ||
+ | 76a062be1274: | ||
+ | 4cc02cc5cc3f: | ||
+ | d714cd160054: | ||
+ | 56f8438cbcbd: | ||
+ | 03543ca2a586: | ||
+ | The image mariadb: | ||
+ | Loaded image: mariadb: | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== Docker Compose ===== | ||
- | Docker Compose erzeugt Docker Applikationen, | + | Docker Compose erzeugt Docker Applikationen, |
- Das Dockerfile definiert die Laufzeit-Umgebung | - Das Dockerfile definiert die Laufzeit-Umgebung | ||
Zeile 146: | Zeile 347: | ||
- " | - " | ||
- | Achtung: Die python basierten Docker Versionen (V1) in den Distro-Repos sind meist veraltet. Es empfiehlt sich, die V2 aus https:// | + | Achtung: Die python basierten Docker Versionen (V1) in manchen |
- | Installation siehe https:// | + | < |
- | + | ||
- | Um docker-compose files im Format V1 auszuführen, | + | |
+ | compose yaml validieren | ||
< | < | ||
- | root@docker2:/ | ||
- | % Total % Received % Xferd Average Speed | ||
- | | ||
- | 100 1410 100 1410 0 | ||
- | % Total % Received % Xferd Average Speed | ||
- | | ||
- | 0 | ||
- | 100 2884k 100 2884k 0 | ||
- | / | ||
- | Configuring docker-compose alternatives | ||
- | update-alternatives: | ||
- | update-alternatives: | ||
- | ' | ||
- | use ' | ||
- | </ | ||
- | Test | + | docker compose -f docker-compose-pro.yaml config |
- | < | ||
- | root@docker2:/ | ||
- | docker-compose - automatischer Modus | ||
- | beste Version des Links ist / | ||
- | Link verweist zur Zeit auf / | ||
- | Link docker-compose ist / | ||
- | / | ||
- | / | ||
</ | </ | ||
- | Update per docker-compose | + | ==== Update per docker compose |
Update der Images, die im compose file referenziert sind | Update der Images, die im compose file referenziert sind | ||
< | < | ||
- | docker-compose pull | + | docker compose -f docker-compose-pro.yaml |
</ | </ | ||
- | Daraus die Container neu bauen und startenb | + | Daraus die Container neu bauen und starten |
< | < | ||
- | docker-compose up --build | + | docker compose -f docker-compose-pro.yaml |
</ | </ | ||
+ | |||
+ | Bauen **ohne** | ||
< | < | ||
- | docker-compose up --force-recreate --build | + | docker compose -f docker-compose-pro.yaml |
</ | </ | ||
+ | |||
+ | Docker Compose startet Container nicht daemonisiert. Dafür -d hinzufügen: | ||
+ | |||
+ | < | ||
+ | docker compose up --force-recreate --build -d | ||
+ | |||
+ | </ | ||
+ | |||
+ | Um Container als Daemon zu starten, nimmt man systemd. | ||
===== Docker Netzwerke ===== | ===== Docker Netzwerke ===== | ||
- | Standardmässig werden drei Netze angelegt: | + | Standardmässig werden drei Netze bridge, host, none angelegt. Alle anderen sind custom Networks, die z.B. über compose angelegt wurden: |
< | < | ||
- | root@nas:~# docker network ls NETWORK ID NAME DRIVER SCOPE c14b1455af82 | + | root@docker1:~# docker network ls |
+ | NETWORK ID | ||
+ | 54e670dd998d | ||
+ | 5b1cd745d5a3 | ||
+ | b56f108784b3 | ||
+ | f3619965eb7b | ||
+ | c91196bf89eb | ||
+ | b4f69adafbb3 | ||
</ | </ | ||
- | Container werden an die bridge | + | Container werden an die bridge |
- | Mit | + | Dies zeigt den Zustand eines Docker networks |
< | < | ||
docker network inspect bridge | docker network inspect bridge | ||
+ | |||
</ | </ | ||
- | sieht man den Zustand der Docker Bridge | + | ==== Docker |
- | + | ||
- | ==== Custom networks ==== | + | |
docker network create erzeugt ein eigenes Netzwerk: | docker network create erzeugt ein eigenes Netzwerk: | ||
- | '' | + | < |
+ | docker network create –subnet 192.168.82.0/ | ||
- | '' | + | </ |
+ | |||
+ | Danach anschauen | ||
+ | |||
+ | < | ||
+ | locutus:/ | ||
+ | |||
+ | </ | ||
Mit | Mit | ||
- | docker attach container1'' | + | < |
+ | docker attach container1 | ||
- | sieht man das Netzwerk von innen | + | </ |
- | ===== Docker logs ===== | + | sieht man das Netzwerk aus Sicht des Containers |
- | Analog zu tail -f: | + | ===== ===== |
+ | ===== Docker volumes ===== | ||
+ | |||
+ | Volumes sind Verzeichnisse/ | ||
+ | |||
+ | Doku: [[https:// | ||
+ | |||
+ | In compose: | ||
< | < | ||
- | docker logs --follow | + | |
+ | services: | ||
+ | frontend: | ||
+ | image: node:lts | ||
+ | volumes: | ||
+ | | ||
+ | volumes: | ||
+ | myapp: | ||
+ | external: true | ||
</ | </ | ||
- | ===== Docker volumes ===== | + | Allgemeine Syntax: **[lokales volume Verzeichnis Host]: |
- | [[https:// | + | Die Verzeichnisorte werden immer relativ zum Ort des compose file gesehen! |
+ | ====== Portainer ====== | ||
- | ===== Kubernetes ===== | + | < |
+ | docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart=always -v / | ||
- | * Auf Ubuntu: [[http:// | + | </code> |
- | * Offizielle Tutorials: [[https:// | + | |
- | * weitere: [[https:// | + | |
- | ==== Begrifflichkeiten | + | ====== Logging ====== |
- | * Master = koordiniert den Cluster über die Kubernetes API - auf dem Master laufen keine Pods | + | Docker logs direkt lesen, analog |
- | * Node = Maschine, auf der Cluster (Pod) laufen (kann eine oder mehrere phys. Maschine oder VMs sein) | + | |
- | * Pod = einer oder mehrere Container, die gemeinsam Ressourcen nutzen (z.B. gemeinsamer Speicherplatz, | + | |
- | * Service: Funktion, die von einem oder mehreren Pods bereitgestellt wird | + | |
- | ==== Minikube | + | < |
+ | docker logs --follow [containerid] | ||
- | Minikube is a tool that makes it easy to run Kubernetes locally. Minikube runs a single-node Kubernetes cluster inside a VM on your laptop for users looking to try out Kubernetes or develop with it day-to-day. | + | </ |
- | [[https:// | + | Umleiten der log Ausgabe nach journald mit setting in der daemon.json |
- | '' | + | < |
+ | { | ||
+ | " | ||
+ | "log-driver" | ||
+ | } | ||
- | **Linux CI Installation Which Supports Running in a VM (example w/ kubectl installation)** | + | </code> |
- | '' | + | < |
+ | journalctl | ||
- | dann | + | </ |
- | '' | + | ====== Docker commit |
- | und | + | Auf der Quellmaschine wir der Container in ein image commited. Während des Commits wird der Container pausiert. |
- | '' | + | < |
+ | '' | ||
+ | |||
+ | </code> | ||
+ | |||
+ | Danach packt man das image in einen tarball | ||
+ | |||
+ | < | ||
+ | '' | ||
+ | |||
+ | </code> | ||
+ | |||
+ | Der Container wird auf die neue Maschien transferiert und dort ausgepackt. | ||
+ | |||
+ | < | ||
+ | '' | ||
+ | |||
+ | </ | ||
+ | |||
+ | Danach baut man aus dem transferierten Image einen neuen Container. | ||
+ | |||
+ | < | ||
+ | '' | ||
+ | |||
+ | </ | ||
- | Minikube mit node.js hello world applikation: | + | **Achtung: volumes und Netzwerke werden nicht transferiert!** |
- | [[https:// | ||