使用 docker-compose 时,docker 容器内的 Flask 应用程序不会提供给本地主机

使用 docker-compose 时,docker 容器内的 Flask 应用程序不会提供给本地主机

我正在学习如何使用 docker 并遇到了以下问题。

我的 flask 应用程序位于/var/www/Skills 应用程序树中(我省略了 static/、templates/、tests/ 和一些 pycache 目录下的文件):

.
├── config.py
├── docker-compose.yml
├── Dockerfile
├── package-lock.json
├── Pipfile
├── Pipfile.lock
├── README.md
├── requirements.txt
├── run.py
├── skills
│   ├── api
│   │   ├── errors.py
│   │   ├── __init__.py
│   │   ├── skills.py
│   │   └── validations.py
│   ├── auth
│   │   ├── emails.py
│   │   ├── __init__.py
│   │   ├── oauth.py
│   │   └── routes.py
│   ├── content
│   │   ├── forms.py
│   │   ├── __init__.py
│   │   └── routes.py
│   ├── errors
│   │   ├── handlers.py
│   │   └── __init__.py
│   ├── __init__.py
│   ├── main
│   │   ├── __init__.py
│   │   └── routes.py
│   ├── models.py
│   ├── static        
│   └── templates    
├── skills.db
└── tests

如果我理解正确的话,我可以将Dockerfile放在此项目文件夹的根目录中。该文件的内容如下:

FROM python:3.7-alpine
WORKDIR /code
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "run.py"]

这基本上就是我在这里得到的:https://docs.docker.com/compose/gettingstarted/我不完全理解这一行RUN apk add --no-cache gcc musl-dev linux-headers,但除此之外我应该将 requirements.txt 从我当前目录复制到 docker 镜像内的 copy/ 目录中,其余部分也一样(COPY . .)。

然后我有docker-compose.yml:

version: '3'
services:
  skills:
    build: .
    ports:
      - "127.0.0.1:8080:8080"

它应该首先基于Dockerfile构建镜像,然后运行并将其绑定到127.0.0.1和端口8080,最后一个端口(这里再次是8080)表示docker镜像内部使用了哪个端口。

当我跑步时:

$ docker-compose up -d

它返回 0 并且没有错误。

当我跑步时:

$ docker ps -a

我可以看到我的容器正在运行。

但是,当我导航到 127.0.0.1:8080 时,页面一直在加载,我从未得到任何内容。

我也尝试过运行:

$ docker-compose up

,这样我就可以在终端中看到所有输出。再次,我可以看到 python webserver 正在 0.0.0.0:8080 上运行并准备好响应请求。

skills_1  |  * Serving Flask app "skills" (lazy loading)
skills_1  |  * Environment: production
skills_1  |    WARNING: Do not use the development server in a production environment.
skills_1  |    Use a production WSGI server instead.
skills_1  |  * Debug mode: on
skills_1  |  * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
skills_1  |  * Restarting with stat
skills_1  |  * Debugger is active!
skills_1  |  * Debugger PIN: 763-470-183

我做错了什么?感觉这应该是有史以来最简单的设置,我没有使用任何其他更强大的网络服务器,所以这里的配置应该非常简单。但我就是无法让它工作。

如果这对这个问题很重要,我正在使用docker 19.03.1-ce,docker-compose 1.24.1。

谢谢

答案1

因为我终于明白了,所以我会回答我自己的问题。

大多数关于 docker 的教程都忽略了防火墙的设置方法。Docker 应该为新容器添加一些链和规则,但在我的例子中,它们似乎存在故障,因此无法建立连接。

当我刷新所有规则时:

$ iptables -F

我可以通过 127.0.0.1:8080 访问我的网站。

编辑:+docker 版本 19.03.1-ce 仍然忽略参数 --iptables=false(https://github.com/docker/for-linux/issues/136

相关内容