Pregunta Publicación de puertos cuando se ejecuta con Docker Compose


Parece que no puedo encontrar la forma de que funcione la publicación de puertos docker-compose run de la misma manera que puedo con docker run.

Usando Docker Compose (y por lo tanto la asignación de puertos en docker-compose.yml) da un error "Falló la conexión" de curl:

$ docker-compose run flask
 * Running on http://0.0.0.0:2048/ (Press CTRL+C to quit)

$ curl http://localhost:2048/
curl: (7) Failed connect to localhost:2048; Connection refused

Sin embargo, las cosas están bien al pasar manualmente los puertos a docker run:

$ docker run -p 2048:2048 --name flask -t flask_image
 * Running on http://0.0.0.0:2048/ (Press CTRL+C to quit)

$ curl http://localhost:2048
Hello World!

¿Qué me estoy perdiendo?


Dockerfile

FROM centos:7

# Install EPEL repo.
RUN rpm -iUvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

# Install Python and Pip.
RUN yum -y update && yum -y install \
    python \
    python-pip

# Flask is necessary to run the app.
RUN pip install flask

EXPOSE 2048

ADD hello_world_flask_app.py /src/hello_world_flask_app.py
CMD ["python", "/src/hello_world_flask_app.py"]

hello_world_flask_app.py

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=2048)

docker-compose.yml

version: '2'
services:
  flask:
    build: .
    ports:
      - "2048:2048"

15
2018-03-30 21:35


origen


Respuestas:


Por defecto, docker-compose run no publica los puertos del servicio. Puedes pasar el --service-ports opción para publicar los puertos tal como están definidos en docker-compose.yml, o use el -p opción para publicar todos los puertos.

Ver la documentación para docker-compose run


15
2018-03-30 22:59



EDITAR

Intentado con --service-ports (no funciona con up comando y deberíamos de alguna manera stop y run de nuevo) también no cambia este comportamiento, los puertos están expuestos pero no pueden curl e inalcanzable por razones mencionadas de 127.0.0.1


Esto se debe al hecho de que estás usando docker-componer 2 sintaxis.

Por defecto, crea un red interna (o red de superposición en algunos casos) entre cada contenedor de proyecto de composición.

Puedes usar docker inspect <container_name> para obtener el estado de la red del contenedor.

También usando netstat Le da un comportamiento extraño de Docker que parece solo escucha en tcp6 interfaces:

$ sudo netstat -lt|grep 2048

  tcp6       0      0 [::]:2048           [::]:*         LISTEN      501/docker

Soluciones posibles :

1- Curl desde el host externo! funciona :)

C:\Users\pooya>curl host:2048
Hello World!

2- Especificar IP de Localhost (127.0.0.1) en ports Sección :

$ cat docker-compose.yml
version: '2'
services:
  flask:
      build: .
      ports:
        - "127.0.0.1:2048:2048"

Y puedes simplemente rizar usando curl localhost:2048

3 - Cambiar el controlador de red (Modo de red) a puente

** Este método ya no funciona en las versiones nuevas de docker **

4- Curl de la IP del host en lugar de 127.0.0.1


Entonces, Cual fue el problema ?

Parece que el problema de raíz es del método de puente de Docker. Docker usa iptables a nat ENTRADA conexiones al puerto correcto del contenedor

$ sudo iptables -L|grep 2048
ACCEPT     tcp  --  anywhere             10.0.0.12            tcp dpt:2048

Como puedes ver solo dports conexiones entrantes a 10.0.0.12:2048


Espera, ¿qué tal si no usas docker-compose?

¡Extraño! pero para escuchar correctamente 0.0.0.0 y todo está bien :)

$ docker run -it -d  -p 2048:2048 test
$ netstat -ltn|grep 2048
tcp        0      0 0.0.0.0:2048   0.0.0.0:*               LISTEN

10
2018-03-30 22:56