docker 暴露多个端口怎么区分?

2018-03-07 11:53:11 +08:00
 mmnnyycc

https://www.cockroachlabs.com/docs/stable/start-a-local-cluster-in-docker.html#os-linux

里面: -p 26257:26257 -p 8080:8080

解释: -p 26257:26257 -p 8080:8080: These flags map the default port for inter-node and client-node communication (26257) and the default port for HTTP requests to the Admin UI (8080) from the container to the host. This enables inter-container communication and makes it possible to call up the Admin UI from a browser.

我又个疑惑: 8080 是管理后台 UI 的端口,26257 是集群减通信的端口号。外部 8080 被占用了可以用 8081:8080 来映射。

1.请问容器内部端口可以换吗?就是 26257 和 8080,如果可以换怎么分区这两个?

2.多个不同的容器内部都用 8080 会冲突吗?

3546 次点击
所在节点    问与答
6 条回复
heimeil
2018-03-07 12:07:21 +08:00
容器内端口是隔离的,可以想象每个容器都是虚拟机
tomczhen
2018-03-07 12:18:25 +08:00
bridge 网络下可以把主机看成路由器,外部是通过 NAT 访问的,与路由器上的端口映射类似,同一个 Network 下的容器是同一台交换机下不同设备,每个容器可用端口范围都是独立的。

容器间互访,可以通过容器内网 IP 和 内网端口——即容器自身端口。外部想访问容器,就必须把容器端口 EXPOSE ——映射出来,暴露的端口属于主机端口,是不能冲突的。
mmnnyycc
2018-03-07 13:59:55 +08:00
@heimeil
@tomczhen 谢谢
tomczhen
2018-03-07 14:08:07 +08:00
补充一下,bridge 网络下,内外端口不一致时可能会产生一些问题。比如服务检测到的配置或环境,是容器内网 IP 和端口,如果一些自动生成的 URI 会使用这些值,就会产生问题。

另外就算映射了端口,外部客户端也是无法通过容器内网 IP 访问容器。

不过也应该不是绝对,如果路由可达应该可以,但这时应该也不算是 bridge 网络了。
mmnnyycc
2018-03-07 14:13:39 +08:00
@tomczhen 不同容器端口是独立的,外部的 8080 端口已经被占用了。那么只能讲内部 8080 映射到外部的其他的接口了,如果内外不一致会出问题,可以更改内部的 8080 端口吗?看着文档没说啊
tomczhen
2018-03-07 14:22:16 +08:00
出不出问题要看具体情况。

修改内部端口确保内外端口一致我觉得是最优解,也容易排查问题。

Web 应用,如果有可以配置 URL root 的选项配置最好,没有可以使用反向代理解决。

如果是一定会把检测到的容器内 IP 返回给外部客户端使用,那用 host 网络运行容器是最直接的做法。当然,也可以看看其他网络类型能不能解决问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/435693

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX