docker - 如何确保容器中的 Web 应用成功绑定(bind)到端口?

标签 docker docker-compose

我在 docker 容器中运行简单的 Web 应用程序(node.js)。应用程序监听本地端口 5000,该端口在主机上的 8080 上公开。我想运行将在主机上运行的自动测试,并向我的应用程序发出 HTTP 请求。问题是当我使用 docker run 启动应用程序时我不知道应用程序何时准备就绪(当它开始监听主机上的 8080 端口时)。我可以使用足够长的简单超时来确保容器启动并且应用程序开始监听请求,但也许有更聪明的方法来做到这一点?

我也在使用docker-compose我想知道它是如何知道容器“可以使用”的?考虑以下 docker-compose.yml 文件:

web:
  image: myapp:latest
  ports:
    - 8080:5000
  links:
    - postgres
postgres:
  image: postgres

我知道 docker-compose 以正确的顺序启动容器,所以在这个例子中它将首先启动 postgres,然后是 web 容器。但是 postgres 容器在启动时需要一些时间来初始化并准备好接受与数据库的连接。所以理论上 web 容器可以在 postgres 容器准备好接受连接之前启动,对吧?

最佳答案

我认为这是一个普遍的问题。我一直通过实现基本的健康检查和轮询来解决它。健康检查将取决于服务,但它看起来像这样:

start_time = time.time()
while start_time + max_wait_time > time.time():
    if healthcheck():
        return

healthcheck 应该是对服务提出真正请求的东西。对于将是 SQL 查询的 postgres。因为你真正关心的是 webapp 的可用性。我会向访问数据库的端点发出 HTTP 请求。当请求成功并带有 200 代码时,您就知道它已准备就绪。

关于docker - 如何确保容器中的 Web 应用成功绑定(bind)到端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33035937/

相关文章:

asp.net - Docker for Windows 构建为 COPY 添加了前缀 `/var/lib/docker/tmp/`?

Docker在构建时被系统杀死

docker - Docker-Windows容器无法解析主机

Docker 组合忽略容器中的 ipv4_address

ruby - 有什么方法可以为Docker编译和静态链接ruby库吗?

java - JMeter-docker-java.net.connectexception

docker - 使用 nginx 的 docker certbot 容器检索证书时的用户权限问题

python - 无法使用 REST API 调用访问/下载 Docker 容器内生成的文件夹

docker-compose up 失败并显示 "Unable to find a node that satisfies the following conditions "

docker - 使用 Go 应用程序 : cannot find package 构建 Docker