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
positive Bewertung({{pro_count}})
Beitrag bewerten:
{{percentage}} % positiv
negative Bewertung({{con_count}})

DANKE für deine Bewertung!

Aktualisiert: 29.08.2022 von Bernhard | Translation English |🔔 | Kommentare:0
Preview Docker Befehle Übersicht

Docker Befehle Übersicht

geändert: 08.02.2023 von Bernhard (Erstveröffentlichung: 20.10.2020)

Liste der verfügbaren Docker-Befehle von docs.docker.com ... weiterlesen


Docker Container GUI grafische Weboberfläche mit Portainer | Docker | Docker Daten speichern: Docker Volumes vs. Host-Ordner

Top-Artikel in diesem Bereich


Docker Daten speichern: Docker Volumes vs. Host-Ordner

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


Docker Container GUI grafische Weboberfläche mit Portainer

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.


Docker Swarm, Portainer und Traefik kombiniert

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

Fragen / Kommentare


Durch die weitere Nutzung der Seite stimmst du der Verwendung von Cookies zu Mehr Details