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

positive Bewertung({{pro_count}})
Beitrag bewerten:
{{percentage}} % positiv
negative Bewertung({{con_count}})

DANKE für deine Bewertung!

Fragen / Kommentare


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