Moby: Ports können nicht über die Remote-API gebunden werden

Erstellt am 10. Juni 2016  ·  3Kommentare  ·  Quelle: moby/moby

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.

Zurücksetzen des Systems

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.

CLI-Version (adressierbar)

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'

Nachweis des adressierbaren Dienstes

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

NodeJS-Version (nicht adressierbar)

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

Zusätzliche Debugging-Informationen

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
versio1.11

Hilfreichster Kommentar

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.

Alle 3 Kommentare

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen