docker - 如何在服务器代码中使用 Docker 端口
问题描述
我有用于 Web 的 Docker 映像和用于服务器的另一个映像。我的服务器使用我在服务器和网络中硬编码的特定端口。我还在docker-compose
文件中定义了这个端口。
我想正确的方法是仅在 中指定端口docker-compose.yml
,然后以某种方式在服务器和 Web 的代码中使用此端口,而不是在三个不同的地方硬编码此端口。
我应该在 中使用环境变量docker-compose.yml
吗?什么是最好的解决方案?
解决方案
根据我的经验,最好让服务器选择它自己的“正常”端口并在它出现在 Docker 领域的地方进行硬编码。
假设我有一个服务器进程,可能是我用 Go 编写的,我决定它想监听端口 12345。然后:
通常的 Go 约定是让服务器采用可选的命令行参数,例如
-bind 0.0.0.0:12345
为进程指定绑定地址和端口,但我将在我的 Docker 容器中将其保留为默认值。我的服务器 Dockerfile 将
EXPOSE 12345
主要作为文档。对于客户端,我会明确地有一个选项
-server_url http://server:12345
,我也可以通过环境变量进行设置SERVER_URL=http://server:12345
。它的默认值可能是指向localhost
最简单的面向开发人员的设置。在我的
docker-compose.yml
我必须明确提到服务器块右侧的端口ports:
,如果我有的话,并且在客户端的SERVER_URL
.version: '3' services: server: build: ./server ports: ['12345:12345'] client: build: ./client environment: SERVER_URL: 'http://server:12345' ports: ['24680:24680']
请注意,这ports:
是可选的,如果您不希望能够从 Docker 外部连接到后端服务,则不需要它。另请注意,端口不需要相同,并且尽可能使用“普通”端口进行处理是有好处的。例如,如果服务器使用普通的 HTTP 端口 80,我就不必在客户端 URL 中明确提及它。
推荐阅读
- ocaml - 此表达式具有单元类型,但表达式应为字符串类型
- reactjs - 如何使用是的验证 firstName 中的每个字符?
- c# - .net core 3.0 使用 Policy、AuthenticationSchemes 授权属性
- pandas - 大熊猫中日期时间列的分组最后值
- string - Google Scripts 错误 SyntaxError: Unexpected token < (line 119, file "Code")
- python - 如何将shell输出转换为python字典
- java - 在java中将拉丁语1补充unicode转换为字符串
- macos - 从启动服务中隐藏 NSDocument 子类
- excel - 复制参数不适用于 Range 对象
- docker - docker容器之间的连接作为本地主机