hub compose docker port docker-compose

compose - docker hub



PublicaciĆ³n de puertos cuando se ejecuta con Docker Compose (2)

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

El uso de Docker Compose (y, por lo tanto, la asignación de puertos en docker-compose.yml ) da un error de "Fallo al conectar" 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 cuando se pasan manualmente los puertos a la 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"


EDITAR

Probado con --service-ports (no funciona con up comando up y deberíamos stop y run nuevo), tampoco cambia este comportamiento, los puertos están expuestos pero no se pueden curl y no se pueden 127.0.0.1 por razones mencionadas desde 127.0.0.1

Esto se debe a que está utilizando la sintaxis de docker-compose 2 .

De forma predeterminada, crea una red interna (o red de superposición en algunos casos) entre cada contenedor de proyectos de composición.

Puede usar la docker inspect <container_name> para obtener el estado de la red de contenedores.

También utilizando netstat Da un comportamiento extraño desde la tcp6 acoplable que parece que solo escucha en tcp6 interfaces tcp6 :

$ sudo netstat -lt|grep 2048 tcp6 0 0 [::]:2048 [::]:* LISTEN 501/docker

Soluciones posibles :

1- Curl desde el anfitrión exterior! funciona :)

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

2- Especifique la IP del host local ( 127.0.0.1 ) en la sección de ports :

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

Y simplemente puede enrollar usando curl localhost:2048

3 - Cambiar el controlador de red ( network_mode ) al puente

** Este método ya no funciona en las nuevas versiones de la ventana acoplable **

4- Curl from ip del host en lugar de 127.0.0.1

Entonces, Cual fue el problema ?

Parece que el problema de la raíz es del método de puente docker. la ventana acoplable utiliza iptables para conexiones INCOMINGAS nat al puerto del contenedor correcto

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

Como se puede ver, solo las conexiones entrantes a 10.0.0.12:2048

Espera, ¿qué hay de no usar docker-compose?

Extraño pero solo escucha 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


De forma predeterminada, la docker-compose run no publica los puertos del servicio. Puede pasar la opción --service-ports para publicar los puertos tal como están definidos en el docker-compose.yml, o usar la opción -p para publicar todos los puertos.

Consulte la documentación para la ejecución de la ventana acoplable-componer