【问题标题】:How to use Docker port in the code for server如何在服务器代码中使用 Docker 端口
【发布时间】:2019-06-11 09:31:41
【问题描述】:

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

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

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

【问题讨论】:

    标签: docker docker-compose port


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      Docker Compose 支持Env files,它允许您声明所有环境变量。然后您可以替换端口号using one of the env variables

      env 文件通常是一种很好的做法,因为它可以在切换到另一个环境(例如开发与生产)时轻松换出,并且您可以通过命令行,在运行代码之前。

      对于支持读取这些文件的许多编程语言都有很好的库,例如Dotenv for Node.js

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-31
        • 1970-01-01
        • 2013-01-27
        • 2016-12-10
        • 2014-03-06
        • 1970-01-01
        • 2012-01-25
        • 1970-01-01
        相关资源
        最近更新 更多