Moby: No se pueden vincular puertos a través de la API remota

Creado en 10 jun. 2016  ·  3Comentarios  ·  Fuente: moby/moby

Puedo lanzar contenedores y mapear sus puertos desde la CLI. Sin embargo, lo mismo parece imposible a través de la API remota. En ambos casos, estoy ejecutando con docker-machine en Mac OS El Capitan.

Ahora he simplificado el caso de prueba al mínimo absoluto, que se basa en una imagen estándar de ubuntu con un solo paquete netcat-openbsd, apt-get install (y se ejecuta como nc ).

Restablecimiento del sistema

Antes de cada prueba, corro

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

... para detener y eliminar todos los contenedores anteriores.

Versión CLI (direccionable)

La siguiente CLI abre con éxito un servicio direccionable...

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

Prueba de servicio direccionable

Puedo probar que se puede acceder al servicio con los puertos correctamente asignados desde fuera del contenedor acoplable (en la IP asignada a la máquina virtual por la máquina acoplable) ejecutando lo siguiente...

$ nc 192.168.99.100 3000
Working

Versión de NodeJS (no direccionable)

Intentar abrir el mismo servicio a través de Dockerode en Node crea un servicio que no es direccionable, aunque aparentemente Dockerode pasa todos los argumentos a Docker, y aparentemente me ajusto a las convenciones de https://godoc.org/github. com/docker/engine-api/types/container#Config y https://godoc.org/github.com/docker/engine-api/types/container#HostConfig , por lo tanto, plantea este problema.

Este es el código que estoy tratando de usar...

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 versión de NodeJS definitivamente ejecuta el servicio en el contenedor

Por ejemplo, puedo acceder al servicio desde su propio contenedor...

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

Sin embargo, aparentemente no respeta la asignación de puertos externos que se ha solicitado, por lo que si reinicio la prueba de trabajo anterior desde cero, luego intento acceder al servicio desde fuera del contenedor de la misma manera que 'Demostración del servicio direccionable' anterior, informa de una conexión fallida.

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

Información adicional de depuración

Salida 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

Salida 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

Comentario más útil

OK, parece que había un punto y coma falso como...

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

... lo que provocó que ExposedPorts se ignorara en silencio.

Es muy desafortunado no tener ningún informe de error aparente, aparentemente gracias al comportamiento del 'modelo de esquema abierto' de la API remota.

No puedo ver cómo esta absorción de errores cuando las propiedades están claramente destinadas a controlar Docker podría ser una característica.

Todos 3 comentarios

OK, parece que había un punto y coma falso como...

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

... lo que provocó que ExposedPorts se ignorara en silencio.

Es muy desafortunado no tener ningún informe de error aparente, aparentemente gracias al comportamiento del 'modelo de esquema abierto' de la API remota.

No puedo ver cómo esta absorción de errores cuando las propiedades están claramente destinadas a controlar Docker podría ser una característica.

¿esperar lo? ¿Fue eso?... ¿un error tipográfico?
He estado leyendo esto porque tengo el mismo problema: no puedo hacer que funcione ningún mapeo de puertos, no tengo una dirección IP de red.
(pero no tengo tu error tipográfico)
¿No hay nada más que aprender aquí?

no importa ... he aprendido algo: después de crear un contenedor, debe "iniciar ()" el ​​contenedor antes de obtener una dirección IP o asignaciones de puertos.

¿Fue útil esta página
0 / 5 - 0 calificaciones