Moby: Impossible de lier les ports via l'API distante

Créé le 10 juin 2016  ·  3Commentaires  ·  Source: moby/moby

Je suis capable de lancer des conteneurs et de mapper leurs ports à partir de la CLI. Cependant, la même chose semble impossible via l'API distante. Dans les deux cas, j'utilise docker-machine sur Mac OS El Capitan.

J'ai maintenant simplifié le cas de test au strict minimum absolu, qui est basé sur une image ubuntu standard avec un seul paquet netcat-openbsd, apt-get installé (et exécuté en tant que nc ).

Réinitialisation du système

Avant chaque test, je cours

eval $(docker-machine env default); docker stop $(docker ps -a -q); docker rm $(docker ps -a -q) 

...pour arrêter et supprimer tous les conteneurs précédents.

Version CLI (adressable)

La CLI suivante affiche avec succès un service adressable...

docker run -it --rm -p 3000:3000 ubuntu-nc /bin/bash -c 'echo "Working" | nc -l 3000'

Preuve du service adressable

Je peux prouver que le service est accessible avec des ports correctement mappés depuis l'extérieur du conteneur docker (à l'adresse IP allouée à la machine virtuelle par docker-machine) en exécutant ce qui suit ...

$ nc 192.168.99.100 3000
Working

Version NodeJS (non adressable)

Tenter de faire apparaître le même service via Dockerode sur Node crée un service qui n'est pas adressable, même si Dockerode transmet apparemment tous les arguments à Docker, et je me conforme apparemment aux conventions de https://godoc.org/github. com/docker/engine-api/types/container#Config et https://godoc.org/github.com/docker/engine-api/types/container#HostConfig soulevant ainsi ce problème.

C'est le code que j'essaie d'utiliser...

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);
        });

    });
});

La version NodeJS exécute définitivement le service dans le conteneur

Par exemple, je peux accéder au service depuis son propre conteneur...

$ docker exec -it 3dd7 /bin/bash -c "nc localhost 3000"
Working

Cependant, il ne respecte apparemment pas le mappage de port externe qui a été demandé, donc si je redémarre le test de travail ci-dessus à partir de zéro, puis tente d'accéder au service depuis l' extérieur du conteneur de la même manière que 'Proving Addressable Service' plus tôt, il signale un échec de connexion.

$ nc -v 192.168.99.100 3000
nc: connectx to 192.168.99.100 port 3000 (tcp) failed: Connection refused

Informations de débogage supplémentaires

Sortie de 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

Sortie de 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

Commentaire le plus utile

OK, on ​​dirait qu'il y avait un faux point-virgule comme...

ExposedPorts: {
        "3000/tcp:": {},
 },

... ce qui a provoqué l'ignorance silencieuse de ExposedPorts.

Il est très regrettable de ne pas avoir de rapport d'erreur apparent, apparemment grâce au comportement de «modèle de schéma ouvert» de l'API distante.

Je ne vois pas comment cette déglutition d'erreurs lorsque les propriétés sont clairement destinées à contrôler Docker pourrait jamais être une fonctionnalité.

Tous les 3 commentaires

OK, on ​​dirait qu'il y avait un faux point-virgule comme...

ExposedPorts: {
        "3000/tcp:": {},
 },

... ce qui a provoqué l'ignorance silencieuse de ExposedPorts.

Il est très regrettable de ne pas avoir de rapport d'erreur apparent, apparemment grâce au comportement de «modèle de schéma ouvert» de l'API distante.

Je ne vois pas comment cette déglutition d'erreurs lorsque les propriétés sont clairement destinées à contrôler Docker pourrait jamais être une fonctionnalité.

attends quoi? c'était ça ?... une faute de frappe ?
J'ai lu ceci parce que j'ai le même problème - impossible de faire fonctionner un mappage de port, pas d'adresse IP réseau.
(mais je n'ai pas ta faute de frappe)
N'y a-t-il rien d'autre à apprendre ici ?

tant pis...j'ai appris quelque chose : après avoir créé un conteneur, vous devez ensuite "démarrer()" le conteneur avant d'obtenir une adresse IP ou des mappages de ports.

Cette page vous a été utile?
0 / 5 - 0 notes