首页 > 解决方案 > 如何在服务器代码中使用 Docker 端口

问题描述

我有用于 Web 的 Docker 映像和用于服务器的另一个映像。我的服务器使用我在服务器和网络中硬编码的特定端口。我还在docker-compose文件中定义了这个端口。

我想正确的方法是仅在 中指定端口docker-compose.yml,然后以某种方式在服务器和 Web 的代码中使用此端口,而不是在三个不同的地方硬编码此端口。

我应该在 中使用环境变量docker-compose.yml吗?什么是最好的解决方案?

标签: dockerdocker-composeport

解决方案


根据我的经验,最好让服务器选择它自己的“正常”端口并在它出现在 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 中明确提及它。


推荐阅读