Docker
Wird vielfach eingesetzt und ist ein fantastisches Tool.
Hier eine Auflistung der Sachen die ich oft genug gesucht habe.
Images
Mit einem passenden Dockerfile kann man sich ein Image bauen und mit einen Tag -t
benennen.
Um ein Image auf das Nötigste zu reduzieren kann eine .dockerignore
Datei genutzt werden.
docker build -t myimage .
Der Parameter -f
kann genutzt werden wenn das Dockerfile einen anderen Namen hat.
docker build -f Dockerfile.test .
Wenn man regelmäßig Images nutzt oder diese baut sammelt sich einiges an.
Darum ist es gut wenn man regelmäßig aufräumt und löscht.
docker images # list images
docker images m* # list images which starts with 'm'
docker images -q # list only image ids
docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
docker image inspect <image_name> # inspect image
docker rmi <image_name> # remove image
docker rmi $(docker images -q) # delete all images
docker rmi $(docker images -q -f dangling=true) # delete all 'untagged/dangling' images
Container
Die Docker Images laufen in Containern, diese startet, stoppt und entfernt man meist noch regelmäßiger als die Images zu bauen.
docker run <image_name>
docker run -it -d <image_name> /bin/bash
docker run -d -p 80:80 <image_name>
docker run <options> <image> <process>
Ein Befehl oder Kommando in einem laufenden Container ausführen.
docker exec -it <container_id_or_name> echo "Hello from container!"
docker exec -it <container_id_or_name> /bin/bash
Eine Datei aus einen Container kopieren.
docker cp <container_id>:/path/in/container /path/local
Die laufenden Container kann man sich, wie sicherlich bekannt, anzeigen lassen.
docker ps # list running processes
docker ps -q # list only container ids
Laufenden Container können gestoppt und gekillt werden.
docker kill $(docker ps -q)
docker stop $(docker ps -q)
Gestoppte Container können entfernt werden.
docker rm $(docker ps -a -q)
docker rm $(docker ps -a -q -f status=exited)
docker rm $(docker ps -qa --no-trunc --filter "status=exited")
Volumes
Ein Container hat ein eigenes Dateisysytem, zusätzlich kann man Verzeichnisse hinzufügen.
Daten können so ausserhalb des Containers gespeichert werden und bleiben bestehen.
Das Host- und Container-Verzeichnis wird mit einem Doppelpunkt getrennt, wie bei der Port-Weiterleitung.
docker run -it <image_name> -v /html:/var/www
Die vorhanden Volumes kann man sich anzeigen lassen, prüfen und auch löschen.
docker volume ls
docker volume create <volume_name>
docker volume inspect <volume_name>
docker volume rm <volume_name> <volume_name>
docker volume prune
Netzwerk
Bei der Installation erstellt Docker folgende drei Netzwerke: bridge
, host
und none
.
docker network ls # to list networks
docker network ls -q # list only network ids
Als Standard verbindet sich Docker mit dem bridge
Netzwerk.
Mit host
bindet sich der Container an das Host Netzwerk.
none
hat keine externe Netzwerk Schnittstelle.
Um den Container mit einem bestimmten Netzwerk zu verbinden.
docker run --net=host -it <image_name>
Docker Container können sich mit mehreren Netzwerken verbinden.
Es können auch eigene Netzwerke erstellt werden.
docker network create --driver bridge own_bridge_network
docker network rm <network> # remove a network
docker network rm $(docker network ls -q) # remove all networks
Alle ungenutzten Netzwerke entfernen.
docker network prune
Docker Kubernetes
Docker hat in der Version 18.06 Stable die Möglichkeit ein single Node Kubernetes Cluster zu betreiben.
Wodurch man nun mit docker
und kubectl
Container kontrollieren kann.
Es ist dazu gedacht, zum lokalem testen genutzt zu werden.
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
docker-for-desktop Ready master 6m v1.16.6-beta.0
Die vorhandenen Kontexte anzeigen und entsprechend auswählen und nutzen.
$ kubectl config get-contexts
$ kubectl config use-context docker-for-desktop
Die laufenden Services anzeigen lassen.
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 10m
Dashboard
Das Dashboard kann man wie folgt erzeugen.
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml
Man kann das Dashboard auch mit Helm installieren.
$ helm install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --set enableSkipLogin=true
Den Dashboard Pod anzeigen lassen und den Namen zum Port Forwarding nutzen.
$ kubectl get pod --namespace=kube-system | grep dashboard
Man braucht ein Port Forwarding um den Dashboard Pod zu erreichen.
$ kubectl port-forward <kubernetes-dashboard-name> 8443:8443 --namespace=kube-system
Anschliessend kann man das Dashboard im Browser aufrufen https://localhost:8443.
$ kubectl proxy
http://localhost:8001/api/v1/namespaces/default/services/https:dashboard:https/proxy/#/login
Einen Token um sich anmelden zu können bekommt man mit diesem Kommando.
$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | awk '/^deployment-controller-token-/{print $1}') | awk '$1=="token:"{print $2}'
Services
Einen Service wie gewohnt mit kubectl
erzeugen.
$ kubectl create -f service.yaml
Zusätzlich kann man auch mit docker
und einer docker-compose
Datei Container erzeugen.
$ docker stack deploy --namespace default --compose-file ./docker-compose.yml mykube
$ docker stack services mykube