首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Docker编写运行时的端口发布

使用Docker编写运行时的端口发布
EN

Stack Overflow用户
提问于 2016-03-30 21:35:26
回答 2查看 77.1K关注 0票数 44

我似乎无法找到一种方法,使端口发布能够以与docker run相同的方式与docker run一起工作。

使用Docker (因此docker-compose.yml中的端口映射)将从curl中产生一个“连接失败”错误

代码语言:javascript
复制
$ 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时,情况很好。

代码语言:javascript
复制
$ 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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
version: '2'
services:
  flask:
    build: .
    ports:
      - "2048:2048"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-30 22:59:58

默认情况下,docker-compose run不发布服务的端口。您可以传递--service-ports选项来发布端口,因为端口是在docker-compose.yml中定义的,或者使用-p选项发布所有端口。

请参阅船坞-组合运行的文档

票数 49
EN

Stack Overflow用户

发布于 2016-03-30 22:56:41

编辑

尝试使用--service-ports (它不适用于up命令,我们应该以某种方式再次使用stoprun ),它也不会改变这种行为,端口是公开的,但是由于127.0.0.1提到的原因,不能curl和不可访问

这是因为您使用的是停靠-编写2语法。

默认情况下,它在每个组合项目容器之间创建一个内部网络(或在某些情况下为覆盖网络)。

您可以使用docker inspect <container_name>获取容器网络状态。

同时,使用netstat,它会给出一个来自docker的奇怪行为,而这个行为似乎只侦听tcp6接口:

代码语言:javascript
复制
$ sudo netstat -lt|grep 2048

  tcp6       0      0 [::]:2048           [::]:*         LISTEN      501/docker

可能的解决办法:

1-从外部主机卷曲!它起作用:)

代码语言:javascript
复制
C:\Users\pooya>curl host:2048
Hello World!

2-在部分指定本地主机IP (127.0.0.1):

代码语言:javascript
复制
$ 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使用iptablesnat传入到正确容器端口的连接

代码语言:javascript
复制
$ 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,一切都很好:)

代码语言:javascript
复制
$ 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
票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36320172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档