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 something
something
auf dem DOCKER_Host
ausgeführt werden und nicht auf meinem lokalen Computer.
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.
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ürDOCKER_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 diedockerd
-Binärdatei ausgeführt werden soll, ist es unserer Meinung nach eine ungültige Konfiguration für diese Funktion, die lokaledocker
-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 ichdockerd
TCP ohne TLS öffne, erheblich verringert, und dass Sie sich für SSH-Endpunkte für Remote-mgmt entscheiden.
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 auf0.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 undtcp://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
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:
SO ERSTELLEN SIE EIN IMAGE MITHILFE DER DOCKER-API?
FESTLEGEN DES DOCKER-CONTAINERS MITHILFE DER API
Hoffen Sie, dass diese Info hilfreich ist.