运行 Docker 撰写时的端口发布
Port Publishing When Running with Docker Compose
我似乎无法找到一种方法让端口发布与 docker-compose run
一起工作,就像我在 docker run
.
上一样
使用 Docker Compose(因此 docker-compose.yml
中的端口映射)给出 "Failed to connect" 来自 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!
我错过了什么?
Docker文件
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"
编辑
尝试使用 --service-ports
(它不适用于 up
命令,我们应该以某种方式再次使用 stop
和 run
)它也没有改变这个行为,端口已公开但不能 curl
并且由于 127.0.0.1
中提到的原因无法访问
这是因为您正在使用 docker-compose 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- 在 ports
部分中指定本地主机 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) 更改为 bridge
** 此方法不再适用于较新的 docker 版本 **
4- 从主机的 ip 而不是 127.0.0.1 卷曲
那么问题出在哪里?
看来根本问题来自 docker 桥接方法。 docker 使用 iptables
到 nat INCOMING 连接到正确容器的端口
$ sudo iptables -L|grep 2048
ACCEPT tcp -- anywhere 10.0.0.12 tcp dpt:2048
如您所见,只有 dport
个到 10.0.0.12:2048
的传入连接
等等,如果不使用 docker-compose 呢??
奇怪!但是只要正确地听 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:* LISTEN
默认情况下,docker-compose run
不发布服务的端口。您可以传递 --service-ports
选项来发布在 docker-compose.yml 中定义的端口,或者使用 -p
选项来发布所有端口。
的文档
我似乎无法找到一种方法让端口发布与 docker-compose run
一起工作,就像我在 docker run
.
使用 Docker Compose(因此 docker-compose.yml
中的端口映射)给出 "Failed to connect" 来自 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!
我错过了什么?
Docker文件
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"
编辑
尝试使用 --service-ports
(它不适用于 up
命令,我们应该以某种方式再次使用 stop
和 run
)它也没有改变这个行为,端口已公开但不能 curl
并且由于 127.0.0.1
这是因为您正在使用 docker-compose 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- 在 ports
部分中指定本地主机 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) 更改为 bridge
** 此方法不再适用于较新的 docker 版本 **
4- 从主机的 ip 而不是 127.0.0.1 卷曲
那么问题出在哪里?
看来根本问题来自 docker 桥接方法。 docker 使用 iptables
到 nat INCOMING 连接到正确容器的端口
$ sudo iptables -L|grep 2048
ACCEPT tcp -- anywhere 10.0.0.12 tcp dpt:2048
如您所见,只有 dport
个到 10.0.0.12:2048
等等,如果不使用 docker-compose 呢??
奇怪!但是只要正确地听 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:* LISTEN
默认情况下,docker-compose run
不发布服务的端口。您可以传递 --service-ports
选项来发布在 docker-compose.yml 中定义的端口,或者使用 -p
选项来发布所有端口。