====== Docker ======
====== Installation ======
Paketmanagement vorbereiten:
apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
Docker Repository hinzufügen:
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
Docker CE installieren:
apt-get update
apt-get install docker-ce
====== Erster Zugriff auf die docker-hub Registry ======
docker search ubuntu
====== Zugriff auf lokale Registry ======
Lokale Registry auf notebook31 benutzen:
''/etc/default/docker'' :
DOCKER_OPTS="--insecure-registry notebook31:5000"
docker search notebook31:5000/ubuntu
docker images
docker pull notebook31:5000/ubuntu
====== erste Container starten ======
extra Fenster öffnen mit:
docker events
Container mit shell:
docker run -i -t --rm ubuntu bash
Pipe von einem Container zum Nächsten:
docker run --rm ubuntu ls| docker run --rm -i ubuntu tr [:lower:] [:upper:]
Wordpress Container starten:
docker run -d -P --name wordpress tutum/wordpress
docker ps
docker port wordpress
docker stop wordpress
docker ps
docker ps -a
Alle Container löschen:
docker ps -aq | xargs docker rm
====== Innen- und Außenansicht ======
Docker Ansicht:
docker run -ti ubuntu:latest bash
ip a s
ps ax
Linux Ansicht:
docker ps
docker stop
docker ps -a
docker rm
====== Zusätzliche Commands ======
Installierte Files anzeigen
dpkg -L docker-ce | less
Prozesse in Baumstruktur anzeigen
ps --forest
ps auxf
docker Command:
docker run ubuntu # docker Container "Ubuntu" starten (wird ggfls. runtergeladen)
docker info # Allgemeine Informationen zum Docker System
docker ps # Laufende Container anzeigen
docker ps -a # Alle Container - auch nicht laufende anzeigen
docker run -it ubuntu # Startet den Container und öffnet ein interaktives (-i) Terminal (-t)
docker run -it ubuntu /bin/bash
docker run -it ubuntu hostname
docker attach # mit laufendem Container verbinden ( muss nur soweit eingegeben werden, bis sie eindeutig ist)
docker exec -it elated_tesla /bin/bash # im laufenden Container "elated_tesla" etwas (/bin/bash) ausführen.
docker run -d ubuntu /bin/sh -c 'while true; do date; sleep 1;done' # -d = daemon
docker logs [-f] # Ausgabe des Containers anzeigen [-f = follow]
docker ps -l # letzter Container
docker ps -q # zeigt die ID an
docker top # Top zum Container
docker inspect # Zeigt Informationen zum Container
===== Erweiterte Funktionen =====
docker run -P httpd # startet den Container mit Default-Portweiterleitung
docker run -p 80:80 httpd # -p gibt externen/internen Port an
docker container ls # = docker ps
=== Netzwerk ===
docker network create # Netzwerk erstellen
docker run --net ..
docker run --net --network-alias # -> alias wird im docker-internen DNS vergeben.
=== Volumes ===
docker run -d -p 80:80 -v /home/nutzer15/webserver:/usr/local/apache2/htdocs httpd
docker volume create webserver
docker run -d -p 80:80 -v webserver:/usr/local/apache2/htdocs httpd
docker run -d -p 80:80 -v webserver:/usr/local/apache2/htdocs --read-only httpd # READ-ONLY
=== Restart ===
docker run -ti --name restarttest --restart on-failure:2 ubuntu # Bei Fehlern wird der Container 2x neu gestartet
=== Export ===
docker export -o my-export.tar # Exportiert den angegebenen Container in das angegebene tar
===Systempflege ===
docker rm $(docker ps --filter status=exited -q) # löscht nicht mehr gestartete Container
====Images====
docker commit 2865a23d7458 # WICHTIG: Volumes sind nicht Bestandteil des Commit
docker image ls
docker tag b47f3389c55c jbuntu:1.0
docker image ls
====Dockerfile===
In Dockerfiles können Informationen für das Erstellen eines Images hinterlegt werden.
FROM centos:latest
RUN yum -y install httpd
VOLUME ["/var/www"]
RUN echo "hello world" > /var/www/html/index1.html
RUN echo "hello world" > /tmp/index1.html
ADD docker-logo.png /var/www/html/
EXPOSE 80
CMD /usr/sbin/httpd -D FOREGROUND
FROM centos:latest
RUN yum -y install httpd
CMD /usr/sbin/httpd -D FOREGROUND
ENV JAVA_HOME=/opt/java
RUN sed -i 's/Listen 80/ Listen 8080/' /etc/httpd/conf/httpd.conf
RUN groupadd apache2
RUN useradd -g apache2 -s /bin/bash apache2
RUN chown apache2:apache2 /etc/httpd/logs
RUN chown apache2:apache2 /run/httpd
WORKDIR /home/apache2/webapps
USER apache2:apache2
RUN touch /home/apache2/docker-test.txt
RUN echo $JAVA_HOME > /home/apache2/docker-test.txt
https://docs.docker.com/engine/reference/builder
ARG USER=defaultuser
FROM centos:latest
ENV USER=${USER}
RUN yum -y install httpd
ENTRYPOINT ["/usr/bin/htpasswd", "-c", "/htpasswd"]
CMD ["USER"]
1.
FROM centos:latest
ONBUILD RUN echo Hallo > /var/www/html/index.html
ONBUILD RUN rm /etc/httpd/conf.d/welcome.conf
RUN yum -y install httpd
CMD /usr/sbin/httpd -D FOREGROUND
2.
FROM gruppe4:latest
HEALTHCHECK --interval=10s --timeout=3s --resries=1 CMD curl -f http://localhost/ || exit 1
LABEL version="0.1"
LABEL description="Dies ist ein Test LABEL"
LABEL vendor="Linuxhotel"
STOPSIGNAL 9
CMD /usr/sbin/httpd -D FOREGROUND
docker build -t gruppe1
docker run -P gruppe1
===== docker history =====
Mit 'docker history' kann man sich anzeigen lassen, was in einem Image "passiert" ist.
docker history jasonrivers/nagios:latest
IMAGE CREATED CREATED BY SIZE COMMENT
8dcbe7de7b64 7 days ago /bin/sh -c #(nop) CMD ["/usr/local/bin/st... 0B
7 days ago /bin/sh -c #(nop) VOLUME [/opt/nagios/var... 0B
7 days ago /bin/sh -c #(nop) EXPOSE 80/tcp 0B
7 days ago /bin/sh -c echo "ServerName ${NAGIOS_FQDN}... 125B
7 days ago /bin/sh -c #(nop) ENV APACHE_LOG_DIR=/var... 0B
7 days ago /bin/sh -c #(nop) ENV APACHE_LOCK_DIR=/va... 0B
7 days ago /bin/sh -c ln -s /etc/sv/* /etc/service 58B
7 days ago /bin/sh -c rm /opt/nagiosgraph/etc/fix-nag... 0B
...
===== docker diff =====
Zeigt Unterschiede des laufenden Containers zum Image
docker diff 09bb184ebe39
C /etc/mailname
C /etc/postfix
C /etc/postfix/main.cf
C /etc/sv/apache
A /etc/sv/apache/supervise
A /etc/sv/apache/supervise/control
...
===== docker-compose =====
Docker-compose automatisiert Abläufe innerhalb von docker, wie z.B. das Anlegen von Netzwerken, Images, Containers usw.
curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod 755 /usr/local/bin/docker-compose
Setzt ein File 'docker-compose.yaml' voraus.
version: "2"
services:
www:
build: www
ports:
- 8000:5000
user: nobody
environment:
DEBUG: 1
command: python counter.py
volumes:
- ./www:/src
redis:
image: redis
~
Mit 'docker-compose up' im entsprechenden Verzeichnis, wird das File 'docker-compose.yaml' verarbeitet.
docker-compose up
docker-compose up -d # Daemon
docker-compose logs
docker-compose logs -f
docker-compose build # bauen ohne zu starten
===== portainer =====
Web-Oberfläche zur Verwaltung von docker. (Vorsicht: benötigt Zugriff auf docker.sock und hat damit alle Rechte im Docker)
* https://portainer.io
* https://portainer.io/install.html
# im swarm
docker service create --name portainer --publish 9000:9000 --replicas=1 --constraint 'node.role == manager' --mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock portainer/portainer -H unix:///var/run/docker.sock
===== docker-machine =====
Nutzt virtualbox um mehrere virtuelle Docker-Systeme anzulegen. Diese können dann z.B. als docker swarm genutzt werden.
curl -L https://github.com/docker/machine/releases/download/v0.13.0/docker-machine-`uname -s`-`uname -m` >/usr/local/bin/docker-machine
chmod +x /usr/local/bin/docker-machine
apt-get install virtualbox
docker-machine create node1
docker-machine create node2
docker-machine create node3
docker-machine env node1 # Umgebungsvariablen der VM
eval $(docker-machine env node1) # Umgebungsvariablen in der Shell setzen
docker info # liefert nun docker infos der VM
docker-machine ssh node1 # ssh zum docker-machine node1 (Auth über ssh-key)
===== docker swarm =====
docker swarm init --advertise-addr 192.168.99.100 # docker swarm erstellen - IP ist die externe IP
docker node ls
# Node hinzufügen
docker swarm join --token SWMTKN-1-1996mwovs1uv1n2yay0r80g4uvfl59dujv14rymxdbx5jy0gd8-54373om4g69ttk8e6pt2vjsuh 192.168.99.100:2377
# JOIN-Token neu anzeigen lassen
docker swarm join-token worker
docker swarm join-token manager
docker node promote node2
docker node denote node2
docker service create ... # wie docker run - nur im Swarm
==== Netzwerk im Swarm anlegen ====
docker network create JBNET1 --driver overlay --attachable # reicht auf einem Node (z.B. node1)
docker run -d --net JBNET1 --name httpd httpd # auf node1
docker run -d --net JBNET1 --name redis redis # auf node2
Die Container httpd und redis können nun über das JBNET1 direkt kommunizieren.
==== Commands im Swarm ====
docker service create --name registry --publish 5000:5000 registry:2
docker service ls
docker service ps
# z.B.:
docker service ps registry
docker service ps portainer
# Service skalieren
docker service create --name ping alpine ping 8.8.8.8
watch -n 1 docker service ps ping
docker service update ping --replicas 6
# Globaler Service - läuft auf jedem Node genau 1x
docker service create --name pingglobal --mode global alpine ping 8.8.8.8
====== docker registry ======
"Kleine Lösung" zur Weitergabe von Images innerhalb eines Swarm. 127.0.0.1 ist default-mäßig als "insecure"-Quelle zugelassen.
Ergebnis lässt sich im Browser unter http://192.168.99.100:5000/v2/_catalog anzeigen.
docker service create --name registry --publish 5000:5000 registry:2
docker pull centos
docker image ls
docker tag centos 127.0.0.1:5000/centos # Name wird geändert. Anfang des Namen wird automatisch als Ziel
docker push 127.0.0.1:5000/centos # genutzt. Fehlt das Ziel, wird docker-hub angenommen
# nächster Node
docker pull 127.0.0.1:5000/centos
docker image ls
== Übung ==
REGISTRY=127.0.0.1:5000
TAG=v1
for s in hasher rng webui worker; do docker tag dockercoins_$s $REGISTRY/dockercoins_$s:$TAG; done
for s in hasher rng webui worker; do docker push $REGISTRY/dockercoins_$s:$TAG; done
* git clone http://github.com/dockersamples/docker-swarm-visualizer
====== docker stack ======
version: "3"
services:
rng:
build: dockercoins/rng
image: ${REGISTRY-127.0.0.1:5000}/rng:${TAG-latest}
deploy:
mode: global
hasher:
build: dockercoins/hasher
image: ${REGISTRY-127.0.0.1:5000}/hasher:${TAG-latest}
webui:
build: dockercoins/webui
image: ${REGISTRY-127.0.0.1:5000}/webui:${TAG-latest}
ports:
- "8000:80"
redis:
image: redis
worker:
build: dockercoins/worker
image: ${REGISTRY-127.0.0.1:5000}/worker:${TAG-latest}
deploy:
replicas: 10
== Übung ==
export REGISTRY=127.0.0.1:5000
export TAG=v1
docker stack deploy dockercoins --compose-file dockercoins.yml
====== Minicub ======
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/
minikube start
====== Notizen ======
===== Grundsätzlich =====
* Ein Prozess pro Container
* Übergabe der Informationen über Volumes
* z.B. Filebeat (sidecar)
* aber auch nagios.cmd / Livestatus rw-file
* Nagios in x Containern
* nagios-core
* plugins über Image zur Verfügung stellen
* max-worker sehr klein setzen
* mk-livestatus
* nagflux
* (ohne Apache?)
* Aufsetzen der Umgebung
* git clone
* docker-compose
* Configurations über Umgebungsvariablen (Container unabhängig von den Daten)
* Config-Änderungen ohne Image-Anpassungen
* Keine Datenhaltung im Container
* .dockerignore-Datei nutzen
* Layerzahl minimieren (apt-get update && apt-get install .... && ... )
* tags benutzen (Namen und Versionen, latest pflegen)
* Container ggfls. unter Benutzernamen laufen lassen (z.B. nagios)
====== Links ======
* https://blog.programster.org/docker-swarm-cheatsheet
* https://docs.docker.com/network/proxy/ - Docker in einer Umgebung mit Proxy
* https://docs.docker.com/config/daemon/systemd/ - Docker und systemd