Ich kann Container starten und ihre Ports über die CLI zuordnen. Dasselbe scheint jedoch über die Remote-API unmöglich zu sein. In beiden Fällen laufe ich mit Docker-Maschine auf Mac OS El Capitan.
Ich habe den Testfall jetzt auf das absolute Minimum vereinfacht, das auf einem Standard-Ubuntu-Image mit nur einem einzigen Paket netcat-openbsd, apt-get installiert (und als nc
ausgeführt) basiert.
Vor jedem Test laufe ich
eval $(docker-machine env default); docker stop $(docker ps -a -q); docker rm $(docker ps -a -q)
...anzuhalten und alle vorherigen Container zu entfernen.
Die folgende CLI ruft erfolgreich einen adressierbaren Dienst auf ...
docker run -it --rm -p 3000:3000 ubuntu-nc /bin/bash -c 'echo "Working" | nc -l 3000'
Ich kann beweisen, dass der Dienst mit ordnungsgemäß zugeordneten Ports von außerhalb des Docker-Containers zugänglich ist (an der IP, die der VM von der Docker-Maschine zugewiesen wurde), indem ich Folgendes ausführe ...
$ nc 192.168.99.100 3000
Working
Der Versuch, denselben Dienst über Dockerode auf Node aufzurufen, erzeugt einen Dienst, der nicht adressierbar ist, obwohl Dockerode anscheinend alle Argumente an Docker weitergibt und ich mich anscheinend an die Konventionen von https://godoc.org/github halte. com/docker/engine-api/types/container#Config und https://godoc.org/github.com/docker/engine-api/types/container#HostConfig , wodurch dieses Problem ausgelöst wird.
Dies ist der Code, den ich versuche zu verwenden ...
var fs = require("fs"),
dockermachine = require("dockermachine"),
dockerode = require("dockerode");
var createOptions = {
Image:"ubuntu-nc",
Tty:true,
ExposedPorts: {
"3000/tcp:": {},
},
Cmd:[
"/bin/bash", "-c", "echo Working | nc -l 3000"
],
HostConfig:{
PortBindings: {
"3000/tcp": [{
"HostIP":"0.0.0.0",
"HostPort": "3000"
}],
},
},
};
dockermachine.inspect("default").then(function(info){
var docker = new dockerode({
host:info.Driver.IPAddress,
port:2376,
ca:fs.readFileSync(info.HostOptions.AuthOptions.CaCertPath),
cert:fs.readFileSync(info.HostOptions.AuthOptions.ClientCertPath),
key:fs.readFileSync(info.HostOptions.AuthOptions.ClientKeyPath),
});
docker.createContainer(createOptions, function(err, result){
var container = docker.getContainer(result.id);
container.attach({stream: true, stdout: true, stderr: true}, function (err, stream) {
stream.pipe(process.stdout);
});
container.start(function(err, data){
if(err) console.log(err);
});
});
});
Die NodeJS-Version führt den Dienst definitiv im Container aus
Zum Beispiel kann ich von einem eigenen Container aus auf den Dienst zugreifen ...
$ docker exec -it 3dd7 /bin/bash -c "nc localhost 3000"
Working
Es respektiert jedoch anscheinend nicht die angeforderte externe Portzuordnung. Wenn ich also den obigen Funktionstest von Grund auf neu starte, versuche ich, auf den Dienst von außerhalb des Containers zuzugreifen, auf die gleiche Weise wie zuvor „Proving Addressable Service“. meldet eine fehlgeschlagene Verbindung.
$ nc -v 192.168.99.100 3000
nc: connectx to 192.168.99.100 port 3000 (tcp) failed: Connection refused
Ausgabe von docker version
:
bash-3.2$ docker version
Client:
Version: 1.10.1
API version: 1.22
Go version: go1.5.3
Git commit: 9e83765
Built: Fri Feb 12 22:11:40 UTC 2016
OS/Arch: darwin/amd64
Server:
Version: 1.11.2
API version: 1.23
Go version: go1.5.4
Git commit: b9f10c9
Built: Wed Jun 1 21:20:08 2016
OS/Arch: linux/amd64
Ausgabe von docker info
:
bash-3.2$ docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 3
Server Version: 1.11.2
Storage Driver: aufs
Root Dir: /mnt/sda1/var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 7
Dirperm1 Supported: true
Logging Driver: json-file
Plugins:
Volume: local
Network: null host bridge
Kernel Version: 4.4.12-boot2docker
Operating System: Boot2Docker 1.11.2 (TCL 7.1); HEAD : a6645c3 - Wed Jun 1 22:59:51 UTC 2016
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 995.9 MiB
Name: default
ID: FWTM:2N6I:VM5L:OL4U:RD3K:HFKH:6VYP:QSV5:VHG5:ZTSW:GFOP:CDNT
Debug mode (server): true
File Descriptors: 14
Goroutines: 35
System Time: 2016-06-10T13:58:19.242425997Z
EventsListeners: 0
Init SHA1:
Init Path:
Docker Root Dir: /mnt/sda1/var/lib/docker
Labels:
provider=virtualbox
OK, sieht so aus, als wäre da ein falsches Semikolon wie ...
ExposedPorts: {
"3000/tcp:": {},
},
... was dazu führte, dass ExposedPorts stillschweigend ignoriert wurde.
Es ist sehr bedauerlich, keine offensichtliche Fehlermeldung zu haben, anscheinend dank des Verhaltens des „offenen Schemamodells“ der Remote-API.
Ich kann nicht erkennen, wie dieses Schlucken von Fehlern, wenn Eigenschaften eindeutig dazu bestimmt sind, Docker zu steuern, jemals ein Feature sein könnte.
warte was? war es das? ... ein Tippfehler?
Ich habe dies gelesen, weil ich das gleiche Problem habe – kein Port-Mapping funktioniert, keine Netzwerk-IP-Adresse.
(aber ich habe deinen Tippfehler nicht)
Gibt es hier nichts mehr zu lernen?
Macht nichts ... Ich habe etwas gelernt: Nachdem Sie einen Container erstellt haben, müssen Sie den Container "starten ()", bevor Sie eine IP-Adresse oder Portzuordnungen erhalten.
Hilfreichster Kommentar
OK, sieht so aus, als wäre da ein falsches Semikolon wie ...
... was dazu führte, dass ExposedPorts stillschweigend ignoriert wurde.
Es ist sehr bedauerlich, keine offensichtliche Fehlermeldung zu haben, anscheinend dank des Verhaltens des „offenen Schemamodells“ der Remote-API.
Ich kann nicht erkennen, wie dieses Schlucken von Fehlern, wenn Eigenschaften eindeutig dazu bestimmt sind, Docker zu steuern, jemals ein Feature sein könnte.