Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Gunicorn Flask application in Docker Container not getting Exposed

The application inside the container is inaccessible from the outside i.e if I exec into the docker container and do

curl localhost:5000 

it works correctly but not on the browser in my computer i get error : This site cant be reached

My Dockerfile:

# Use an official Python runtime as a parent image
FROM python:3.7-slim

# Set the working directory to /app
WORKDIR /web-engine

# Copy the current directory contents into the container at /app
COPY . /web-engine

# Install Gunicorn3
RUN apt-get update && apt-get install default-libmysqlclient-dev gcc -y

# Install any needed packages specified in requirements.txt
RUN pip3 install --trusted-host pypi.python.org -r requirements.txt

# Make port 5000 available to the world outside this container
EXPOSE 5000

# Define environment variable
ENV username root

# Run app.py when the container launches
CMD gunicorn --workers 4 --bind 127.0.0.1:5000 application:app --threads 1

UPON executing docker in this way:

sudo docker run -e password=$password -p 5000:5000 $reg/web-engine:ve0.0.2

I get the following output:

[2019-09-08 11:53:36 +0000] [6] [INFO] Starting gunicorn 19.9.0
[2019-09-08 11:53:36 +0000] [6] [INFO] Listening at: http://127.0.0.1:5000 (6)
[2019-09-08 11:53:36 +0000] [6] [INFO] Using worker: sync
[2019-09-08 11:53:36 +0000] [9] [INFO] Booting worker with pid: 9
[2019-09-08 11:53:36 +0000] [10] [INFO] Booting worker with pid: 10
[2019-09-08 11:53:36 +0000] [11] [INFO] Booting worker with pid: 11
[2019-09-08 11:53:36 +0000] [12] [INFO] Booting worker with pid: 12

So as you can see I'm mapping port 5000 of the container to port 5000 of my computer but localhost:5000 is not working

Therefore i tried everthing the same but with the development server of Flask with the following change in My dockerfile

FRom

CMD gunicorn --workers 4 --bind 127.0.0.1:5000 application:app --threads 1

TO

CMD python3.7 application.py

and IT WORKED; I goto localhost:5000 and see the application is working

There is nothing wrong with the application. I suppose there's an error in gunicorn server

the requirements.txt file :

Flask
Flask-SQLAlchemy
mysqlclient
gunicorn
bs4
html5lib

Please help me out

I also tried different forms of gunicorn and docker run command combinations like

CMD gunicorn -application:app && sudo docker run -e password=$password -p 5000:8000 $reg/web-engine:ve0.0.2

It didnt work terminal image of container working with development server

I would appreciate a solution involving nothing outside whats mentioned here like nginx, supervisor etc SOmeone please helllppp meeeeee.......😢

like image 793
cosmicsage Avatar asked Sep 08 '19 14:09

cosmicsage


2 Answers

By default, 127.0.0.1 means a different thing inside the container than it does outside. Use 0.0.0.0:5000 instead.

like image 169
Dave W. Smith Avatar answered Nov 18 '22 08:11

Dave W. Smith


To expand on the other answer: the way Docker port forwarding works is to forward from the IPs on the host machine to one address in the container. Specifically, the external address that talks to the Docker bridge network that connects the container to the host network. It can't talk to to 127.0.0.1 on the container because that's a private IP—the host has its own 127.0.0.1.

So you need to either bind to that Docker bridge network, or just bind to all interfaces by binding to 0.0.0.0, which is the easiest solution.

Explaining this with prose is a little tricky, but I have longer version that also includes diagrams and will probably therefore be easier to understand: https://pythonspeed.com/articles/docker-connection-refused/

like image 5
Itamar Turner-Trauring Avatar answered Nov 18 '22 07:11

Itamar Turner-Trauring