webentwicklung-frage-antwort-db.com.de

`docker run` auf einem entfernten Host

ist es möglich (mit dem docker-Befehl oder der docker-py-API direkt), einen Container von einem fernen Host aus zu starten?

Nehmen wir an, ich habe zwei Maschinen mit unterschiedlichen Architekturen: - A ist eine x86-Maschine - B ist eine ARM-Maschine

Ich möchte einen Container auf der B-Maschine mit meiner A-Maschine ausführen. Zuerst dachte ich, es wäre möglich, diesen Befehl zu verwenden:

[A]$> DOCKER_Host=$MACHINE_B_IP:$MACHIN_B_PORT docker run hello-from-B

Dieser Befehl ruft jedoch tatsächlich das Bild hello-from-B ab und versucht, es auf dem Computer A auszuführen. Dies führt zu einem exec format error, da Sie offensichtlich keine für ARM spezifischen Bilder auf einem x86-Computer ausführen können.

Die Kommunikation zwischen Maschine A und B funktioniert gut. Ich kann Befehle wie images oder ps ausführen und gibt mir die erwarteten Ergebnisse:

[A]$> DOCKER_Host=$MACHINE_B_IP:$MACHIN_B_PORT docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
hello-from-B              <none>              fd5059044831        13 hours ago        1.26GB

Ich habe von docker-machine gehört und habe es noch nicht ausprobiert, aber meines Wissens wird das mein Problem nicht lösen.

Gibt es eine Möglichkeit, dies direkt mit docker zu erreichen? Eine Problemumgehung könnte darin bestehen, ssh zu verwenden, um eine Verbindung zum Remote-Host herzustellen und den docker-Client direkt vom Remote-Host aus zu verwenden. Ich möchte diese Lösung jedoch so weit wie möglich vermeiden.

Danke im Voraus,


TL; DR;

Wie kann DOCKER_Host=... docker run somethingsomething auf dem DOCKER_Host ausgeführt werden und nicht auf meinem lokalen Computer.

11
ccharly

wenn Ihre Zielmaschine B auf einer von dieser Plattform erstellt werden könnte, würde die Docker-Maschine Ihren Anforderungen entsprechen. Sie erstellen Ihre Maschine mit docker-machine create --driver <..driver setup..> MACHINE_B und aktivieren sie dann mit eval $(docker-machine env MACHINE_B). docker-machine env MACHINE_B Gibt einige Exportanweisungen aus:

export DOCKER_TLS_VERIFY="1"
export DOCKER_Host="tcp://...."
export DOCKER_CERT_PATH="/..."
export DOCKER_MACHINE_NAME="MACHINE_B"

sobald Ihr Computer aktiv ist, können Sie den Befehl docker wie vor Ort verwenden, um auf MACHINE_B remote zu reagieren.

6
ShabbY

Prüfen Sie, ob der neueste Docker 18.09 diese Funktion enthält.
Siehe docker/cli PR 1014

Unterstützung für SSH-Verbindung hinzugefügt. z.B. docker -H ssh://[email protected]

  • Das cli sollte ssh://[email protected] für DOCKER_Host und -H akzeptieren. Dies würde ssh mit der übergebenen config ausführen.
  • Der Befehl ssh ruft einen versteckten Befehl in der binären CLI-Binärdatei der Remote-Seite auf. Zum Beispiel Docker Dial-Stdio.

Dieser Befehl stellt eine Verbindung zur lokalen DOCKER_Host-Variablen her (fast immer das lokale Standard-Socket) und leitet diese Verbindung mit den Befehlen stdio weiter.
Obwohl dieser Befehl lokal für die dockerd-Binärdatei ausgeführt werden soll, ist es unserer Meinung nach eine ungültige Konfiguration für diese Funktion, die lokale docker-Binärdatei zu entfernen, sodass wir uns darauf verlassen können, dass sie immer vorhanden ist.

Wie kann ich das überprüfen?

docker -H ssh://[email protected] run -it --rm busybox

Die bisherige Reaktion:

Wir bedanken uns bei Ihnen von Ops und Sysadmins für dieses fantastische und unerwartete Feature.
Ich hoffe, dass dies die Anzahl der Male, die ich dockerd TCP ohne TLS öffne, erheblich verringert, und dass Sie sich für SSH-Endpunkte für Remote-mgmt entscheiden. 

7
VonC

Dieser Artikel erklärt das Konzept sehr gut: https://docs.docker.com/engine/reference/commandline/dockerd/#bind-docker-to-another-hostport-or-a-unix-socket

In Anbetracht der großen Warnung auf der Seite empfehle ich, eine sichere Verbindung über SSH zu verwenden, dh. ssh [email protected] 'docker run hello-from-B'

Warnung: Wenn Sie die standardmäßige Docker-Daemon-Bindung in einen TCP - Port oder eine Unix-Docker-Benutzergruppe ändern, erhöht sich Ihr Sicherheitsrisiko um Benutzer ohne Rootberechtigung können Root-Zugriff auf den Host erhalten. Stell sicher, dass du Kontrollieren Sie den Zugang zum Docker. Wenn Sie an einen TCP - Port gebunden sind, können alle mit Zugriff auf diesen Port hat vollen Docker-Zugriff; so ist es nicht empfehlenswert in einem offenen Netzwerk.


Mit -H ist es möglich, den Docker-Dämon auf eine .__ zu hören. spezifische IP und Port. Standardmäßig hört es auf unix:///var/run/docker.sock, um nur lokale Verbindungen über die .__ zuzulassen. root-Benutzer Sie können es auf 0.0.0.0:2375 oder eine bestimmte Host-IP auf .__ setzen. gib allen Zugang, aber das wird nicht empfohlen, weil dann ist trivial für jemanden, der root-Zugriff auf den Host erhält, auf dem die Daemon läuft.

In ähnlicher Weise kann der Docker-Client -H verwenden, um eine Verbindung zu einem benutzerdefinierten Port herzustellen. Der Docker-Client stellt standardmäßig eine Verbindung zu .__ her. unix:///var/run/docker.sock unter Linux und tcp://127.0.0.1:2376 unter Windows.

-H akzeptiert die Host- und Portzuweisung im folgenden Format:

tcp://[Host]:[port][path] or unix://path


Sie können beispielsweise mehrere -H verwenden, wenn Sie beide hören möchten TCP und einen Unix-Socket

# Run docker in daemon mode
$ Sudo <path to>/dockerd -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock &
# Download an ubuntu image, use default Unix socket
$ docker pull ubuntu
# OR use the TCP port
$ docker -H tcp://127.0.0.1:2375 pull ubuntu
4
yosefrow

Wie Sie sagten, die Konnektivität ist zwischen den Servern verfügbar, können Sie Docker-Rich-APIs verwenden.

Es gibt zwei Möglichkeiten, den Docker-Daemon-Port zu konfigurieren

1) Konfiguration unter / etc/default/docker-Datei:

DOCKER_OPTS="-H tcp://127.0.0.1:5000 -H unix:///var/run/docker.sock"

2) Konfigurieren unter /etc/docker/daemon.json:

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

Weitere Informationen zum Konfigurieren des Docker-Daemon-Ports finden Sie unter SIEHE CONFIGURE-DOCKER-DAEMON-PORT.

Sobald die Docker-Ports konfiguriert sind, können Sie auf die Docker-APIs im Remote-Host zugreifen.

JSON-Eingabedatei:

#cat container_create.json 
{
  "AttachStdin": true,
  "AttachStdout": true,
  "AttachStderr": true,
  "ExposedPorts": {
    "property1": {},
    "property2": {}
  },
  "Tty": true,
  "OpenStdin": true,
  "StdinOnce": true,
  "Cmd": null,
  "Image": "ubuntu:14.04",
  "Volumes": {
    "additionalProperties": {}
  },
  "Labels": {
    "property1": "string",
    "property2": "string"
  }
}

API zum Erstellen eines Containers:

curl -X POST http://192.168.56.101:6000/containers/create -d @container_create.json --header "Content-Type: application/json" | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   602  100    90  100   512   1737   9883 --:--:-- --:--:-- --:--:-- 10039
{
  "Warnings": null,
  "Id": "f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940"
}

Die generierte ID ist die Container-ID und der Status wird nicht aktiv/ausgeführt.

API zum Starten des erstellten Containers.

# curl -X POST http://192.168.56.101:6000/containers/f5d3273e48350/start | jq .  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

API zum Überprüfen des Status/Überprüfen des Containers:

# curl -X GET http://192.168.56.101:6000/containers/f5d3273e48350/json | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  4076    0  4076    0     0   278k      0 --:--:-- --:--:-- --:--:--  306k
{
  "NetworkSettings": {
    "Networks": {
      "bridge": {
        "MacAddress": "02:42:ac:11:00:03",
        "GlobalIPv6PrefixLen": 0,
        "GlobalIPv6Address": "",
        "IPv6Gateway": "",
        "IPAMConfig": null,
        "Links": null,
        "Aliases": null,
        "NetworkID": "689d6b65ce1b06c93b2c70f41760a3e7fb2b50697d71cd9c1f39c64c865e5fa6",
        "EndpointID": "76bf1f8638d1ff0387e6c3fe89e8ccab1670c709ad550f9acc6f46e559654bee",
        "Gateway": "172.17.0.1",
        "IPAddress": "172.17.0.3",
        "IPPrefixLen": 16
      }
    },
    "MacAddress": "02:42:ac:11:00:03",
    "SecondaryIPAddresses": null,
    "SandboxKey": "/var/run/docker/netns/24a031d9dfda",
    "Ports": {
      "0/tcp": null
    },
    "LinkLocalIPv6PrefixLen": 0,
    "LinkLocalIPv6Address": "",
    "HairpinMode": false,
    "SandboxID": "24a031d9dfda70026a875f4841269c5e790b12ccafcc11869111faa240020b99",
    "Bridge": "",
    "SecondaryIPv6Addresses": null,
    "EndpointID": "76bf1f8638d1ff0387e6c3fe89e8ccab1670c709ad550f9acc6f46e559654bee",
    "Gateway": "172.17.0.1",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "IPAddress": "172.17.0.3",
    "IPPrefixLen": 16,
    "IPv6Gateway": ""
  },

    },
    "AttachStderr": true,
    "AttachStdout": true,
    "AttachStdin": true,
    "User": "",
    "Domainname": "",
    "Hostname": "f5d3273e4835",
    "OpenStdin": true,
    "StdinOnce": true,
    "Env": [
      "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    ],
    "Cmd": [
      "/bin/bash"
    ],
    "ArgsEscaped": true,
    "Image": "ubuntu:14.04",

<*************REMOVING THE OUTPUT CONTENT********>

  "ExecIDs": null,
  "HostnamePath": "/var/lib/docker/containers/f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940/hostname",
  "ResolvConfPath": "/var/lib/docker/containers/f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940/resolv.conf",
  "Image": "sha256:132b7427a3b40f958aaeae8716e0cbb2177658d2410554ed142e583ef522309f",
  "State": {
    "FinishedAt": "0001-01-01T00:00:00Z",
    "StartedAt": "2017-06-09T06:53:45.120357144Z",
    "Error": "",
    "Status": "running",
    "Running": true,
    "Paused": false,
    "Restarting": false,

  "Path": "/bin/bash",
  "Created": "2017-06-09T06:52:51.820429355Z",
  "Id": "f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940",
  "HostsPath": "/var/lib/docker/containers/f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940/hosts",
  "LogPath": "/var/lib/docker/containers/f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940/f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940-json.log",
  "Name": "/objective_bartik",
  "RestartCount": 0,
  "Driver": "aufs",
  "MountLabel": "",
  "ProcessLabel": "",
  "AppArmorProfile": "docker-default"
}

Verweisen Sie dies für weitere Informationen:

DOCKER-APIs

SO ERSTELLEN SIE EIN IMAGE MITHILFE DER DOCKER-API?

FESTLEGEN DES DOCKER-CONTAINERS MITHILFE DER API 

Hoffen Sie, dass diese Info hilfreich ist.

0
Here_2_learn