Detaillierte Erläuterung der Docker Volume-Berechtigungsverwaltung

Detaillierte Erläuterung der Docker Volume-Berechtigungsverwaltung

Das Datenvolumen ist ein wichtiges Konzept von Docker. Datenvolumes sind spezielle Verzeichnisse, die von einem oder mehreren Containern verwendet werden können und wertvolle Funktionen für die Speicherung von Containeranwendungen bieten:

  • Persistente Daten werden vom Container-Lebenszyklus entkoppelt: Der Inhalt des Datenvolumens kann nach dem Löschen des Containers erhalten bleiben. Das nach Docker 1.9 eingeführte benannte Volume kann den Lebenszyklus von Datenvolumes bequemer verwalten; Datenvolumes können unabhängig voneinander erstellt und gelöscht werden.
  • Datenvolumes können zum Teilen von Daten zwischen Containern verwendet werden
  • Kann verschiedene Arten von Datenspeicherimplementierungen unterstützen

Docker bietet standardmäßig Unterstützung für lokale Datei-Volumes auf dem Host und kann das Verzeichnis des Hosts in den Container einbinden. Da durch das Container-Schichtdateisystem kein Leistungsverlust entsteht, eignen sich lokale Datei-Volumes sehr gut für Szenarien, die einen Hochleistungsdatenzugriff erfordern, wie etwa die Speicherung von MySQL-Datenbankdateien. Gleichzeitig unterstützt Docker verschiedene Arten von Datenvolumes über Volume-Plugins, wodurch die Speicheranforderungen unterschiedlicher Anwendungslasten flexibler gelöst werden können. Beispielsweise kann der Alibaba Cloud Container Service Container mit Cloud-Disk-basiertem Blockspeicher und OSSFS- und NAS/NFS-basiertem gemeinsam genutztem Dateispeicher bereitstellen.

Die Verwaltung der Berechtigungen für Docker-Volumes ist jedoch oft sehr verwirrend. Dieser Artikel stellt anhand von Beispielen häufige Probleme und Lösungen bei der Berechtigungsverwaltung für Docker-Datenvolumes vor.

Über den Fehler beim Mounten des lokalen Datenvolumens von Jenkins

Ein Kollege hatte kürzlich ein Problem, als er Jenkins in einem Container ausführte. Die Schritte zur Reproduktion sind wie folgt:

Hinweis: Wenn Sie Windows/Mac verwenden, müssen Sie sich bei der virtuellen Boot2docker-Maschine anmelden. Für Linux ist dies jedoch nicht erforderlich.

Docker-Maschine SSH Standard

Starten Sie das offizielle Jenkins-Image und überprüfen Sie das Protokoll

docker run -d -p 8080:8080 -p 50000:50000 --name jenkins jenkins
Docker-Protokolle Jenkins

Wir können feststellen, dass das Containerprotokoll "Jenkins" zeigt, dass alles normal ist

Um jedoch die Jenkins-Konfigurationsdaten beizubehalten, tritt ein Problem auf, wenn wir den Datenordner im aktuellen Verzeichnis des Hosts in das Verzeichnis „/var/jenkins_home“ im Container mounten:

docker rm -f jenkins
docker run -d -p 8080:8080 -p 50000:50000 -v $(pwd)/data:/var/jenkins_home --name jenkins jenkins
Docker-Protokolle Jenkins

Das Fehlerprotokoll sieht wie folgt aus

touch: „/var/jenkins_home/copy_reference_file.log“ kann nicht berührt werden: Berechtigung verweigert
Kann nicht in /var/jenkins_home/copy_reference_file.log schreiben. Falsche Volumeberechtigungen?

Was ist los?

Lassen Sie uns die Berechtigungen des Verzeichnisses "/var/jenkins_home" in der vorherigen Startmethode überprüfen und den aktuellen Benutzer des Jenkins-Containers überprüfen: Der aktuelle Benutzer ist "jenkins" und das Verzeichnis "/var/jenkins_home" gehört dem Jenkins-Benutzer

docker@Standard:~$ docker run -ti --rm --entrypoint="/bin/bash" jenkins -c "whoami && id"
Jenkins
UID = 1000 (Jenkins) GID = 1000 (Jenkins) Gruppen = 1000 (Jenkins)

docker@Standard:~$ docker run -ti --rm --entrypoint="/bin/bash" jenkins -c "ls -la /var/jenkins_home"
insgesamt 20
drwxr-xr-x 2 Jenkins Jenkins 4096 5. Juni 08:39 .
drwxr-xr-x 28 root root 4096 24. Mai 16:43 ..
-rw-r--r-- 1 Jenkins Jenkins 220 12. November 2014 .bash_logout
-rw-r--r-- 1 Jenkins Jenkins 3515 12. November 2014 .bashrc
-rw-r--r-- 1 jenkins jenkins 675 12. November 2014 .Profil

Beim Zuordnen eines lokalen Datenvolumens wird der Besitzer des Verzeichnisses /var/jenkins_home zum Root-Benutzer.

docker run -ti --rm -v $(pwd)/data:/var/jenkins_home --entrypoint="/bin/bash" jenkins -c "ls -la /var/jenkins_home"
insgesamt 4
drwxr-sr-x 2 Root-Mitarbeiter 40, 5. Juni, 08:32 Uhr.
drwxr-xr-x 28 root root 4096 24. Mai 16:43 ..

Dies erklärt, warum das Problem „Berechtigung verweigert“ auftritt, wenn der Prozess des „Jenkins“-Benutzers auf das Verzeichnis „/var/jenkins_home“ zugreift.

Lassen Sie uns das Datenvolumenverzeichnis auf dem Hostcomputer noch einmal überprüfen. Der Eigentümer des Verzeichnisses „data“ unter dem aktuellen Pfad ist „root“. Dies liegt daran, dass dieses Verzeichnis standardmäßig vom Docker-Prozess erstellt wird.

docker@default:~$ ls -la Daten
gesamt 0
drwxr-sr-x 2 Root-Mitarbeiter 40 5. Juni 08:32 ./
drwxr-sr-x 5 Docker-Mitarbeiter 160 5. Juni 08:32 ../

Nachdem das Problem entdeckt wurde, ist auch die entsprechende Lösung sehr einfach: Weisen Sie dem Besitzer des aktuellen Verzeichnisses die UID 1000 zu, starten Sie anschließend den „Jenkins“-Container und alles wird normal.

sudo chown -R 1000 Daten
Docker starten Jenkins

Greifen Sie jetzt über den Browser auf „http://192.168.99.100:8080/“ zu, um die Jenkins-Weboberfläche anzuzeigen. Hinweis: Wenn Sie nicht darauf zugreifen können, müssen Sie möglicherweise den Befehl „Docker-Machine IP“ verwenden, um die IP-Adresse des aktuellen Docker-Hosts abzurufen.

Wenn wir den Container erneut betreten, um die Berechtigungen des Verzeichnisses „/var/jenkins_home“ zu überprüfen, ist sein Besitzer „jenkins“ geworden.

docker@Standard:~$ docker exec jenkins ls -la /var/jenkins_home
insgesamt 24
drwxr-sr-x 11 Jenkins-Mitarbeiter 340 5. Juni 09:00.
drwxr-xr-x 28 root root 4096 24. Mai 16:43 ..
drwxr-sr-x 3 Jenkins-Mitarbeiter 60 5. Juni 08:59 .java
-rw-r--r-- 1 Jenkins-Mitarbeiter 289 5. Juni 08:59 copy_reference_file.log
...

Interessant ist, dass der Besitzer des Verzeichnisses „data“, das wir auf dem Host sehen, „docker“ ist. Dies liegt daran, dass die UID des Benutzers „docker“ auf dem Host „boot2docker“ ebenfalls „1000“ ist.

docker@default:~$ ls -la Daten
insgesamt 20
drwxr-sr-x 2 Docker-Mitarbeiter 40 5. Juni 11:55 ./
drwxr-sr-x 6 Docker-Mitarbeiter 180 5. Juni 11:55 ../
...

An diesem Punkt wissen wir bereits, dass die Berechtigungen der Dateien/Verzeichnisse im lokalen Datenträger des Containers mit denen auf dem Host übereinstimmen, mit der Ausnahme, dass uid/gid im Docker-Container und auf dem Host unterschiedlichen Benutzer-/Gruppennamen zugeordnet sein können.

Oben haben wir einen gängigen Trick verwendet, nämlich beim Ausführen des Chown-Befehls auf dem Hostcomputer die UID anstelle eines bestimmten Benutzernamens zu verwenden, damit der richtige Besitzer festgelegt werden kann.

Obwohl das Problem gelöst wurde, sind die Überlegungen noch nicht abgeschlossen. Denn bei der Verwendung lokaler Datenträger ist der Jenkins Container auf die Richtigkeit der Berechtigungen des Host-Verzeichnisses angewiesen, was zusätzlichen Aufwand für das automatisierte Deployment bedeutet. Gibt es eine Möglichkeit, dass der Jenkins-Container automatisch die richtigen Berechtigungen für das Datenvolumen einstellt? Dieses Problem ist auch für viele Anwendungen aufschlussreich, die im Nicht-Root-Modus ausgeführt werden.

Lokale Datenträger für Nicht-Root-Anwendungen korrekt mounten

Wir können viele verwandte Diskussionen auf dem allmächtigen stackoverflow.com finden. Eine der aufschlussreichsten Fragen und Antworten lautet wie folgt:

http://stackoverflow.com/questions/23544282/what-is-the-best-way-to-manage-permissions-for-docker-shared-volumes

Es gibt zwei Grundideen:

Eine Möglichkeit besteht darin, die Datencontainermethode zu verwenden, um Datenmengen zwischen Containern zu teilen. Dadurch müssen keine Berechtigungsprobleme für den Datenträger auf dem Hostcomputer gelöst werden. Da Docker ab Version 1.9 benannte Volumes als Ersatz für reine Datencontainer bereitstellt, müssen wir dieses Problem noch wirklich lösen.

Eine andere Idee besteht darin, den Container als Root-Benutzer zu starten, den Befehl „chown“ im Container-Startskript zu verwenden, um die Dateiberechtigungen des Datenvolumens zu ändern, und dann zum Ausführen des Programms zum Nicht-Root-Benutzer zu wechseln.

Betrachten wir die zweite Idee zur Lösung dieses Problems.

Unten sehen Sie eine Docker-Datei, die auf dem Jenkins-Image basiert: Sie wechselt zum Benutzer „root“ und fügt dem Image den Befehl „gosu“ sowie einen neuen Einstiegspunkt „/entrypoint.sh“ hinzu.

VON jenkins:latest
BENUTZER root
RUN GOSU_SHA=5ec5d23079e94aea5f7ed92ee8a1a34bbf64c2d4053dadf383992908a2f9dc8a \
 && curl -sSL -o /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/1.9/gosu-$(dpkg --print-architecture)" \
 && chmod +x /usr/local/bin/gosu \
 && echo "$GOSU_SHA /usr/local/bin/gosu" | sha256sum -c - 
KOPIEREN Sie entrypoint.sh /entrypoint.sh
EINSTIEGSPUNKT ["/entrypoint.sh"]

Hinweis: gosu ist ein kleines Tool, das häufig in offiziellen Docker-Images erscheint. Es ist ein leichtgewichtiger Ersatz für die Befehle „su“ und „sudo“ und löst einige ihrer Probleme mit TTY und Signalübermittlung.

Der Inhalt des neuen Einstiegspunkts „entrypoint.sh“ lautet wie folgt: Er legt den Besitz von „jenkins“ für das Verzeichnis „JENKINS_HOME“ fest und wechselt dann mit dem Befehl „gosu“ zum Benutzer „jenkins“, um die Anwendung „jenkins“ auszuführen.

#!/bin/bash
setze -e
chown -R 1000 "$JENKINS_HOME"
exec gosu jenkins /bin/tini -- /usr/local/bin/jenkins.sh

Sie können den entsprechenden Code direkt von https://github.com/denverdino/docker-jenkins abrufen und Ihr eigenes Jenkins-Image erstellen. Der Ausführungsbefehl lautet wie folgt:

Git-Klon https://github.com/AliyunContainerService/docker-jenkins
cd docker-jenkins/jenkins
Docker-Build -t Denver/Jenkins.

Starten Sie dann den Jenkins-Container basierend auf dem neuen Image

docker rm -f jenkins
docker run -d -p 8080:8080 -p 50000:50000 -v $(pwd)/data:/var/jenkins_home --name jenkins denverdino/jenkins

Zusammenfassen

Dieser Artikel stellt das Grundkonzept von Docker-Datenvolumes vor. Wir haben eine Lösung für das Berechtigungsproblem bereitgestellt, das auftritt, wenn Nicht-Root-Prozesse auf lokale Datenträger zugreifen. Wir planen, in Zukunft noch weitere Probleme zusammenzufassen, die bei Docker-Datenvolumes auftreten.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Eine kurze Diskussion zum Docker-Lernen: Docker-Datenvolumen (Volumen)
  • Detaillierte Erläuterung zum benannten Volume der Docker-Datenverwaltung
  • Detaillierte Erläuterung der Container-Datenmengen und der Datenverwaltung in Docker
  • Eine kurze Einführung in die Dockerfile-Anweisung VOLUME
  • Details und Beispiele zur Docker-Volume-Nutzung

<<:  Eine kurze Diskussion über das Problem des vergessenen MySQL-Passworts und des Anmeldefehlers

>>:  js zur Implementierung einer Interferenz mit Verifizierungscodes (statisch)

Artikel empfehlen

Implementierungsprozess von row_number in MySQL

1. Hintergrund Im Allgemeinen können wir in einer...

Vollständiges Beispiel einer Vue-Polling-Request-Lösung

Verständnis von Umfragen Tatsächlich liegt der Sc...

Mehrere Gründe, HTML nicht zu komprimieren

Der Grund ist einfach: In HTML-Dokumenten entsprec...

React+axios implementiert die Suchbenutzerfunktion von GitHub (Beispielcode)

laden Anforderung erfolgreich Anforderung fehlges...

In einem Artikel erfahren Sie, wie Sie ein Vue-Plugin schreiben

Inhaltsverzeichnis Was ist ein Plugin Plugins sch...

innodb_flush_method-Wertmethode (Beispielerklärung)

Mehrere typische Werte von innodb_flush_method fs...

3 Möglichkeiten zum Hinzufügen von Links zu HTML-Auswahl-Tags

Der Erste : Code kopieren Der Code lautet wie folg...

MySQL-Datenbanktabellendesign mit Baumstruktur

Inhaltsverzeichnis Vorwort 1. Basisdaten 2. Verer...

Beispiel für handschriftliches Vue2.0-Daten-Hijacking

Inhaltsverzeichnis 1: Webpack erstellen 2. Datend...

Zusammenfassung der Probleme bei der Speicherplatzfreigabe unter Linux

Die /Partitionsauslastung eines Servers im IDC is...

Methode und Optimierungsprinzip für langsame MySQL-Abfragen

1. Zum Vergleich der Datumsgröße muss das an XML ...