Schritte nach der Installation für Linux
Geschätzte Lesezeit: 15 Minuten
Dieser Abschnitt enthält optionale Verfahren zum Konfigurieren von Linux-Hosts, die besser mit Docker funktionieren.
- Docker als Nicht-Root-Benutzer verwalten
- Docker so konfigurieren, dass es beim Booten startet
- Eine andere Speicher-Engine verwenden
- Standardprotokollierungstreiber konfigurieren
- Konfigurieren, wo der Docker-Daemon auf Verbindungen wartet
- Konfigurieren des Fernzugriffs mit der Systemd-Unit-Datei
- Konfigurieren des Fernzugriffs mit Daemon.json
- IPv6 auf dem Docker-Daemon aktivieren
- Fehlerbehebung
- Kernel-Kompatibilität
- Kann keine Verbindung zum Docker-Daemon herstellen
- IP-Weiterleitungsprobleme
- DNS-Resolver in resolv gefunden.conf und Container können es nicht verwenden
- DNS-Server für Docker angeben
- Deaktivieren Sie dnsmasq
- Ubuntu
- RHEL, CentOS oder Fedora
- Erlauben Sie den Zugriff auf die Remote-API über eine Firewall
- Ihr Kernel unterstützt keine Cgroup-Swap-Limit-Funktionen
Docker als Nicht-Root-Benutzer verwalten
Der Docker-Daemon bindet an einen Unix-Socket anstelle eines TCP-Ports. Standardmäßig gehört dieser Unix-Socket dem Benutzer root
und andere Benutzer können nur darauf zugreifen sudo
. Der Docker-Daemon wird immer als root
Benutzer ausgeführt.
Wenn Sie dem Befehl docker
nicht sudo
voranstellen möchten, erstellen Sie eine Unixgroup mit dem Namen docker
und fügen Sie Benutzer hinzu. Wenn der Docker-Daemon gestartet wird, erstellt er einen Unix-Socket, auf den Mitglieder der Gruppe docker
zugreifen können.
Warnung
Die
docker
Gruppe gewährt Privilegien, die demroot
Benutzer entsprechen. Einzelheiten dazu, wie sich dies auf die Sicherheit in Ihrem System auswirkt, finden Sie unter Unlocker Daemon Attack Surface.
Hinweis:
Um Docker ohne Root-Rechte auszuführen, müssen Sie den Docker-Daemon als Nicht-Root-Benutzer ausführen (Rootless-Modus).
Um die docker
Gruppe zu erstellen und Ihren Benutzer hinzuzufügen:
-
Erstellen Sie die
docker
Gruppe.$ sudo groupadd docker
-
Fügen Sie Ihren Benutzer zur
docker
Gruppe hinzu.$ sudo usermod -aG docker $USER
-
Melden Sie sich ab und wieder an, damit Ihre Gruppenmitgliedschaft neu bewertet wird.
Wenn Sie auf einer virtuellen Maschine testen, muss die virtuelle Maschine möglicherweise neu gestartet werden, damit die Änderungen wirksam werden.
Melden Sie sich in einer Desktop-Linux-Umgebung wie X Windows vollständig von Ihrer Sitzung ab und dann wieder an.
Unter Linux können Sie auch den folgenden Befehl ausführen, um die Änderungen an Gruppen zu aktivieren:
$ newgrp docker
-
Stellen Sie sicher, dass Sie
docker
Befehle ohnesudo
ausführen können.$ docker run hello-world
Dieser Befehl lädt ein Testabbild herunter und führt es in einem Container aus. Wenn thecontainer ausgeführt wird, wird eine Informationsmeldung gedruckt und beendet.
Wenn Sie anfänglich Docker CLI-Befehle mit
sudo
ausgeführt haben, bevor Sie Ihren Benutzer zurdocker
-Gruppe hinzugefügt haben, wird möglicherweise der folgende Fehler angezeigt, der darauf hinweist, dass Ihr~/.docker/
-Verzeichnis aufgrund dersudo
Befehle.WARNING: Error loading config file: /home/user/.docker/config.json -stat /home/user/.docker/config.json: permission denied
Um dieses Problem zu beheben, entfernen Sie entweder das
~/.docker/
Verzeichnis(es wird automatisch neu erstellt, aber alle benutzerdefinierten Einstellungen gehen verloren), oder ändern Sie den Besitz und die Berechtigungen mit den folgenden Befehlen:$ sudo chown "$USER":"$USER" /home/"$USER"/.docker -R$ sudo chmod g+rwx "$HOME/.docker" -R
Docker so konfigurieren, dass es beim Booten startet
Die meisten aktuellen Linux-Distributionen (RHEL, CentOS, Fedora, Debian, Ubuntu 16.04 und höher) verwenden systemd
, um zu verwalten, welche Dienste beim Systemstart gestartet werden. Unter Debian und Ubuntu ist der Docker-Dienst standardmäßig so konfiguriert, dass er beim Booten gestartet wird. Um Docker und Containerd beim Booten für otherdistros automatisch zu starten, verwenden Sie die folgenden Befehle:
$ sudo systemctl enable docker.service$ sudo systemctl enable containerd.service
Um dieses Verhalten zu deaktivieren, verwenden Sie stattdessen disable
.
$ sudo systemctl disable docker.service$ sudo systemctl disable containerd.service
Wenn Sie einen HTTP-Proxy hinzufügen, ein anderes Verzeichnis oder eine andere Partition für die Docker-Laufzeitdateien festlegen oder andere Anpassungen vornehmen müssen, siehe systemd Docker-Daemon-Optionen anpassen.
Eine andere Speicher-Engine verwenden
Informationen zu den verschiedenen Speicher-Engines finden Sie Unterspeichertreiber.Die Standard-Speicher-Engine und die Liste der unterstützten Speicher-Engines hängen von der Linux-Distribution Ihres Hosts und den verfügbaren Kerneltreibern ab.
Standardprotokollierungstreiber konfigurieren
Docker bietet die Möglichkeit, Protokolldaten von allen Containern, die auf einem Host ausgeführt werden, über eine Reihe von Protokollierungstreibern zu sammeln und anzuzeigen. Der Standardprotokollierungstreiber json-file
schreibt Protokolldaten in Json-formatierte Dateien auf dem Host-Dateisystem. Im Laufe der Zeit erweitern sich diese Protokolldateien in der Größe, was zu einer möglichen Erschöpfung der Festplattenressourcen führt.
Um solche Probleme zu beheben, konfigurieren Sie entweder den json-file
Protokollierungstreiber, um die Protokollrotation zu aktivieren, verwenden Sie einen alternativen Protokollierungstreiberwie der „lokale“ Protokollierungstreiber, der standardmäßig die Protokollrotation ausführt, oder verwenden Sie einen Protokollierungstreiber, der Protokolle an einen Remote-Protokollierungsaggregator sendet.
Konfigurieren, wo der Docker-Daemon auf Verbindungen wartet
Standardmäßig wartet der Docker-Daemon auf Verbindungen auf einem UNIX-Socket, um Anfragen von lokalen Clients zu akzeptieren. Es ist möglich, Docker zu erlauben, Anforderungen von Remote-Hosts zu akzeptieren, indem es so konfiguriert wird, dass es eine IP-Adresse und einen Port sowie den UNIX-Socket überwacht. Weitere Informationen zu dieser Konfigurationsoption finden Sie im Abschnitt „Docker an einen anderen Host / Port oder einen Unix-Socket binden“ des Docker CLI-Referenzartikels.
Sichern Sie Ihre Verbindung
Bevor Sie Docker so konfigurieren, dass es Verbindungen von Remote-Hosts akzeptiert, ist es äußerst wichtig, dass Sie die Sicherheitsauswirkungen des Öffnens von Docker für das Netzwerk verstehen. Wenn keine Schritte zum Sichern der Verbindung unternommen werden, können Nicht-Root-Remotebenutzer Root-Zugriff auf den Host erhalten. Weitere Informationen zur Verwendung von TLS-Zertifikaten zum Sichern dieser Verbindung finden Sie in diesem Artikel zum Schutz des Docker-Daemon-Sockets.
Die Konfiguration von Docker für die Annahme von Remoteverbindungen kann mit der docker.service
systemd-Unit-Datei für Linux-Distributionen erfolgen, die systemd verwenden, z. B. die neuesten Versionenvon RedHat, CentOS, Ubuntu und SLES, oder mit der daemon.json
Datei, die für Linux-Distributionen empfohlen wird, die systemd.
systemd gegen Dämon.json
Das Konfigurieren von Docker zum Abhören von Verbindungen mithilfe der Unit-Datei
systemd
und der Dateidaemon.json
führt zu einem Konflikt, der das Starten von Docker verhindert.
Konfigurieren des Fernzugriffs mit der Systemd-Unit-Datei
-
Verwenden Sie den Befehl
sudo systemctl edit docker.service
, um eine Überschreibungsdatei fürdocker.service
in einem Texteditor zu öffnen. -
Fügen Sie die folgenden Zeilen hinzu oder ändern Sie sie, indem Sie Ihre eigenen Werte ersetzen.
ExecStart=ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
-
Speichern Sie die Datei.
-
Laden Sie die
systemctl
Konfiguration neu.$ sudo systemctl daemon-reload
-
Starten Sie Docker neu.
$ sudo systemctl restart docker.service
-
Überprüfen Sie, ob die Änderung berücksichtigt wurde, indem Sie die Ausgabe von
netstat
überprüfen, um zu bestätigen, dassdockerd
den konfigurierten Port überwacht.$ sudo netstat -lntp | grep dockerdtcp 0 0 127.0.0.1:2375 0.0.0.0:* LISTEN 3758/dockerd
Konfigurieren des Fernzugriffs mit Daemon.json
-
Stellen Sie das Array
hosts
in das Array/etc/docker/daemon.json
ein, um eine Verbindung zum UNIX-Socket und einer IP-Adresse herzustellen, wie folgt:{ "hosts": }
-
Überprüfen Sie, ob die Änderung berücksichtigt wurde, indem Sie die Ausgabe von
netstat
überprüfen, um zu bestätigen, dassdockerd
den konfigurierten Port überwacht.$ sudo netstat -lntp | grep dockerdtcp 0 0 127.0.0.1:2375 0.0.0.0:* LISTEN 3758/dockerd
ocker.
IPv6 auf dem Docker-Daemon aktivieren
Um IPv6 auf dem Docker-Daemon zu aktivieren, siehe IPv6-Unterstützung aktivieren.
Fehlerbehebung
Kernel-Kompatibilität
Docker kann nicht korrekt ausgeführt werden, wenn Ihr Kernel älter als Version 3.10 ist oder wenn einige Module fehlen. Um die Kernel-Kompatibilität zu überprüfen, können Sie das check-config.sh
-Skript herunterladen und ausführen.
$ curl https://raw.githubusercontent.com/docker/docker/master/contrib/check-config.sh > check-config.sh$ bash ./check-config.sh
Das Skript funktioniert nur unter Linux, nicht unter macOS.
Kann keine Verbindung zum Docker-Daemon herstellen
Wenn Sie einen Fehler wie den folgenden sehen, ist Ihr Docker-Client möglicherweise so konfiguriert, dass er eine Verbindung zu einem Docker-Daemon auf einem anderen Host herstellt, und dieser Host ist möglicherweise nicht erreichbar.
Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?
Überprüfen Sie den Wert der Variablen DOCKER_HOST
in Ihrer Umgebung, um zu sehen, mit welchem Host Ihr Client für die Verbindung konfiguriert ist.
$ env | grep DOCKER_HOST
Wenn dieser Befehl einen Wert zurückgibt, stellt der Docker-Client eine Verbindung zum aDocker-Daemon her, der auf diesem Host ausgeführt wird. Wenn es nicht gesetzt ist, wird der Docker-Client so eingestellt, dass er eine Verbindung zum Docker-Daemon herstellt, der auf dem lokalen Host ausgeführt wird. Wenn es fehlerhaft eingestellt ist, verwenden Sie den folgenden Befehl, um es zu deaktivieren:
$ unset DOCKER_HOST
Möglicherweise müssen Sie Ihre Umgebung in Dateien wie ~/.bashrc
oder~/.profile
bearbeiten, um die DOCKER_HOST
Variable von setterroneously.
Wenn DOCKER_HOST
wie vorgesehen eingestellt ist, stellen Sie sicher, dass der Docker-Daemon auf dem Remote-Host ausgeführt wird und dass eine Firewall oder ein Netzwerkausfall Sie nicht daran hindert, eine Verbindung herzustellen.
IP-Weiterleitungsprobleme
Wenn Sie Ihr Netzwerk manuell mit systemd-network
mit systemd
Version 219 oder höher konfigurieren, können Docker-Container möglicherweise nicht auf Ihr Netzwerk zugreifen.Ab systemd
Version 220 ist die Weiterleitungseinstellung für ein bestimmtes Netzwerk (net.ipv4.conf.<interface>.forwarding
) standardmäßig deaktiviert. Diese Einstellung verhindert die IP-Weiterleitung. Es steht auch in Konflikt mit dem Verhalten von Docker, die Einstellung net.ipv4.conf.all.forwarding
in Containern zu aktivieren.
Um dies auf RHEL, CentOS oder Fedora zu umgehen, bearbeiten Sie die <interface>.network
-Datei in /usr/lib/systemd/network/
auf Ihrem Docker-Host(ex: /usr/lib/systemd/network/80-container-host0.network
) und fügen Sie den folgenden Block innerhalb der abschnitt.
...IPForward=kernel# ORIPForward=true
Diese Konfiguration ermöglicht die IP-Weiterleitung aus dem Container wie erwartet.
DNS-Resolver in resolv gefunden.conf und Container können es nicht verwenden
Linux-Systeme, die eine GUI verwenden, haben oft einen Netzwerkmanager, der einednsmasq
Instanz verwendet, die auf einer Loopback-Adresse wie 127.0.0.1
oder127.0.1.1
ausgeführt wird, um DNS-Anforderungen zwischenzuspeichern, und fügt diesen Eintrag zu/etc/resolv.conf
. Der Dienst dnsmasq
beschleunigt die upDNS-Suche und stellt auch DHCP-Dienste bereit. Diese Konfiguration funktioniert nicht in einem Docker-Container, der über einen eigenen Netzwerknamespace verfügt, da der Docker-Container Loopback-Adressen wie 127.0.0.1
in sich selbst auflöst und es sehr unwahrscheinlich ist, dass ein DNS-Server auf einer eigenen Loopback-Adresse ausgeführt wird.
Wenn Docker feststellt, dass kein DNS-Server, auf den in /etc/resolv.conf
verwiesen wird, ein voll funktionsfähiger DNS-Server ist, tritt die folgende Warnung auf und Docker verwendet die von Google bereitgestellten öffentlichen DNS-Server unter 8.8.8.8
und 8.8.4.4
für die DNS-Auflösung.
WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containerscan't use it. Using default external servers :
Wenn Sie diese Warnung sehen, überprüfen Sie zuerst, ob Sie dnsmasq
verwenden:
$ ps aux |grep dnsmasq
Wenn Ihr Container Hosts auflösen muss, die intern in Ihrem Netzwerk sind, thepublic Nameserver sind nicht ausreichend. Sie haben zwei Möglichkeiten:
- Sie können einen DNS-Server angeben, den Docker verwenden soll, oder
- Sie können
dnsmasq
in NetworkManager deaktivieren. Wenn Sie dies tun, fügt NetworkManager Ihren wahren DNS-Nameserver zu/etc/resolv.conf
hinzu, aber Sie verlieren die möglichen Vorteile vondnsmasq
.
Sie müssen nur eine dieser Methoden verwenden.
DNS-Server für Docker angeben
Der Standardspeicherort der Konfigurationsdatei ist /etc/docker/daemon.json
. Sie können den Speicherort der Konfigurationsdatei mit dem --config-file
Daemon-Flag ändern. In der folgenden Dokumentation wird davon ausgegangen, dass sich die Konfigurationsdatei unter /etc/docker/daemon.json
befindet.
-
Erstellen oder bearbeiten Sie die Konfigurationsdatei des Docker-Daemons, die standardmäßig die Datei
/etc/docker/daemon.json
enthält, die die Konfiguration des Docker-Daemons steuert.$ sudo nano /etc/docker/daemon.json
-
Fügen Sie einen
dns
Schlüssel mit einer oder mehreren IP-Adressen als Werte hinzu. Wenn die Datei vorhanden ist, müssen Sie nur die Zeiledns
hinzufügen oder bearbeiten.{ "dns": }
Wenn Ihr interner DNS-Server keine öffentlichen IP-Adressen auflösen kann, fügen Sie mindestens einen DNS-Server hinzu, der dies kann, damit Sie eine Verbindung zum Docker Hub herstellen können und Ihre Container Internet-Domainnamen auflösen können.
Speichern und schließen Sie die Datei.
-
Starten Sie den Docker-Daemon neu.
$ sudo service docker restart
-
Stellen Sie sicher, dass Docker externe IP-Adressen auflösen kann, indem Sie versuchen, animage abzurufen:
$ docker pull hello-world
-
Stellen Sie bei Bedarf sicher, dass Docker-Container einen internen Hostnamen auflösen können, indem Sie ihn anpingen.
$ docker run --rm -it alpine ping -c4 <my_internal_host>PING google.com (192.168.1.2): 56 data bytes64 bytes from 192.168.1.2: seq=0 ttl=41 time=7.597 ms64 bytes from 192.168.1.2: seq=1 ttl=41 time=7.635 ms64 bytes from 192.168.1.2: seq=2 ttl=41 time=7.660 ms64 bytes from 192.168.1.2: seq=3 ttl=41 time=7.677 ms
Deaktivieren Sie dnsmasq
Ubuntu
Wenn Sie die Konfiguration des Docker-Daemons nicht ändern möchten, um eine bestimmte IP-Adresse zu verwenden, befolgen Sie diese Anweisungen, um dnsmasq
im Netzwerkmanager.
-
Bearbeiten Sie die
/etc/NetworkManager/NetworkManager.conf
-Datei. -
Kommentieren Sie die Zeile
dns=dnsmasq
aus, indem Sie am Anfang der Zeile ein#
-Zeichen hinzufügen.# dns=dnsmasq
Speichern und schließen Sie die Datei.
-
Starten Sie NetworkManager und Docker neu. Als Alternative können Sie neu startenihr System.
$ sudo restart network-manager$ sudo restart docker
RHEL, CentOS oder Fedora
Um dnsmasq
auf RHEL, CentOS oder Fedora zu deaktivieren:
-
Deaktivieren Sie die
dnsmasq
Bedienung:$ sudo service dnsmasq stop$ sudo systemctl disable dnsmasq
-
Konfigurieren Sie die DNS-Server manuell mithilfe der Red Hat-Dokumentation.
Erlauben Sie den Zugriff auf die Remote-API über eine Firewall
Wenn Sie eine Firewall auf demselben Host wie Docker ausführen und von einem anderen Host aus auf die Docker-Remote-API zugreifen möchten und der Remotezugriff aktiviert ist, müssen SieKonfigurieren Sie Ihre Firewall so, dass eingehende Verbindungen über den Docker-Port zugelassen werden, der standardmäßig 2376
2375
andernfalls.
Zwei gängige Firewall-Daemons sind UFW (Unkomplizierte Firewall) (oft für Ubuntu-Systeme verwendet) und firewalld (oft für RPM-basierte Systeme verwendet). Konsultieren Sie die Dokumentation für Ihr Betriebssystem und Ihre Firewall, aber die folgenden Informationen können Ihnen den Einstieg erleichtern. Diese Optionen sind fairlypermissive und Sie können eine andere Konfiguration verwenden möchten, die yoursystem mehr sperrt.
-
UFW: Setzen Sie
DEFAULT_FORWARD_POLICY="ACCEPT"
in Ihrer Konfiguration. -
firewalld: Fügen Sie Ihrer Richtlinie ähnliche Regeln hinzu (eine für eingehende Anforderungen und eine für ausgehende Anforderungen). Stellen Sie sicher, dass die Schnittstellennamen und Kettennamen korrekt sind.
<direct> </direct>
Ihr Kernel unterstützt keine Cgroup-Swap-Limit-Funktionen
Auf Ubuntu- oder Debian-Hosts werden möglicherweise Meldungen angezeigt, die der folgenden ähneln, wenn Sie mit einem Image arbeiten.
WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.
Diese Warnung tritt nicht auf RPM-basierten Systemen auf, die thesecapabilities standardmäßig aktivieren.
Wenn Sie diese Funktionen nicht benötigen, können Sie die Warnung ignorieren. Sie können diese Funktionen unter Ubuntu oder Debian aktivieren, indem Sie diese Anweisungen befolgen. Speicher- und Swap-Konten verursachen einen Overhead von etwa 1% des insgesamt verfügbaren Speichers und eine Leistungseinbuße von insgesamt 10%, selbst wenn Docker nicht ausgeführt wird.
-
Melden Sie sich als Benutzer mit
sudo
-Rechten beim Ubuntu- oder Debian-Host an. -
Bearbeiten Sie die
/etc/default/grub
-Datei. Fügen Sie die ZeileGRUB_CMDLINE_LINUX
hinzu oder bearbeiten Sie sie, um die folgenden zwei Schlüssel-Wert-Paare hinzuzufügen:GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
Speichern und schließen Sie die Datei.
-
GRUB aktualisieren.
$ sudo update-grub
Wenn Ihre GRUB-Konfigurationsdatei eine falsche Syntax hat, wird ein Fehler angezeigt occurs.In wiederholen Sie in diesem Fall die Schritte 2 und 3.
Die Änderungen werden wirksam, wenn das System neu gestartet wird.
- In den Schulungsmodulen Erste Schritte erfahren Sie, wie Sie ein Image erstellen und als containerisierte Anwendung ausführen.
- Lesen Sie die Themen in Mit Docker entwickeln, um zu erfahren, wie Sie mit Docker neue Anwendungen erstellen.
Docker, Docker Dokumentation, Anforderungen, apt, Installation, ubuntu, installieren, deinstallieren, Upgrade, Update