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

13

Ich verwende portainer und kann keine Remote-Endpunkte verwalten. Ich habe versucht, über die Befehlszeile eine Verbindung zu Remote-Docker-Knoten herzustellen, habe jedoch eine Nachricht 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 über SSH auf die Knoten zugreifen. Ich kann jedoch nicht remote auf Docker-Knoten zugreifen.

Ich habe /etc/defaultdas Hinzufügen / Entfernen von Kommentaren geändertDOCKER_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 veränderte auch /etc/init.d/dockerund /etc/init/docker.confeinschließen 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 info
Cannot 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 info
Cannot 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 info
Cannot connect to the Docker daemon at tcp://<LOCAL_IP>:2375. Is the docker daemon running?
user@hostname:~$

Edit: Running ps aux | grep -i dockergibt 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
Lord Loh.
quelle
Hört 2375 zu? ss -ntl
Jscott
Nein, auf 2375 ist nichts zu hören. Und ich kann nicht herausfinden, welche Konfiguration in welcher Datei dies beeinflusst. Ich habe die Ausgabe von ps auxin meine Antwort aufgenommen, wenn das hilft.
Lord Loh.
Ich habe ähnliche Dinge ausprobiert und vermutet, dass die Dateien / etc / default / docker, /etc/init/docker.conf und /etc/init.d/docker unter Ubuntu 16.04 mit einer Installation von docker-ce einfach ignoriert werden ? Ich denke, wenn ich "service docker status" starte, passiert wirklich "systemctl status docker", ein ganz anderes Managementsystem.
Chrisinmtown

Antworten:

21

Dank Ivan Krizsans Post habe ich eine Lösung gefunden .

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

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

dann

sudo systemctl daemon-reload
sudo systemctl restart docker.service

und alles hat geklappt :-). Der nächste Schritt besteht darin, herauszufinden, wie das entführte Docker-Daemon-Formular geschützt werden kann.

Lord Loh.
quelle
1
Ich bestätige, dass diese Änderung bewirkt, dass der Dockerd unter Ubuntu 16.04 mit docker-ce ver 17.06 auf HTTP-Anfragen wartet. Es fühlt sich einfach falsch an, das Dienstskript direkt zu ändern.
Chrisinmtown
7
Bearbeiten Sie niemals das Docker-Dienstskript (oder ein anderes Dienstskript) direkt. In SystemD ist eine differenzielle Bearbeitungsfunktion integriert. Use systemctl edit docker.serviceund systemctl erstellen eine neue Datei mit Ihren Bearbeitungen. Dies verhindert, dass ein Update Ihre Änderungen löscht. SystemD führt die beiden Dateien zur Laufzeit zusammen. Gutes Dokument hier: digitalocean.com/community/tutorials/…
Routhinator
Vielen Dank! Das ist furchtbar nützlich. Ich bekomme immer wieder Warnungen bei Updates. Ich werde das untersuchen: _)
Lord Loh.
4
Auf Ubuntu Server 18.04 hat es so funktioniert:ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:4243
LUCIAN ALEXA
Wenn ich die -H tcp://Einstellung alleine verwende, -H fd://kann ich ohne die Einstellung keine Client-Befehle ausgeben, z. B. .., Docker-Informationen, Docker-Version usw.
Chris F
2

Im Verzeichnis / etc / default legen die Distributionsbetreuer ihre Konfigurationsdateien ab. Wenn Sie Docker direkt aus den Docker-Repositorys installieren, wird dieses Verzeichnis nicht verwendet.

Im Verzeichnis / lib / systemd installieren die 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.service.d/ erstellen, z. B. hier ist meine Standard-Unit /etc/systemd/system/docker.service. d / override.conf:

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

Durch diese Überschreibung werden einfach alle Befehlszeilen-Flags von systemd an den Dockerd-Daemon zurückgesetzt. Danach können Sie jede Einstellung aus /etc/docker/daemon.json überschreiben, die von docker verwendet wird. Abhängig von der Einstellung können Sie die Einstellungen erneut laden, 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 Leitung, 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 öffnen, um das Netzwerk zu überwachen, 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 auf Ihrem Host wird in kurzer Zeit Malware installiert, 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/

BMitch
quelle
1
Eine sehr gute Antwort, die zukünftige Updates des Docker-Dienstes überstehen wird. Das ist der richtige Weg.
Fopedush
2

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

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

Alternativ können Sie socat oder andere Tools verwenden .

eadmaster
quelle
tolle! Kann ich diesen Befehl im Hintergrund ausführen? Wenn ich schließe, ist meine Terminal-Verbindung verloren
Felix
ah, ich fand nohupund&
Felix
0

Es gibt eine offizielle Dokumentation, in der beschrieben wird, wie Sie konfigurieren, wo der Docker-Dämon auf Verbindungen wartet .

systemd vs daemon.json

Wenn Docker so konfiguriert wird, dass sowohl die systemd unit-Datei als auch die daemon.json-Datei auf Verbindungen überwacht werden, wird ein Konflikt verursacht, der das Starten von Docker verhindert.

Konfigurieren des Fernzugriffs mit der System-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.

    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
    
  3. Speicher 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 sicherzustellen, dass dockerd den konfigurierten Port überwacht.

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

Fernzugriff konfigurieren mit daemon.json

  1. Legen Sie das Host-Array in der Datei /etc/docker/daemon.json wie folgt fest, um eine Verbindung mit dem UNIX-Socket und einer IP-Adresse herzustellen:

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

    Wenn Docker so konfiguriert wird, dass sowohl die systemd unit-Datei als auch die daemon.json-Datei auf Verbindungen überwacht werden, wird ein Konflikt verursacht, der das Starten 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. Speicher 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 sicherzustellen, dass dockerd den konfigurierten Port überwacht.

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

Der Docker-Client berücksichtigt die DOCKER_HOSTUmgebungsvariable, um das -HFlag für den Client zu setzen. 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
ROY
quelle