Gunicorn Docker 容器只监听 `0.0.0.0`
Gunicorn Docker container only listens on `0.0.0.0`
我正在尝试为为我的 Flask 应用程序提供服务的 gunicorn 应用程序服务器设置一个 nginx 反向代理。 gunicorn 容器监听 5000 端口,nginx 监听 80 端口。问题是我通过浏览器访问 localhost:5000
仍然可以访问应用程序,即使我设置了 gunicorn 监听 [=] 的 localhost 34=] 仅限容器,所有请求都应通过 nginx 容器通过端口 80 到达 gunicorn 容器。这是我的设置。
docker-compose.yml
version: "3.3"
services:
web_app:
build:
context: .
dockerfile: Dockerfile.web
restart: always
ports:
- "5000:5000"
volumes:
- data:/home/microblog
networks:
- web
web_proxy:
container_name: web_proxy
image: nginx:alpine
restart: always
ports:
- "80:80"
volumes:
- data:/flask:ro
- ./nginx/config/nginx.conf:/etc/nginx/nginx.conf:ro
networks:
- web
networks:
web:
volumes:
data:
Dockerfile.web
FROM python:3.6-alpine
# Environment Variables
ENV FLASK_APP=microblog.py
ENV FLASK_ENVIRONMENT=production
ENV FLASK_RUN_PORT=5000
# Don't copy .pyc files to cointainer
ENV PYTHONDONTWRITEBYTECODE=1
# Security / Permissions (1/2)
RUN adduser -D microblog
WORKDIR /home/microblog
# Virtual Environment
COPY requirements.txt requirements.txt
RUN python -m venv venv
RUN venv/bin/pip install -U pip
RUN venv/bin/pip install -r requirements.txt
RUN venv/bin/pip install gunicorn pymysql
# Install App
COPY app app
COPY migrations migrations
COPY microblog.py config.py boot.sh ./
RUN chmod +x boot.sh
# Security / Permissions (2/2)
RUN chown -R microblog:microblog ./
USER microblog
# Start Application
EXPOSE 5000
ENTRYPOINT ["./boot.sh"]
boot.sh
#!/bin/sh
source venv/bin/activate
flask db upgrade
exec gunicorn --bind 127.0.0.1:5000 --access-logfile - --error-logfile - microblog:app
尽管我已经设置了 gunicorn --bind 127.0.0.1:5000', in stdout of
docker-compose` 我明白了
web_app_1 | [2021-03-02 22:54:14 +0000] [1] [INFO] Starting gunicorn 20.0.4
web_app_1 | [2021-03-02 22:54:14 +0000] [1] [INFO] Listening at: http://0.0.0.0:5000 (1)
而且我仍然可以在我的浏览器中从端口 5000 看到该网站。我不确定为什么当我明确地将它设置为 127.0.0.1
时它正在监听 0.0.0.0
。
您的 docker-compose 有
ports:
- "5000:5000"
它告诉 docker-proxy 监听主机上的端口 5000 并将请求转发到容器。如果您不希望端口 5000 对外可用,请将其删除。
还有,幸好你没有成功让gunicorn只听127.0.0.1;如果这样做,web_proxy
容器将无法连接到它。因此,您不妨撤消您的尝试。
我正在尝试为为我的 Flask 应用程序提供服务的 gunicorn 应用程序服务器设置一个 nginx 反向代理。 gunicorn 容器监听 5000 端口,nginx 监听 80 端口。问题是我通过浏览器访问 localhost:5000
仍然可以访问应用程序,即使我设置了 gunicorn 监听 [=] 的 localhost 34=] 仅限容器,所有请求都应通过 nginx 容器通过端口 80 到达 gunicorn 容器。这是我的设置。
docker-compose.yml
version: "3.3"
services:
web_app:
build:
context: .
dockerfile: Dockerfile.web
restart: always
ports:
- "5000:5000"
volumes:
- data:/home/microblog
networks:
- web
web_proxy:
container_name: web_proxy
image: nginx:alpine
restart: always
ports:
- "80:80"
volumes:
- data:/flask:ro
- ./nginx/config/nginx.conf:/etc/nginx/nginx.conf:ro
networks:
- web
networks:
web:
volumes:
data:
Dockerfile.web
FROM python:3.6-alpine
# Environment Variables
ENV FLASK_APP=microblog.py
ENV FLASK_ENVIRONMENT=production
ENV FLASK_RUN_PORT=5000
# Don't copy .pyc files to cointainer
ENV PYTHONDONTWRITEBYTECODE=1
# Security / Permissions (1/2)
RUN adduser -D microblog
WORKDIR /home/microblog
# Virtual Environment
COPY requirements.txt requirements.txt
RUN python -m venv venv
RUN venv/bin/pip install -U pip
RUN venv/bin/pip install -r requirements.txt
RUN venv/bin/pip install gunicorn pymysql
# Install App
COPY app app
COPY migrations migrations
COPY microblog.py config.py boot.sh ./
RUN chmod +x boot.sh
# Security / Permissions (2/2)
RUN chown -R microblog:microblog ./
USER microblog
# Start Application
EXPOSE 5000
ENTRYPOINT ["./boot.sh"]
boot.sh
#!/bin/sh
source venv/bin/activate
flask db upgrade
exec gunicorn --bind 127.0.0.1:5000 --access-logfile - --error-logfile - microblog:app
尽管我已经设置了 gunicorn --bind 127.0.0.1:5000', in stdout of
docker-compose` 我明白了
web_app_1 | [2021-03-02 22:54:14 +0000] [1] [INFO] Starting gunicorn 20.0.4
web_app_1 | [2021-03-02 22:54:14 +0000] [1] [INFO] Listening at: http://0.0.0.0:5000 (1)
而且我仍然可以在我的浏览器中从端口 5000 看到该网站。我不确定为什么当我明确地将它设置为 127.0.0.1
时它正在监听 0.0.0.0
。
您的 docker-compose 有
ports:
- "5000:5000"
它告诉 docker-proxy 监听主机上的端口 5000 并将请求转发到容器。如果您不希望端口 5000 对外可用,请将其删除。
还有,幸好你没有成功让gunicorn只听127.0.0.1;如果这样做,web_proxy
容器将无法连接到它。因此,您不妨撤消您的尝试。