我似乎无法找到一种方法,使端口发布能够以与docker run相同的方式与docker run一起工作。
使用Docker (因此docker-compose.yml中的端口映射)将从curl中产生一个“连接失败”错误
$ docker-compose run flask
* Running on http://0.0.0.0:2048/ (Press CTRL+C to quit)
$ curl http://localhost:2048/
curl: (7) Failed connect to localhost:2048; Connection refused但是,当手动将端口传递到docker run时,情况很好。
$ docker run -p 2048:2048 --name flask -t flask_image
* Running on http://0.0.0.0:2048/ (Press CTRL+C to quit)
$ curl http://localhost:2048
Hello World!我遗漏了什么?
Dockerfile
FROM centos:7
# Install EPEL repo.
RUN rpm -iUvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
# Install Python and Pip.
RUN yum -y update && yum -y install \
python \
python-pip
# Flask is necessary to run the app.
RUN pip install flask
EXPOSE 2048
ADD hello_world_flask_app.py /src/hello_world_flask_app.py
CMD ["python", "/src/hello_world_flask_app.py"]hello_world_flask_app.py
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run(host='0.0.0.0', port=2048)docker-compose.yml
version: '2'
services:
flask:
build: .
ports:
- "2048:2048"发布于 2016-03-30 22:59:58
默认情况下,docker-compose run不发布服务的端口。您可以传递--service-ports选项来发布端口,因为端口是在docker-compose.yml中定义的,或者使用-p选项发布所有端口。
请参阅船坞-组合运行的文档
发布于 2016-03-30 22:56:41
编辑
尝试使用--service-ports (它不适用于up命令,我们应该以某种方式再次使用stop和run ),它也不会改变这种行为,端口是公开的,但是由于127.0.0.1提到的原因,不能curl和不可访问
这是因为您使用的是停靠-编写2语法。
默认情况下,它在每个组合项目容器之间创建一个内部网络(或在某些情况下为覆盖网络)。
您可以使用docker inspect <container_name>获取容器网络状态。
同时,使用netstat,它会给出一个来自docker的奇怪行为,而这个行为似乎只侦听tcp6接口:
$ sudo netstat -lt|grep 2048
tcp6 0 0 [::]:2048 [::]:* LISTEN 501/docker可能的解决办法:
1-从外部主机卷曲!它起作用:)
C:\Users\pooya>curl host:2048
Hello World!2-在部分指定本地主机IP (127.0.0.1):
$ cat docker-compose.yml
version: '2'
services:
flask:
build: .
ports:
- "127.0.0.1:2048:2048"您可以使用curl localhost:2048简单地卷曲
3-将网络驱动程序(network_mode)更改为桥
**此方法不再适用于较新的docker版本**
4-从主机的ip卷起而不是127.0.0.1
那么问题出在哪里?
从根本上看,问题的症结在于码头桥接法。docker使用iptables将nat传入到正确容器端口的连接
$ sudo iptables -L|grep 2048
ACCEPT tcp -- anywhere 10.0.0.12 tcp dpt:2048如您所见,只有dport的传入连接到10.0.0.12:2048。
等等,不使用码头写作怎么样?
奇怪!但是只要正确地听0.0.0.0,一切都很好:)
$ docker run -it -d -p 2048:2048 test
$ netstat -ltn|grep 2048
tcp 0 0 0.0.0.0:2048 0.0.0.0:* LISTENhttps://stackoverflow.com/questions/36320172
复制相似问题