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