我正在学习如何使用 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)