Diese Seite ist nicht editierbar. Sie können den Quelltext sehen, jedoch nicht verändern. Kontaktieren Sie den Administrator, wenn Sie glauben, dass hier ein Fehler vorliegt. ====== Docker ====== Doku: [[https://docs.docker.com/|https://docs.docker.com/]] ===== Basisinstallation ===== * [[https://docs.docker.com/engine/installation/linux/suse/|https]][[https://docs.docker.com/engine/installation/linux/suse/|://docs.docker.com/engine/installation/linux/suse/]] * Installation auf Ubuntu[[https://docs.docker.com/engine/installation/linux/ubuntulinux/|https]][[https://docs.docker.com/engine/installation/linux/ubuntulinux/|://docs.docker.com/engine/installation/linux/ubuntulinux/]] * Docker UI: [[http://linoxide.com/linux-how-to/setup-dockerui-web-interface-docker/|http://linoxide.com/linux-how-to/setup-dockerui-web-interface-docker/]] Docker Daten-Ablage auf btrfs Partition verlagern root@docker3:/etc/docker/daemon.json <code> { "storage-driver": "btrfs", "data-root": "/mnt/data/docker" } </code> ===== Docker Build ===== [[https://stackify.com/docker-build-a-beginners-guide-to-building-docker-images/|https://stackify.com/docker-build-a-beginners-guide-to-building-docker-images/]] Der Build geht immer von einem Dockerfile aus: [[https://docs.docker.com/reference/dockerfile/|https://docs.docker.com/reference/dockerfile/]] und erzeugt ein Image <code> # Use official Alpine release FROM alpine:3.19.3 as build # Maintainer LABEL maintainer="Thomas Rother <thomas.rother@devoteam.com>" LABEL version="1.2" LABEL description="radsec proxy server for remote RADIUS operation with TLS security" ENV RADSECVERSION 1.11.0 ENV RADSECURL https://github.com/radsecproxy/radsecproxy/releases/download/${RADSECVERSION}/ 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=/root/output --sysconfdir=/etc # Make and install to output dir RUN make && make install # Create radsecproxy container FROM alpine:3.19.3 # Update apk RUN apk update # Install openssl, ca-certificates, nettle and tini RUN apk add --no-cache openssl ca-certificates bash nettle tini # Copy from 'build' stage COPY --from=build /root/output/ / # COPY --from=build /root/radsecproxy.conf-example /etc/radsecproxy/radsecproxy.conf # create config directory and add certs RUN mkdir /etc/radsecproxy/ COPY radsecproxy/ /etc/radsecproxy/ COPY certs/ /etc/radsecproxy/ # Copy start.sh COPY start.sh /root/start.sh # Make start.sh executeable RUN chmod u+x /root/start.sh # Create Radsecproxy logging RUN mkdir /var/log/radsecproxy # Export volumes VOLUME /var/log/radsecproxy # Make Radsecproxy's ports available EXPOSE 2083 # Set Tini entrypoint # https://computingpost.medium.com/how-to-use-tini-init-system-in-docker-containers-69283d0099ed ENTRYPOINT ["/sbin/tini", "--"] # Start Radsecproxy CMD ["/root/start.sh"] </code> Dockerfle Syntax check <code> docker build --check . </code> Der Build wird normalerweise gecacht, das kann man abschalten: <code> docker --no-cache build . </code> Docker build ohne cache, aber mit tag: <code> docker build --no-cache -t thommie/freeradius01:v1 . </code> Danach kann man das image in einen Registry schieben, z.B. die Docker Registry. <code> docker login </code> Neu mit Versionsnummer taggen <code> docker tag thommie/radsecproxymb psammechinus/radsecproxymb:v1 </code> Und dann hochladen: <code> thommie@odysseus4:~/Dokumente/docker/radsecproxy> docker push psammechinus/radsecproxymb:v1The push refers to repository [docker.io/psammechinus/radsecproxymb] fef40b964b90: Pushed a0cb24bdb2c8: Pushed a105c78eaead: Pushed b10598bffc84: Pushed 5e1cdb76f1d7: Pushed c903625bb716: Pushed 8b191fa4fbcc: Pushed 4b606c4525db: Pushed 7e4e46af816c: Pushed b895814e9e64: Pushed v1: digest: sha256:64c0f5a9498a66bb5714efbda60263fd42886d3420b51ec89e3a0b56df08bba3 size: 2404 </code> <code> thommie@odysseus3:~/git/gitea/dockerbuilds/myradius> docker build -f myradius.docker . Sending build context to Docker daemon 5.632kB Step 1/3 : FROM freeradius/freeradius-server:latest ---> 0a093ead10b6 Step 2/3 : COPY raddb/ /etc/raddb/ ---> 096f00c66db0 Step 3/3 : EXPOSE 1812-1813/udp ---> Running in 6d5f572b0a8b Removing intermediate container 6d5f572b0a8b ---> c6c0d41f944a Successfully built c6c0d41f944a </code> ==== Images ==== Images aus Repository runterladen ''docker pull '' Alle Images im lokalen repository zeigen <code> root@develd:~# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE local_discourse/web_only latest 21e8a905ef5c 4 weeks ago 2.65GB grundic/jamulus latest 9e97d3890ca8 5 weeks ago 90.3MB discourse/base 2.0.20210217-2235 7027ba787aa6 2 months ago 2.22GB discourse/base 2.0.20201221-2020 c0704d4ce2b4 4 months ago 2.11GB local_discourse/data latest c7524a566464 5 months ago 2.44GB discourse/base 2.0.20201004-2310 b64c37d7ab06 6 months ago 2.4GB xbrowsersync/api latest a3554c99cc99 12 months ago 119MB </code> Image löschen <code> docker image rm [id] </code> Image Repo aufräumen und ungenutzte Images löschen <code> docker image prune [OPTIONS] </code> z.B: alle images löschen, die nicht von mindestens einem Container genutzt werden <code> docker image prune -a </code> ==== Container aus heruntergeladenem Image erzeugen ==== ''docker create'' erzeugt den Container und startet ihn **nicht,** ''docker run'' macht beides. <file> docker run --name radiusclient -p 1812-1813:1812-1813/udp -d radsecclient:v1 </file> Alle laufenden und gestoppten Container zeigen: ''docker ps -a '' Filtern auf laufende Container <code> root@develd:~# docker ps -a -f status=running CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 31f9a6ffcab8 grundic/jamulus "Jamulus" 19 hours ago Up 19 hours jolly_beaver 7c3cd1abf744 local_discourse/web_only "/sbin/boot" 4 weeks ago Up 5 days 127.0.0.1:84->80/tcp web_only 05f7f43d0493 local_discourse/data "/sbin/boot" 5 months ago Up 5 days data </code> Laufende und gestoppte, aber nur die container id ausgeben ''docker ps -aq '' Container zeigen, die nicht laufen <code> root@develd:~# docker ps -aq -f status=exited b39916cf84e2 e6e7c809ad34 </code> Container starten/stoppen ''docker start [ID] docker stop [ID] '' **Alle** Container stoppen oder löschen <code> docker stop $ (docker ps -a -q) docker rm $(docker ps -a -q) </code> Diese können mit docker rm gelöscht werden <code> root@develd:~# docker rm e6e7c809ad34 e6e7c809ad34 </code> Alle Container löschen, die nicht laufen <code> docker container prune </code> Restart policy ändern <code> docker update --restart=no matrix_synapse_1 </code> ==== Container Management ==== Alle Container auf einmal stoppen <code> docker kill $(docker ps -q) docker rm $(docker ps -a -q) docker rmi $(docker images -q) </code> ==== Einen Container betreten ==== <code> docker exec -t -i container_ID /bin/bash </code> Alternativ: stdin/out an den Container hängen: <code> docker attach [OPTIONS] CONTAINER </code> Achtung: wieder raus mit **CTRL-p CTRL-q. **Details siehe [[https://docs.docker.com/engine/reference/commandline/attach/|https://docs.docker.com/engine/reference/commandline/attach/]] ===== Docker Compose ===== Docker Compose erzeugt Docker Applikationen, die aus mehreren Containern bestehen. docker compose up startet alles im Verbund. - Das Dockerfile definiert die Laufzeit-Umgebung - docker-compose.yml beschreibt die Services, die in Containern zusammen arbeiten - "docker compose up" erzeugt und startet die gesamte Applikation Achtung: Die python basierten Docker Versionen (V1) in manchen Distro-Repos sind veraltet. Es empfiehlt sich, die V2 aus [[https://github.com/docker/compose|https://github.com/docker/compose]] zu benutzen, die in GOLANG neu geschrieben wurde. Installation siehe [[https://github.com/docker/compose/|https://github.com/docker/compose/]] <badge>Hinweis: Für Raspis wird das Binary für …-linux-armv7 benutzt (ARM Architektur)</badge> compose yaml validieren <code> docker compose -f docker-compose-pro.yaml config </code> ==== Update per docker compose ==== Update der Images, die im compose file referenziert sind <code> docker compose -f docker-compose-pro.yaml pull </code> Daraus die Container neu bauen und starten <code> docker compose -f docker-compose-pro.yaml up --build </code> Bauen **ohne** caching und dann starten <code> docker compose -f docker-compose-pro.yaml up --force-recreate --build </code> Docker Compose startet Container nicht daemonisiert. Dafür -d hinzufügen: <code> docker compose up --force-recreate --build -d </code> Um Container als Daemon zu starten, nimmt man systemd. ===== Docker Netzwerke ===== Standardmässig werden drei Netze bridge, host, none angelegt. Alle anderen sind custom Networks, die z.B. über compose angelegt wurden: <code> root@docker1:~# docker network ls NETWORK ID NAME DRIVER SCOPE 54e670dd998d bridge bridge local 5b1cd745d5a3 docker_back bridge local b56f108784b3 docker_dbnet bridge local f3619965eb7b docker_front bridge local c91196bf89eb host host local b4f69adafbb3 none null local </code> Container werden an die bridge "docker0" auf dem Host gebunden, solange nicht beim docker create ein anderes Netzwerk gewählt wurde (''docker create –network=<NETWORK>''). Mit Dies zeigt den Zustand eines Docker networks <code> docker network inspect bridge </code> ==== Docker Custom networks ==== docker network create erzeugt ein eigenes Netzwerk: <code> docker network create –subnet 192.168.82.0/24 –driver bridge bridge2 </code> Danach anschauen <code> locutus:/home/thommie # docker network inspect bridge2 [ { "Name": "bridge2", "Id": "9c353bcf0c2c6ccee0b821e1ff4d1740a074bdea94e93959c522d46a4e6fde8e", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "192.168.82.0/24" } ] }, "Internal": false, "Containers": {}, "Options": {}, "Labels": {} } ] </code> Mit <code> docker attach container1 </code> sieht man das Netzwerk aus Sicht des Containers ===== ===== ===== Docker volumes ===== Volumes sind Verzeichnisse/Dateien, die vom lokalen Docker Host in den Container gemappt werden. Volumes werden vom Docker Dämon gemanagt, Daten liegen innerhalb des vom Docker Dämon verwalteten Speicherbereichs. Doku: [[https://docs.docker.com/engine/admin/volumes/|https://docs.docker.com/engine/admin/volumes/]] In compose: <code> services: frontend: image: node:lts volumes: - myapp:/home/node/app volumes: myapp: external: true </code> Allgemeine Syntax: **[lokales volume Verzeichnis Host]:[Verzeichnis im Container]** Die Verzeichnisorte werden immer relativ zum Ort des compose file gesehen! ====== Portainer ====== <code> docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest </code> ====== Logging ====== Docker logs direkt lesen, analog zu tail -f: <code> docker logs --follow [containerid] </code> Umleiten der log Ausgabe nach journald mit setting in der daemon.json <code> { "data-root": "/mnt/data/docker", "log-driver": "journald" } </code> <code> journalctl -f -b CONTAINER_NAME=radiusclient </code> ====== Docker commit - Container auf neue Maschine migrieren ====== Auf der Quellmaschine wir der Container in ein image commited. Während des Commits wird der Container pausiert. <code> '' docker commit [CONTAINER_ID_OR_NAME] [new_image_name]'' </code> Danach packt man das image in einen tarball <code> '' docker save -o [path_to_save]/[image_name].tar [image_name]'' </code> Der Container wird auf die neue Maschien transferiert und dort ausgepackt. <code> '' docker load -i /path/to/[image_name].tar'' </code> Danach baut man aus dem transferierten Image einen neuen Container. <code> '' docker run -d [other_options] [image_name]'' </code> **Achtung: volumes und Netzwerke werden nicht transferiert!** CKG Edit docker.txt Zuletzt geändert: 18/04/2025 - 13:23von admin