1

I am fairly new to Docker and I'm trying to containerize my Flask-App. The container of the app + gunicorn works fine, I can access the site. But when I'm using docker-compose to include an Nginx Container, I cant connect to the site anymore.

My Files:

Dockerfile (Flask):

FROM python:3.7-stretch
WORKDIR /app
ADD . /app
RUN pip install -r requirements.txt
EXPOSE 8080
CMD ["gunicorn", "-b", "127.0.0.1:8080", "app:app"]

Dockerfile (Nginx)

FROM nginx
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d/

nginx.conf

server {
    listen  8080;
    server_name localhost;

    location / {
        proxy_pass http://127.0.0.1:8080/;
    }

    location /static {
        alias /var/www-data;
    }
}

And the docker-compose.yml

version: "3.7"

services:

  flask:
    build: ./flask
    container_name: flask_cookbook
    restart: always
    environment:
      - APP_NAME=Cookbook
    expose:
      - 8080

  nginx:
    build: ./nginx
    container_name: nginx_cookbook
    restart: always
    ports:
      - "80:8080"

When I run the container with docker-compose up --build, everything seems to be working fine:

Starting nginx_cookbook ... done
Starting flask_cookbook ... done
Attaching to nginx_cookbook, flask_cookbook
flask_cookbook | [2019-07-18 15:19:37 +0000] [1] [INFO] Starting gunicorn 19.9.0
flask_cookbook | [2019-07-18 15:19:37 +0000] [1] [INFO] Listening at: http://127.0.0.1:8080 (1)
flask_cookbook | [2019-07-18 15:19:37 +0000] [1] [INFO] Using worker: sync
flask_cookbook | [2019-07-18 15:19:37 +0000] [8] [INFO] Booting worker with pid: 8

But when I go to 127.0.0.1:8080, there is nothing to connect to.

I can't really find the error, I probably made somewhere...


Additional Info: I'm on Windows 10

My directory looks like this

Main Dir
├── docker-compose.yml
├── flask
│   ├── templates
│   ├── static
│   ├── app.py
│   ├── requirements.txt
│   └── Dockerfile
└── nginx
    ├── nginx.conf
    └── Dockerfile
2
  • 1
    You have a few problems. A) you are proxy passing in nginx to localhost on the same port as nginx is listening to this is not going to work. You need to make requests to the flask container. B) from your machine making a request to 127.0.0.1:8080 will not work as no docker container is listening. Your config says nginx should use port 80 which would map to 8080 in the container. So you should just be making requests to 127.0.0.1:80 Commented Jul 18, 2019 at 16:22
  • @ShawnC. Awesome, it works now. Thanks a lot! I still needed to fiddle around a little bit, but I get now, why it did not work and now everything makes sense :) Commented Jul 19, 2019 at 9:48

1 Answer 1

6

Thanks to @ShawnC. , I solved the problem. To cite him:

You have a few problems. A) you are proxy passing in nginx to localhost on the same port as nginx is listening to this is not going to work. You need to make requests to the flask container.

So I changed the listen-port in the nginx.conf file to 80 (from 8080) and the ports in the nginx section of the docker-compose.yml to 80:80 (from 80:8080)

B) from your machine making a request to 127.0.0.1:8080 will not work as no docker container is listening. Your config says nginx should use port 80 which would map to 8080 in the container. So you should just be making requests to 127.0.0.1:80

Therefore, I changed the proxy pass in nginx.conf to flask_cookbook:8080. So the container-name, as well as the exposed port of the flask_app. This way, the nginx container can make requests to the flask container.

I also had to change the gunicorn bind in the flask-Dockerfile to 0.0.0.0:8080, so I can use Localhost/127.0.0.1 to connect to the nginx container.

Now it works, and I can go on localhost:80 to connect to my website.

Sign up to request clarification or add additional context in comments.

1 Comment

"So the container-name, as well as the exposed port of the flask_app." Huh?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.