Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung |
docker [19/09/2022 - 17:54] – thommie4 | docker [05/03/2024 - 10:52] (aktuell) – Externe Bearbeitung 127.0.0.1 |
---|
* 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 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 verlagern | Docker Daten-Ablage auf btrfs Partition verlagern |
| |
<code> | <code> |
| |
{ | { |
"graph": "/mnt/data/docker" | "storage-driver": "btrfs", |
| "data-root": "/mnt/data/docker" |
} | } |
</code> | </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/]] | 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 V2===== | ===== Docker Compose ===== |
| |
Docker Compose erzeugt Docker Applikationen, die aus mehreren Containern bestehen. docker-compose up startet alles im Verbund. | Docker Compose erzeugt Docker Applikationen, die aus mehreren Containern bestehen. docker compose up startet alles im Verbund. |
| |
- Das Dockerfile definiert die Laufzeit-Umgebung | - Das Dockerfile definiert die Laufzeit-Umgebung |
- "docker compose up" erzeugt und startet die gesamte Applikation | - "docker compose up" erzeugt und startet die gesamte Applikation |
| |
Achtung: Die python basierten Docker Versionen (V1) in den Distro-Repos sind meist veraltet. Es empfiehlt sich, die V2 aus https://github.com/docker/compose zu benutzen, die in GOLANG neu geschrieben wurde. | Achtung: Die python basierten Docker Versionen (V1) in manchen Distro-Repos sind veraltet. Es empfiehlt sich, die V2 aus https://github.com/docker/compose zu benutzen, die in GOLANG neu geschrieben wurde. Installation siehe https://github.com/docker/compose/ |
| |
Installation siehe https://github.com/docker/compose/ | <badge>Hinweis: Für Raspis wird das Binary für ...-linux-armv7 benutzt (ARM Architektur)</badge> |
| |
Um docker-compose files im Format V1 auszuführen, gibt es "compose switch": https://github.com/docker/compose-switch. Dafür muss das golang binary in /usr/local/lib/docker/cli-plugins/docker-compose vorhanden sein. composer switch bindet composer V2 so ein, dass man mit update-alternatives zwischen V1 (python) und V2 (golang) wechseln kann. | Um docker-compose files im Format V1 auszuführen, gibt es "compose switch": https://github.com/docker/compose-switch. Dafür muss das golang binary in /usr/local/lib/docker/cli-plugins/docker-compose vorhanden sein. composer switch bindet composer V2 so ein, dass man mit update-alternatives zwischen V1 (python) und V2 (golang) wechseln kann. |
</code> | </code> |
| |
Update per docker-compose | ===== 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 | Update der Images, die im compose file referenziert sind |
| |
<code> | <code> |
docker-compose pull | docker compose -f docker-compose-pro.yaml pull |
</code> | </code> |
| |
| |
<code> | <code> |
docker-compose up --build | docker compose -f docker-compose-pro.yaml up --build |
</code> | </code> |
| <code> |
| docker compose -f docker-compose-pro.yaml up --force-recreate --build -d |
| |
| </code> |
| |
| Docker Compose startet die Container, aber nicht daemonisiert. Dazu -d hinzufügen: |
| |
<code> | <code> |
docker-compose up --force-recreate --build -d | docker compose up -d |
</code> | </code> |
| |
| Üblicherweise nimmt man dafür 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: |
| |
<code> | <code>root@docker1:~# docker network ls |
root@nas:~# docker network ls NETWORK ID NAME DRIVER SCOPE c14b1455af82 bridge bridge local d80bf7ff4673 host host local 269bb4261727 none null local cd1ba9150e2f ownclouddockerserver_default bridge local | 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> | </code> |
| |
Container werden an die bridge (entspricht docker0 auf dem Host) gebunden, solange nicht beim docker create ein anderes Netzwerk gewählt wurde (''docker create –network=<NETWORK>'') | 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 |
| |
Mit | |
| |
<code> | <code> |
</code> | </code> |
| |
sieht man den Zustand der Docker Bridge | sieht man den Zustand eines Docker networks |
| |
==== Custom networks ==== | ==== Custom networks ==== |
docker network create erzeugt ein eigenes Netzwerk: | docker network create erzeugt ein eigenes Netzwerk: |
| |
''docker network create –subnet 192.168.82.0/24 –driver bridge bridge2'' | <code> |
| docker network create –subnet 192.168.82.0/24 –driver bridge bridge2 |
| </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> |
| 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 | Mit |
| |
docker attach container1'' '' | <code> |
| docker attach container1 |
| </code> |
| |
sieht man das Netzwerk von innen | sieht man das Netzwerk von innen |
| |
<code> | <code> |
docker logs --follow | docker logs --follow [containerid] |
</code> | </code> |
| |
| |
===== Docker volumes ===== | ===== Docker volumes ===== |
| |
[[https://docs.docker.com/engine/admin/volumes/volumes/|https://docs.docker.com/engine/admin/volumes/volumes/]] | Volumes sind Verzeichnisse/Dtane, die vom lokalen Docker Host in den Container gemappt werden. |
| Volumes werden vom Docker Dämon gemanagt, die Daten liegen innerhalb des vom Docker Dämon verwalteten Speicherbereichs. |
| |
| Doku: https://docs.docker.com/engine/admin/volumes/ |
| |
===== Kubernetes ===== | In compose: |
| <code> |
| services: |
| frontend: |
| image: node:lts |
| volumes: |
| - myapp:/home/node/app |
| volumes: |
| myapp: |
| external: true |
| </code> |
| |
| Syntax: **[lokales volume Verzeichnis Host]:[Verzeichnis im Container]** |
| |
| Immer relativ zum compose file gesehen! |
| ===== Docker build ===== |
| |
| <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> |
| |
* Auf Ubuntu: [[http://thedevopsblog.com/containers/kubernetes-1-4-setup-in-ubuntu-16-04/|http://thedevopsblog.com/containers/kubernetes-1-4-setup-in-ubuntu-16-04/]] | |
* Offizielle Tutorials: [[https://kubernetes.io/docs/tutorials/kubernetes-basics/|https://kubernetes.io/docs/tutorials/kubernetes-basics/]] | |
* weitere: [[https://marc.wäckerlin.ch/computer/kubernetes-on-ubuntu-16-04#Cleanup_In_Case_of_Unsolvable_Problems|https://marc.wäckerlin.ch/computer/kubernetes-on-ubuntu-16-04]] | |
| |
==== Begrifflichkeiten ==== | ==== Begrifflichkeiten ==== |
* Service: Funktion, die von einem oder mehreren Pods bereitgestellt wird | * Service: Funktion, die von einem oder mehreren Pods bereitgestellt wird |
| |
==== Minikube - zum Üben ==== | |
| |
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. | ===== Portainer ===== |
| |
[[https://github.com/kubernetes/minikube|https://github.com/kubernetes/minikube]] | |
| |
''curl -Lo minikube [[https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64|https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64]] chmod +x minikube mv minikube /usr/local/bin/ '' | |
| |
**Linux CI Installation Which Supports Running in a VM (example w/ kubectl installation)** | |
| |
''curl -Lo minikube [[https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64|https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64]] chmod +x minikube '' | |
| |
dann | |
| |
''curl -Lo kubectl [[https://storage.googleapis.com/kubernetes-release/release/|https://storage.googleapis.com/kubernetes-release/release/]] $( curl -s [[https://storage.googleapis.com/kubernetes-release/release/stable.txt|https://storage.googleapis.com/kubernetes-release/release/stable.txt]] ) /bin/linux/amd64/kubectl chmod +x kubectl '' | |
| |
und | |
| |
''export MINIKUBE_WANTUPDATENOTIFICATION=false export MINIKUBE_WANTREPORTERRORPROMPT=false export MINIKUBE_HOME= $HOME export CHANGE_MINIKUBE_NONE_USER=true mkdir $HOME /.kube || true touch $HOME /.kube/config export KUBECONFIG= $HOME /.kube/config sudo -E ./minikube start –vm-driver=none # this for loop waits until kubectl can access the api server that minikube has created for i in {1..150} # timeout for 5 minutes do ./kubectl get po &> /dev/null if [ $? -ne 1 ] ; then break fi sleep 2 done '' | |
| |
Minikube mit node.js hello world applikation: | |
| |
[[https://kubernetes.io/docs/tutorials/stateless-application/hello-minikube/|https://kubernetes.io/docs/tutorials/stateless-application/hello-minikube/]] | |
| |
| <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> |