Articles

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

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 dem rootBenutzer 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:

  1. Erstellen Sie die docker Gruppe.

    $ sudo groupadd docker
  2. Fügen Sie Ihren Benutzer zur docker Gruppe hinzu.

    $ sudo usermod -aG docker $USER
  3. 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 
  4. Stellen Sie sicher, dass Sie docker Befehle ohne sudo 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 zur docker -Gruppe hinzugefügt haben, wird möglicherweise der folgende Fehler angezeigt, der darauf hinweist, dass Ihr ~/.docker/ -Verzeichnis aufgrund der sudo 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.servicesystemd-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 Datei daemon.json führt zu einem Konflikt, der das Starten von Docker verhindert.

Konfigurieren des Fernzugriffs mit der Systemd-Unit-Datei

  1. Verwenden Sie den Befehl sudo systemctl edit docker.service, um eine Überschreibungsdatei für docker.service in einem Texteditor zu öffnen.

  2. 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
  3. Speichern Sie die Datei.

  4. Laden Sie die systemctl Konfiguration neu.

     $ sudo systemctl daemon-reload
  5. Starten Sie Docker neu.

    $ sudo systemctl restart docker.service
  6. Überprüfen Sie, ob die Änderung berücksichtigt wurde, indem Sie die Ausgabe von netstat überprüfen, um zu bestätigen, dass dockerd 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

  1. 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": }
  2. ocker.

  3. Überprüfen Sie, ob die Änderung berücksichtigt wurde, indem Sie die Ausgabe von netstat überprüfen, um zu bestätigen, dass dockerd den konfigurierten Port überwacht.

    $ sudo netstat -lntp | grep dockerdtcp 0 0 127.0.0.1:2375 0.0.0.0:* LISTEN 3758/dockerd

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 systemdVersion 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 von dnsmasq .

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-fileDaemon-Flag ändern. In der folgenden Dokumentation wird davon ausgegangen, dass sich die Konfigurationsdatei unter /etc/docker/daemon.json befindet.

  1. 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
  2. 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 Zeile dns 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.

  3. Starten Sie den Docker-Daemon neu.

    $ sudo service docker restart
  4. Stellen Sie sicher, dass Docker externe IP-Adressen auflösen kann, indem Sie versuchen, animage abzurufen:

    $ docker pull hello-world
  5. 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.

  1. Bearbeiten Sie die /etc/NetworkManager/NetworkManager.conf-Datei.

  2. 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.

  3. 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:

  1. Deaktivieren Sie die dnsmasq Bedienung:

    $ sudo service dnsmasq stop$ sudo systemctl disable dnsmasq
  2. 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 23762375andernfalls.

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.

  1. Melden Sie sich als Benutzer mit sudo -Rechten beim Ubuntu- oder Debian-Host an.

  2. Bearbeiten Sie die /etc/default/grub-Datei. Fügen Sie die Zeile GRUB_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.

  3. 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