Docker-Befehle in der Praxis
Docker Container können mittels Terminal-Befehle gestartet, upgedatet und verwaltet werden. In dem Beitrag notiere ich Befehle, die ich bisher für Docker benötigt habe und entsprechende Beispiele dazu:
Container starten
Ein Docker-Container kann mit einem einfachen „run“-Befehl gestartet werden:
docker run -d \
--name=testcontainer \
-p=83:80 \
--restart=always \
-v mytestvol:/app \
nginx:latest
Der Parameter -p 83:80 veröffentlicht den Port 83 und leitet diesen im Container auf Port 80 um. Unser gerade erstellter Container kann im Browser über die IP-Adresse des Hosts und dem Port 83 aufgerufen werden:
Volumes
Ein Volume ist ein Ordner auf dem Host-Betriebssystem um Daten des Containers permanent zu speichern. Der Parameter -v erzeugt ein Volume und bindet dieses im Container ein.
-v mytestvol:/app \
Der Ort für das Volume wird standardmäßig von Docker verwaltet und kann mit „docker inspect Containername“ angezeigt werden:
docker inspect testcontainer
...
"Mounts": [
{
"Type": "volume",
"Name": "mytestvol",
"Source": "/var/lib/docker/volumes/mytestvol/_data",
...
Wer einen bestimmten Ordner des Host-Betriebssystems verwenden will, kann anstelle des Volumen-Namens auch einen Pfad angeben (Bind-Mount):
-v /var/docker/mydockerfolder:/app \
„:ro“ am Ende mappt den Ordner nur lesend
-v /OrdnerNurLesend/:/OrdnerNurLesend:ro
Details, siehe auch: Docker Daten speichern: Docker Volumes vs. Host-Ordner
Container-Parameter: Netzwerk
Der Parameter: --net=host verbindet die Netzwerkkarte direkt.
Als Alternative kann der Paramter
-p=Externer_Port:Port_im_Container verwendet werden:
-p=83:80 würde also dann über die IP des Rechners mit dem Port 83 aufgerufen werden können und intern im Container wird Port 80 verwendet.
Zusätzlich kann mit --network=netzwerkname ein bestimmtes zuvor mit "docker network create" erstelltes Netzwerk verwendet werden. Container innerhalb eines Netzwerkes können nicht nur über die IP, sondern auch über deren Namen (--name) aufgerufen werden: Für den Verbindungsaufbau wird dann schlicht der Name und Port des Containers verwendet.
Container anzeigen
user@rechner:/docker$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
???????????? syncthing/syncthing:latest "/bin/entrypoint.sh …" 12 minutes ago Up 12 minutes (healthy) festive_chandrasekhar
???????????? nginx "/docker-entrypoint.…" 4 days ago Up 12 minutes 80/tcp nextcloud_webserver
???????????? nextcloud:fpm "/entrypoint.sh php-…" 4 days ago Up 12 minutes 9000/tcp nextcloud_fpm
???????????? nginx "/docker-entrypoint.…" 4 days ago Up 12 minutes 80/tcp laraveldev_webserver
???????????? mediawiki "docker-php-entrypoi…" 4 days ago Up 12 minutes 80/tcp mediawiki
???????????? laravelapp.dockerfile "docker-php-entrypoi…" 4 days ago Up 12 minutes 9000/tcp laravelapp
???????????? phpmyadmin/phpmyadmin "/docker-entrypoint.…" 4 days ago Up 12 minutes 0.0.0.0:8081->80/tcp phpmyadmin
???????????? onlyoffice/documentserver "/bin/sh -c /app/ds/…" 4 days ago Up 12 minutes 80/tcp, 443/tcp onlyoffice
???????????? jrcs/letsencrypt-nginx-proxy-companion "/bin/bash /app/entr…" 4 days ago Up 12 minutes letsencrypt-companion
???????????? mariadb "docker-entrypoint.s…" 4 days ago Up 12 minutes 3306/tcp mediawikidb
???????????? jwilder/nginx-proxy:alpine "/app/docker-entrypo…" 4 days ago Up 12 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp proxy
???????????? mariadb "docker-entrypoint.s…" 4 days ago Up 12 minutes 3306/tcp db
???????????? mariadb "docker-entrypoint.s…" 4 days ago Up 12 minutes 3306/tcp laraveldb
???????????? redis "redis-server --appe…" 4 days ago Up 12 minutes 0.0.0.0:6379->6379/tcp redis
???????????? laradock_nginx "/bin/bash /opt/star…" 3 months ago Up 11 minutes 0.0.0.0:90->80/tcp, 0.0.0.0:444->443/tcp laradock_nginx_1
???????????? laradock_php-fpm "docker-php-entrypoi…" 3 months ago Up 11 minutes 9000/tcp laradock_php-fpm_1
???????????? laradock_phpmyadmin "/run.sh supervisord…" 3 months ago Up 12 minutes 9000/tcp, 0.0.0.0:8082->80/tcp laradock_phpmyadmin_1
???????????? laradock_workspace "/sbin/my_init" 3 months ago Up 12 minutes 0.0.0.0:2222->22/tcp laradock_workspace_1
???????????? laradock_mariadb "docker-entrypoint.s…" 3 months ago Up 12 minutes 0.0.0.0:3306->3306/tcp laradock_mariadb_1
???????????? laradock_redis "docker-entrypoint.s…" 3 months ago Up 12 minutes 0.0.0.0:6380->6379/tcp laradock_redis_1
Container stoppen
docker stop containername
alle Container stoppen
docker stop $(docker ps -a -q)
Container updaten
docker pull IMAGENAME
docker stop CONTAINERNAME
docker rm CONTAINERNAME
docker run CONTAINERNAME -parameters
Docker-Compose Container updaten
docker-compose pull
docker compose up -d
Container entfernen
docker rm containername
Netzwerk anzeigen
user@rechner:/docker$ docker network ls
NETWORK ID NAME DRIVER SCOPE
???????????? docker_default bridge local
???????????? host host local
???????????? laradock_backend bridge local
???????????? laradock_default bridge local
???????????? laradock_frontend bridge local
???????????? nginx-proxy bridge local
???????????? none null local
Detail zu einem Netzwerk anzeigen
docker network inspect docker_default
Bash eines Containers aufrufen
docker exec -it containername /bin/bash
Bash Befehle innerhalb: mysql, mariadb DB-Restore
gunzip < '/daten/backup.gz' | docker exec -i laradock_mariadb_1 /usr/bin/mysql -u root --password=password dbname
Dateien von einem Container auf das lokale Dateisytem kopieren.
docker cp graylog_graylog_1:/usr/share/graylog/data /var/web/graylog/data
Wartung
nicht benötigte Docker-Images entfernen
docker image prune -a --force
Prune: nicht verwendete Daten löschen
docker system prune --volumes -f
Überwachen / Status
docker ps
docker ps listet alle Container:
root@l2:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b345697c8b1b portainer/agent:latest "./agent" 3 hours ago Up 3 hours portainer_agent.l8lte8805fugp6xdc9sfizwbi.dru1imtp8l56zhby9863j9hi8
Performance
Einen Überblick über CPU / RAM und Netzwerk bietet der Befehl docker stats
docker stats
Ausgabe der einzelnen Container anzeigen
docker logs -f containername
Image erstellen und auf einen Remote Server übertragen
docker save image:latest | gzip > /var/web/image_web.tar.gz
scp /var/web/image_web.tar.gz root@remoteserver:/var/web/image_web.tar.gz
am Remote-Server laden mit:
docker load < /var/web/image_web.tar.gz
Troubleshooting
Docker reagiert nicht mehr
wenn z.B. Befehle wie docker ps nicht mehr reagieren, kann der Fehler über den Befehl dockerd --debug eingegrenzt werden:
sudo dockerd --debug
INFO[2020-12-27T11:58:52.395359797+01:00] Starting up
failed to start daemon: pid file found, ensure docker is not running or delete /var/run/docker.pid
Die Datei kann mit
sudo rm /var/run/docker.pid
gelöscht werden.
failed to start daemon: error while opening volume store metadata database: timeout
Mithilfe folgender Befehle konnte ich Docker wieder reparieren:
Alle Docker-Prozesse stoppen:
ps axf | grep docker | grep -v grep | awk '{print "kill -9 " $1}' | sudo sh
Metadata.db löschen
sudo rm /var/lib/docker/volumes/metadata.db
Den Status anzeigen
systemctl status docker
Docker neu installieren
sudo apt-get remove docker-ce
sudo apt-get install docker-ce
Docker Befehle Übersicht
Liste der verfügbaren Docker-Befehle von docs.docker.com ... weiterlesen
{{percentage}} % positiv