Aufrufen und Ausführen von Host-Docker-Operationen im Docker-Container

Aufrufen und Ausführen von Host-Docker-Operationen im Docker-Container

Zunächst einmal ist dieser Beitrag Docker-Neulingen gewidmet. Wenn Sie ein Veteran sind, ist die Vorgehensweise nach der Trennlinie im Artikel natürlich auch eine Idee.

Lassen Sie uns zunächst darüber sprechen, wie der Docker-Vorgang des Hostcomputers in Docker ausgeführt wird, was wir Docker in Docker nennen.

Warum Sie den Docker des Hostcomputers in Docker betreiben müssen, liegt auf der Hand. Sie können Ihre spezifischen Anforderungen in Containern bereitstellen, ohne sie direkt auf dem Hostcomputer installieren zu müssen (vorausgesetzt, wir haben keine Möglichkeit, den Docker des Hostcomputers in Docker zu betreiben, dann können wir solche Softwareprogramme nur direkt auf dem Hostcomputer installieren, was der Verwaltung und Wartung offensichtlich nicht förderlich ist).

Um diese Anforderung zu erfüllen, ist es eigentlich ganz einfach. Sie müssen nur die Docker-Datei und die Docker.sock-Datei des Docker-Hosts in den Container einbinden. Genauer gesagt:

-v /var/run/docker.sock:/var/run/docker.sock

-v /usr/bin/docker:/usr/bin/docker

Sie müssen zuerst den Speicherort von Docker und Docker.sock auf Ihrem Hostcomputer finden. Mounten Sie sie nicht falsch. Standard-Linux verwendet normalerweise den oben genannten Speicherort.

Wenn Sie den Docker-Container starten, können Sie nach dem normalen Mounten der beiden oben genannten Dateien Befehle wie Docker-Images in Docker ausführen.

Wenn es ein Problem mit verweigerter Berechtigung gibt

Beim Versuch, eine Verbindung zum Docker-Daemon-Socket unter unix:///var/run/docker.sock herzustellen, wurde die Berechtigung verweigert

…………………………………………………………

dial unix /var/run/docker.sock: connect: Zugriff verweigert

Problemumgehung

Geben Sie auf dem Host, auf dem sich der Container befindet, docker.sock direkt die Berechtigung 777, mit dem Befehl chmod 777 docker.sock

Wunderschöne Trennlinie

Das Folgende gilt für das Qunhui-System. Sie müssen sich nicht allzu viele Gedanken darüber machen, was dieses System ist. Kurz gesagt, dieses System weist einige einzigartige Probleme in Docker auf, die es schwierig machen, damit zu tun, was Sie möchten. Daher habe ich einen Workaround gewählt, um damit umzugehen (eine Denkweise, nur um eine Diskussion zu beginnen). Lassen Sie mich zunächst die aktuelle Situation beschreiben:

Das System bietet ein UI-Verwaltungstool für Docker. Wir können mit diesem Tool normale Mount-Vorgänge durchführen, aber wenn wir die oben genannten Docker- und Docker.sock-Dateien mounten möchten, funktioniert dies nicht. Schauen wir uns zunächst den Screenshot an:

Lassen Sie uns über die Einschränkungen der UI-Operationen im Bild sprechen!

Qunhui hat die Auswahl der Dateien offiziell eingeschränkt. Es ist nicht möglich, Dateien auf Systemebene wie /usr/<yyyy-mm-sock>/va/<yyyy-mm-sock> auszuwählen. Das bedeutet, dass wir Docker- und Docker.sock-Dateien nicht direkt mounten können.

Ist es möglich, einen ln -s-Softlink durchzuführen?

Nach einigen Versuchen habe ich zunächst über die SSH-Befehlszeile zwei Softverbindungen im Jenkins-Ordner erstellt (Docker und Docker.sock sanft verbunden) und bin dann zur Qunhui-UI-Oberfläche zurückgekehrt, konnte sie aber immer noch nicht auswählen (da Qunhui die Softverbindungsdatei direkt blockiert hat, kann man sie nicht sehen).

Wie kann man das Problem also lösen?

Meine Methode ist (Softlink-Methode ist geändert):

1. Erstellen Sie zwei Dateien „docker“ und „docker.sock“ im Jenkins-Verzeichnis (benennen Sie sie korrekt).

2. Klicken Sie dann im Docker auf die Schaltfläche „Datei hinzufügen“, wählen Sie diese beiden Dateien wie gewohnt aus und mounten Sie sie. Sie können sie wie gewohnt mounten und andere Konfigurationen abschließen. Starten Sie den Docker-Container nach Abschluss der Konfiguration vorerst nicht.

3. Melden Sie sich über SSH bei Qunhui an, löschen Sie die beiden gerade erstellten Dateien im Jenkins-Verzeichnis und erstellen Sie dann Softlinks für die Docker- und Docker.sock-Quelldateien zu Jenkins.

root@test:cd /volume1/docker/jenkins/
root@test:rm -rf docker docker.sock
root@test:ln -s /run/docker.sock /volume1/docker/jenkins/docker.sock
root@test:ln -s /usr/local/bin/docker /volume1/docker/jenkins/docker
root@test:/volume1/docker/jenkins#ll
insgesamt 8
drwxrwxrwx+ 1 Nuggets-Benutzer 96 6. Juni 11:22 .
drwxr-xr-x+ 1 root root 188 30. Mai 19:29 ..
lrwxrwxrwx 1 root root 21 Juni 6 11:22 docker -> /usr/local/bin/docker
lrwxrwxrwx 1 root root 16 Juni 6 11:21 docker.sock -> /run/docker.sock
drwxrwxrwx+ 1 shanhongyu-Benutzer 24. Juni 1 11:07 java_home
drwxrwxrwx+ 1 Nuggets-Benutzer 4476 6. Juni 11:00 jenkins_home
drwxrwxrwx+ 1 shanhongyu Benutzer 82 1. Juni 11:12 maven_home

4. Gehen Sie dann zurück zur Qunhui-Benutzeroberfläche und starten Sie den Container. Alles ist perfekt.

(Qunhui erlaubt Ihnen nicht, Softlinks auszuwählen, aber Linux und Docker können Softlinks grundsätzlich direkt mounten)

Zusatzwissen: Mit Docker Host-Programme in Images ausführen

Der Befehl „Docker Run“ wird verwendet, um Befehle in einem neuen Container auszuführen. Der Befehl „Docker Run“ erstellt zunächst eine beschreibbare Containerebene auf dem angegebenen Image und startet diese dann mit dem angegebenen Befehl.

Mit anderen Worten: Docker Run entspricht den APIs /containers/create und /containers/(id)/start.

Ein angehaltener Container kann mit Docker Start mit allen vorherigen Änderungen neu gestartet werden. Siehe docker ps -a, um eine Liste aller Container anzuzeigen.

Verwendung

docker run [OPTIONEN] IMAGE [BEFEHL] [ARG…]

Hülse

Beispiel

Vergabe eines Namens und Zuordnung eines Pseudo-TTY (-name, -it)

$ docker run --name test -it debian
 
root@d6c0fe130dba:/# Ausfahrt 13
$ echo $?
13
$ docker ps -a | grep-Test
d6c0fe130dba debian:7 "/bin/bash" vor 26 Sekunden Beendet (13) vor 17 Sekunden test

Hülse

Dieses Beispiel führt einen Container mit dem Namen „Test“ unter Verwendung des Images „debian:latest“ aus. - es weist Docker an, ein Pseudo-TTY zuzuordnen, das mit dem Standarddin des Containers verbunden ist. Dadurch wird eine interaktive Bash-Shell im Container erstellt. In diesem Beispiel wird die Bash-Shell durch Eingabe von exit 13 beendet. Dieser Exit-Code wird an den Aufrufer von Docker Run übergeben und in den Metadaten des Testcontainers aufgezeichnet.

Container-ID erfassen (-cidfile)

$ docker run --cidfile /tmp/docker_test.cid ubuntu echo "test"

Hülse

Dadurch wird ein Container erstellt und Tests auf der Konsole gedruckt. Das Flag --cidfile veranlasst Docker, eine neue Datei zu erstellen und die Container-ID darin zu schreiben. Wenn die Datei bereits vorhanden ist, gibt Docker einen Fehler zurück. Docker schließt diese Datei, wenn der Docker-Lauf beendet wird.

Volle Containerfunktionalität (-privilegiert)

$ docker run -t -i --rm Ubuntu Bash
root@bc338942ef20:/# mount -t tmpfs keine /mnt
mount: Berechtigung verweigert

Hülse

Dies funktioniert nicht, da die meisten potenziell gefährlichen Kernelfunktionen standardmäßig gelöscht werden, einschließlich cap_sys_admin (das zum Mounten von Dateisystemen erforderlich ist). Mit dem Flag --privileged kann es jedoch ausgeführt werden:

$ docker run -t -i --privileged Ubuntu Bash
root@50e3f57e16e6:/# mount -t tmpfs keine /mnt
root@50e3f57e16e6:/# df -h
Verwendete Dateisystemgröße Verfügbare Nutzung% Eingebunden auf
keine 1,9G 0 1,9G 0 % /Monat

Hülse

Arbeitsverzeichnis festlegen [-w]

$ docker run -w /Pfad/zum/Verzeichnis/ -i -t Ubuntu pwd

Hülse

-w ermöglicht die Ausführung von Befehlen in einem Verzeichnis, hier /Pfad/zum/Verzeichnis/. Wenn der Pfad nicht existiert, wird er innerhalb des Containers erstellt.

Legen Sie Speichertreiberoptionen für jeden Container fest

$ docker run -it --storage-opt Größe=120G Fedora /bin/bash

Hülse

Tmpfs einhängen (-tmpfs)

$ docker run -d --tmpfs /run:rw,noexec,nosuid,size=65536k mein_image

Hülse

Das Flag --tmpfs mountet ein leeres tmpfs in den Container mit den Optionen rw, noexec, nosuid, size=65536k.

Volumes mounten (-v, --read-only)

$ docker run -v „pwd“: „pwd“ -w „pwd“ -i -t Ubuntu pwd

Hülse

Das Flag -v mountet das aktuelle Arbeitsverzeichnis in den Container. -w ermöglicht die Ausführung von Befehlen im aktuellen Arbeitsverzeichnis und ändert das Verzeichnis auf den von pwd zurückgegebenen Wert. Diese Kombination führt den Befehl also mithilfe des Containers, aber im aktuellen Arbeitsverzeichnis aus.

$ docker run -v /existiert nicht:/foo -w /foo -i -t Ubuntu Bash

Hülse

Wenn das Hostverzeichnis für ein gebundenes Volume nicht vorhanden ist, erstellt Docker dieses Verzeichnis automatisch auf dem Host. Im obigen Beispiel erstellt Docker den Ordner /doesnt/exists, bevor der Container gestartet wird.

$ docker run --read-only -v /icanwrite busybox touch /icanwrite/hier

Hülse

Volumes können in Kombination mit --read-only verwendet werden, um zu steuern, wohin der Container Dateien schreibt. Das Flag --read-only mountet das Root-Dateisystem des Containers schreibgeschützt und untersagt das Schreiben an Speicherorte außerhalb des angegebenen Volumes des Containers.

Der obige Artikel über das Aufrufen und Ausführen der Docker-Operationen des Hosts im Docker-Container ist alles, was ich mit Ihnen teilen kann. Ich hoffe, er kann Ihnen als Referenz dienen, und ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen.

Das könnte Sie auch interessieren:
  • Docker ermöglicht den nahtlosen Aufruf von Shell-Befehlen zwischen Container und Host
  • Lösung für den Docker-Container, der keine Schreibberechtigung für das Host-Verzeichnis hat
  • Lösung, wenn der Docker-Container nicht auf den Host-Port zugreifen kann
  • Führen Sie die Shell oder das Programm im Docker-Container auf dem Host aus.
  • Detaillierte Erläuterung zur Lösung des Problems, dass der Docker-Container nicht über IP auf den Hostcomputer zugreifen kann
  • So verwenden Sie einen Docker-Container für den Zugriff auf das Host-Netzwerk
  • Lösen Sie das Problem des 8-Stunden-Unterschieds zwischen Docker-Container und Host-Computer

<<:  Umfassende Übersicht über die verschiedenen Abhörmethoden von Vue3.0

>>:  Detaillierte Erklärung zur Verwendung relativer Pfade in HTML, um Dateien auf allen Verzeichnisebenen abzurufen

Artikel empfehlen

So öffnen Sie das MySQL-Binlog-Protokoll

Binlog ist eine binäre Protokolldatei, die alle M...

Schritte zum Öffnen des MySQL-Binlogs

Binlog ist eine binäre Protokolldatei, die zum Au...

Verschieben Sie die MySQL-Datenbank unter Windows auf eine andere Festplatte

Vorwort Heute habe ich MySQL installiert und fest...

Detaillierte Erklärung der Serveroptionen von Tomcat

1. Konfiguration Die ersten beiden sind standardm...

HTML-Tipps, um Ihren Code semantisch zu gestalten

HTML-Semantik scheint ein alltägliches Problem zu...

Detaillierte Erklärung, wie Node.js mit ES6-Modulen umgeht

Inhaltsverzeichnis 1. Unterschiede zwischen den b...

Vue.js verwaltet die Kapselung von Hintergrundtabellenkomponenten

Inhaltsverzeichnis Problemanalyse Warum Kapselung...

Lösung für das Problem, dass sich der mysql8.0.11-Client nicht anmelden kann

In diesem Artikel erfahren Sie, wie Sie das Probl...

Lösungen für Probleme bei der Leistungsoptimierung von MySQL-Indizes

Die von MySQL erstellte Optimierung besteht im Hi...