Wie führe ich Befehle in Docker Container aus?
Das Ausführen von Befehlen in einem Docker-Container ist einfacher als Sie denken.
Ein Docker-Container ist ein Isolated Umgebung, die usually enthält eine einzelne Anwendung mit allen erforderlichen Abhängigkeiten. Oftmals müssen wir einige Befehle innerhalb eines ausführen Andockbehälter. Es gibt verschiedene Möglichkeiten, wie wir einen Befehl in einem Container ausführen und die erforderliche Ausgabe erhalten können.
Mal sehen, wie wir das machen können.
Verwenden der interaktiven Shell
Wir können direkt auf die Shell eines Containers zugreifen und unsere Befehle wie mit einem normalen Linux-Terminal ausführen. Um eine interaktive Shell eines angehaltenen (nicht laufenden) St. zu erhaltenate)-Container können Sie Folgendes verwenden:
$ docker run -it ubuntu bash
root@c520631f652d:/#
Wie Sie sehen können, sind wir direkt in einem neuen gelandet Ubuntu
Container, in dem wir unsere Befehle ausführen können. Wenn bereits ein Container ausgeführt wird, können Sie verwenden exec
Befehl wie unten.
Lassen Sie uns zuerst die Container-ID herausfinden.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c2d969adde7a nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 127.0.0.1:80->80/tcp nginx
0960560bc24b mariadb "docker-entrypoint.s…" 2 hours ago Up 2 hours 127.0.0.1:3306->3306/tcp mariadb
Und dann in die Container-ID c2d969adde7a gelangen
$ docker exec -it c2d969adde7a bash
root@c2d969adde7a:/#
In der obigen Ausgabe können Sie beobachten, dass wir eine gestartet haben bash
Sitzung von nginx
Container, der sich in laufendem St. befandate. Hier können wir jeden unterstützten Befehl ausführen und die Ausgabe erhalten.
Hinweis - Ihr Container hat möglicherweise keine Bash und wenn ja, können Sie sh verwenden.
Ex:
docker exec -it c2d969adde7a sh
Direkte Ausgabe
Oft benötigen wir nur die Ausgabe von ein oder zwei Befehlen und keine vollständige interaktive Sitzung für unsere Aufgabe. Sie können den erforderlichen Befehl in einem Container ausführen und seine Ausgabe direkt abrufen, ohne eine neue Shell-Sitzung mit zu öffnen exec
Befehl ohne -it
Flagge. Seine Syntax wäre:
$ docker exec <container-id or name> <command>
Hier ist ein Beispiel:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c2d969adde7a nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 127.0.0.1:80->80/tcp nginx
0960560bc24b mariadb "docker-entrypoint.s…" 2 hours ago Up 2 hours 127.0.0.1:3306->3306/tcp mariadb
$ docker exec 0960560bc24b ps -ef | grep mysql
mysql 1 0 0 13:35 ? 00:00:02 mysqld
$
Wir haben ausgeführt ps -ef | grep mysql
Befehl innerhalb des Laufens MariaDB Container und bekam die Ausgabe direkt.
Dockerfile-Weg
Dies ist nicht die genaue Art und Weise, wie Sie Befehle in a ausführen können Andockbehälter obwohl es in Entwicklungssituationen oder für das anfängliche Debuggen der Bereitstellung usw. hilfreich sein kann. Wir können verwenden RUN
Befehl in einer Docker-Datei. Hier ist unser Beispiel für eine Docker-Datei:
FROM nginx:latest
RUN nginx -V
Es zieht einfach das latest nginx
Bild aus der Registrierung und führt dann die nginx -V
Befehl zum Anzeigen der Nginx-Version, wenn Sie das Image erstellen.
$ docker build -t nginx-test .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM nginx:latest
---> 7ce4f91ef623
Step 2/2 : RUN nginx -V
---> Running in 43918bbbeaa5
nginx version: nginx/1.19.9
built by gcc 8.3.0 (Debian 8.3.0-6)
built with OpenSSL 1.1.1d 10 Sep 2019
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.19.9/debian/debuild-base/nginx-1.19.9=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'
Removing intermediate container 43918bbbeaa5
---> d682277f2e50
Successfully built d682277f2e50
Successfully tagged nginx-test:latest
$
Beobachten Sie die Ausgabe von RUN
Befehl im obigen Snippet. Das obige Snippet wird nur beim ersten Build angezeigt und aufeinanderfolgende Builds wiederholen das nicht RUN
Befehlsausgabe. Um dieses Problem zu umgehen, können Sie es versuchen --no-cache
Flagge:
$ docker build -t nginx-test . --no-cache
Die letzte Methode ist nicht der beste Weg, kann aber manchmal beim Debuggen usw. hilfreich sein.
Zusammenfassung
Befehl in einem Docker ausführen Container ist einfach und es gibt einige Methoden, um dies zu tun. Es ist eine reguläre Aufgabe eines Docker-Administrators, daher ist es hilfreich, diese Befehle zu kennen.
Als nächstes lernen Sie einige der beliebtesten Docker-Befehle.