Wie mache ich die Docker-API über TCP verfügbar?

Ich verwende Portainer und kann Remote-Endpunkte nicht verwalten. Ich habe versucht, über die Befehlszeile eine Verbindung zu Remote-Docker-Knoten herzustellen, habe aber eine Meldung erhalten Cannot connect to the Docker daemon at tcp://<remote_ip>:<port>. Is the docker daemon running?.

Ja, sie rennen. Ich habe mich der Docker-Gruppe hinzugefügt und kann auf Docker zugreifen, indem ich in die Knoten gehe. Ich kann jedoch nicht remote auf Docker-Knoten zugreifen.

Ich habe geändert /etc/default hinzufügen / Auskommentieren DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

Ich habe auch modifiziert /etc/init.d/docker und /etc/init/docker.conf enthalten DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock".

Ich habe den Docker-Dienst neu gestartet, mich dabei mehrmals abgemeldet und angemeldet, kann aber immer noch keine Verbindung zum Remote-Knoten herstellen. Ich kann nicht einmal eine Verbindung zum lokalen Knoten herstellen, indem ich die IP weitergebe.

Was habe ich verpasst? Welche Konfiguration in welcher Datei macht die API über TCP verfügbar?

user@hostname:~$ docker -H tcp://<REMOTE_IP>:2375 infoCannot connect to the Docker daemon at tcp://<REMOTE_IP>:2375. Is the docker daemon running?user@hostname:~$ docker -H tcp://127.0.0.1:2375 infoCannot connect to the Docker daemon at tcp://127.0.0.1:2375. Is the docker daemon running?user@hostname:~$ docker -H tcp://<LOCAL_IP>:2375 infoCannot connect to the Docker daemon at tcp://<LOCAL_IP>:2375. Is the docker daemon running?user@hostname:~$

Bearbeiten:Laufen ps aux | grep -i docker gibt dies zurück -

root      3581  0.1  0.2 596800 41540 ?        Ssl  04:17   0:35 /usr/bin/dockerd -H fd://root      3588  0.0  0.0 653576 14492 ?        Ssl  04:17   0:18 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc

Ich habe eine Lösung gefunden dank Beitrag von Ivan Krizsan.

Ich musste bearbeiten /lib/systemd/system/docker.service auf meinem Ubuntu 16.04.2 LTS-System, um die Zeile zu ändern

ExecStart=/usr/bin/docker daemon -H fd:// -H tcp://0.0.0.0:

dann

sudo systemctl daemon-reloadsudo systemctl restart docker.service

und alles hat geklappt :-). Der nächste Schritt besteht darin, herauszufinden, wie der Docker-Daemon vor der Entführung geschützt werden kann.

Das Verzeichnis /etc/default ist das Verzeichnis, in dem die Distributionsbetreuer ihre Konfigurationsdateien ablegen. Wenn Sie Docker direkt aus den Docker-Repositorys installieren, wird dieses Verzeichnis nicht verwendet.

Im Verzeichnis / lib / systemd installieren Pakete ihre Systemd-Dateien und überschreiben dort alle Änderungen beim Upgrade. Wenn Sie dies verwenden, gehen Ihre Änderungen verloren.

Um Ihre eigenen Änderungen an einer Systemd-Unit-Datei vorzunehmen, die bestehen bleibt, können Sie eine Unit-Datei in /etc/systemd/system/docker erstellen.Service.d /, zB hier ist mein Standard / etc / systemd / system / docker.Service.d/ überschreiben.konf:

[Service]ExecStart=ExecStart=/usr/bin/dockerd

Diese Überschreibung setzt einfach alle Befehlszeilenflaggen für den Dockerd-Dämon von systemd zurück. Sobald Sie fertig sind, können Sie jede Einstellung von /etc/docker / daemon überschreiben.json, das von Docker verwendet wird und je nach Einstellung neu geladen werden kann, ohne den Dämon neu zu starten. ZB hier ist ein Beispiel /etc/docker / daemon .json:

{"debug": false,"experimental": true,"hosts": ["fd://", "tcp://0.0.0.0:2376"],"labels": ["foo=bar", "fez=baz"],"log-driver": "json-file","log-opts": {"max-size": "10m", "max-file": "3"},"storage-driver": "overlay2","tlscacert": "/etc/docker/certs/ca.pem","tlscert": "/etc/docker/certs/host-cert.pem","tlskey": "/etc/docker/certs/host-key.pem","tlsverify": true}

Für Ihre Zwecke benötigen Sie nur die Zeile dort, um die Hosts festzulegen.

Ein äußerst wichtiger Teil der obigen Konfigurationsdatei sind die TLS-Einstellungen. Wenn Sie kein gegenseitiges TLS zwischen Client und Server konfigurieren und Docker zum Abhören des Netzwerks öffnen, führen Sie das Äquivalent eines offenen Telnet-Servers mit Root-Anmeldungen aus, die ohne Kennwort zulässig sind. Wenn Sie ssh gegenüber Telnet bevorzugen oder ein Kennwort für Ihr Root-Konto bevorzugen, müssen Sie TLS konfigurieren. Die Docker-API-Ports werden häufig im Internet gescannt, und Sie werden in kurzer Zeit Malware auf Ihrem Host installiert finden, wenn Sie diesen Konfigurationsschritt überspringen.

Ausführliche Informationen zum Konfigurieren der TLS-Schlüssel für Client und Server finden Sie unter:https://docs.docker.com/engine/security/https/


Beachten Sie, dass Sie mit Docker-Versionen 18.09 und höher auf dem Client (sowohl dort, wo Sie Ihren Befehl ausführen, als auch auf dem Remote-Knoten) ssh verwenden können, anstatt TLS zu konfigurieren. Dies beinhaltet die Verwendung eines DOCKER_HOST wert von ssh://user@host. Z.B.

docker -H ssh://user@host container ls

Es gibt eine offizielle Dokumentation, die beschreibt, wie Konfigurieren Sie, wo der Docker-Daemon auf Verbindungen wartet.

systemd gegen Daemon.json

Konfigurieren von Docker zum Abhören von Verbindungen mithilfe der Systemd-Unit-Datei und des Dämons.die JSON-Datei verursacht einen Konflikt, der den Start von Docker verhindert.

Konfigurieren des Remotezugriffs mit der Unit-Datei systemd

  1. Verwenden Sie den Befehl sudo systemctl edit docker.dienst zum Öffnen einer Überschreibungsdatei für Docker.dienst in einem Texteditor.

  2. Fügen Sie die folgenden Zeilen hinzu oder ändern Sie sie, indem Sie Ihre eigenen Werte ersetzen.

    [Service]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. Legen Sie das hosts-Array im / etc / docker / -Dämon fest.json zum Herstellen einer Verbindung zum UNIX-Socket und einer IP-Adresse wie folgt:

    {"hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"]}

    Konfigurieren von Docker zum Abhören von Verbindungen mithilfe der Systemd-Unit-Datei und des Dämons.die JSON-Datei verursacht einen Konflikt, der den Start von Docker verhindert.

    1. Fügen Sie die folgenden Zeilen hinzu oder ändern Sie sie, indem Sie Ihre eigenen Werte ersetzen.

      [Service]ExecStart=ExecStart=/usr/bin/dockerd
    2. Speichern Sie die Datei.

    3. Laden Sie die systemctl-Konfiguration neu.

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

  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

Der Docker-Client wird die DOCKER_HOST Umgebungsvariable zum Setzen der -H flagge für den Kunden. Verwenden Sie einen der folgenden Befehle:

$ docker -H tcp://127.0.0.1:2375 ps

oder

$ export DOCKER_HOST="tcp://127.0.0.1:2375"$ docker ps

Wenn Sie Ihren Docker-Daemon nicht neu konfigurieren und neu starten möchten, können Sie den Unix-Socket einfach mit einem TCP-Socket überbrücken ncat (aus dem nmap Paket):

ncat -lknvp 2375 -c "ncat -U /var/run/docker.sock"

Als Alternative können Sie verwenden socat oder andere Tools.

Für diejenigen, die diese Antwort im Kontext von Ubuntu Server 20.04 suchen, der verwendet SNAP:

Dieser Kommentar github Problem sollte Ihnen den Kontext geben, den Sie brauchen. In meinem Fall habe ich den Umgebungsvariablensatz $ SNAP_DATA nicht gefunden, also musste ich nach dem gesamten Dämon suchen.json-Dateien auf dem System und verwendete die mit der /var Präfix

$ sudo find / -name daemon.json

In meinem Fall hatte es zwei nicht verwandte Einträge, also habe ich gerade meine hinzugefügt:

{  [.....]  "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]}

Die obige IP bestimmt, von wo aus auf sie zugegriffen werden kann, und der Port kann der Port sein, den Sie verfügbar machen möchten. In meinem speziellen Fall konnte ich es nicht mit einer bestimmten IP zum Laufen bringen, stattdessen musste ich 0.0.0.0 verwenden, sonst würde es beim Neustart mit dem folgenden Fehler fehlschlagen:

aufs aufs_fill_super:918:mount[3724]: no argoverlayfs: missing 'lowerdir'aufs aufs_fill_super:918:mount[3772]: no argoverlayfs: missing 'lowerdir'aufs aufs_fill_super:918:mount[3820]: no argoverlayfs: missing 'lowerdir'

Seltsamerweise spuckt es bei Verwendung von 0.0.0.0 tatsächlich ein Paar der obigen Fehlerzeilen aus, aber es funktioniert danach. In meinem Fall, da dies eine VM ist, ist dies für mich akzeptabel.

Ich habe ähnliche Dinge ausprobiert und vermute, dass die Dateien /etc/default/docker, /etc/init/docker.conf und /etc/init.d / docker werden unter Ubuntu 16.04 bei einer Installation von docker-ce einfach ignoriert, kann das jemand bestätigen? Ich denke, wenn ich “service docker status” ausführe, passiert wirklich “systemctl status docker”, ein ganz anderes Verwaltungssystem.

Hört 2375 zu? 'ss -ntl`

Nein. Es hört nichts auf 2375. Und ich kann nicht herausfinden, welche Konfiguration in welcher Datei dies beeinflusst. Ich habe die Ausgabe von ps aux in meine Antwort aufgenommen, wenn das hilft.