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
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
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

{{percentage}} % positiv

DANKE für deine Bewertung!

Docker Befehle Übersicht
Liste der verfügbaren Docker-Befehle von docs.docker.com ... weiterlesen
Top-Artikel in diesem Bereich
Ich betreibe eine handvoll Docker Container auf einem einzelnen Linux-Host. Docker-Container werden bei einem erneuten erstellen oder beim Austausch auf eine neuere Imageversion bekanntlich ausgetauscht und verlieren dabei alle geänderten Daten. Um bestimmte Ordner eines Containers permanent zu speichern, müssen diese über Volumes oder Bind-Mounts ausgelagert werden. Ich habe dazu meist bestimmte Pfade der Container in definierten Ordnern am Host verbunden (Bind-Mounts). Mit ein Grund für die Ve...
Ursprünglich habe ich Docker rein über die Kommandozeile verwaltet, was mit ein paar simplen Befehlen schon sehr einfach ist. Noch mehr Übersicht und eine komfortable Admin-Oberfläche liefert Portainer. Portainer selbst kann auch als Docker-Container gestartet werden und macht das Verwalten von Containern zum Kinderspiel.
Wie bereits mehrfach auf dieser Seite erwähnt, verwende ich für den Zugriff auf meine Docker-Container primär den Reverse-Proxy Traefik. Um die Container in einer grafischen GUI verwalten zu können, habe ich zusätzlich Portainer im Einsatz. Für einen Single-Server passt das Setup so weit, wer aber mehrere Server einsetzen will, kann dazu Docker-Swarm verwenden. Ich habe dazu zunächst Portainer in Kombination mit Swarm getestet und das Setup um Traefik inklusive...