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:
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
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 über das Problem des vergessenen MySQL-Passworts und des Anmeldefehlers
>>: js zur Implementierung einer Interferenz mit Verifizierungscodes (statisch)
1. Hintergrund Im Allgemeinen können wir in einer...
Ich weiß nicht, ob Sie bemerkt haben, dass beim Ö...
Einige Optimierungsregeln für Browser-Webseiten S...
Verständnis von Umfragen Tatsächlich liegt der Sc...
Inhaltsverzeichnis Problemübersicht Reproduktion ...
Der Grund ist einfach: In HTML-Dokumenten entsprec...
Überblick Nginx kann Variablen verwenden, um die ...
laden Anforderung erfolgreich Anforderung fehlges...
Inhaltsverzeichnis Was ist ein Plugin Plugins sch...
Mehrere typische Werte von innodb_flush_method fs...
Der Erste : Code kopieren Der Code lautet wie folg...
Inhaltsverzeichnis Vorwort 1. Basisdaten 2. Verer...
Inhaltsverzeichnis 1: Webpack erstellen 2. Datend...
Die /Partitionsauslastung eines Servers im IDC is...
1. Zum Vergleich der Datumsgröße muss das an XML ...