I have a very simple flask service that I’m trying to run inside a docker container.
I used python to implement a minimal application that is working fine on my Windows, but isn’t reachable when inside a Docker container.
I tried the common fix of setting –host=0.0.0.0 (tried multiple ways), but it did not solve my problem.
Project structure:
├── application/
│ ├── Dockerfile
│ ├── requirements.txt
│ ├── service.py
Dockerfile:
# syntax=docker/dockerfile:1
FROM python:3.6.5-alpine
RUN apk --update add bash nano
COPY requirements.txt /tmp/
RUN pip3 install -r /tmp/requirements.txt
COPY . .
ENV FLASK_ENV=development
CMD ["python", "service.py"]
service.py:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def greetings():
return "Welcome my service!"
if __name__ == '__main__':
app.run(debug=True,host='0.0.0.0')
Finally, here’s the log when I start the Docker image in interactive mode:
[...]/.venv/Scripts/Activate.ps1"
* Serving Flask app 'service' (lazy loading)
* Environment: development
* Debug mode: on
* Running on all addresses.
WARNING: This is a development server. Do not use it in a production deployment.
* Running on http://172.17.0.2:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 277-473-905
So there appears to be no problems, however when I use a browser (Google Chrome) to visit the address shown in the console, it just loads forever then displays that the site is unreachable (ERR_CONNECTION_TIMED_OUT
).
Also, I can run the flask with no problem from my native OS by typing the following commands from a bash terminal:
export FLASK_APP=service
export FLASK_ENV=development
flask run
Can anybody help me understand why it’s not working inside a Docker container? It’s working from outside, and I thought adding host='0.0.0.0'
was supposed to make the container accessible from outside.
Edit: docker command tested:
docker run --rm -it scone:latest
docker run --rm -p 5000:5000 scone:latest
RESOLVED
The trick, as mentioned by u/OneCricketeer, is to use -p 5000:5000
argument in docker run, and now you can use reach the container BUT you have to ignore the address given in the docker terminal. Use this instead : http://localhost:5000 (the ip it would give you if you ran flask from outside the docker container.)
2
Answers
The issue that you are likely seeing is that your windows host cannot get to the docker container. The networking is not exposed to your host so you’ll need to include the
-p 5000:5000
option on the docker command line to tell docker to forward host port 5000 to the docker container port 5000.In short:
Tested with this Dockerfile
Run with
From another terminal