Top

Docker

Docker Kubernetes

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