Docker-compose 容器健康检查的作用


共计 1010 个字符,预计需要花费 3 分钟才能阅读完成。

docker-compose 中,往往会伴随着多个容器的一起的创建和销毁。例如,微服务需要等待 nacos 成功启动以后再进行启动,否则先启动则会启动失败,因为不能在 nocos 上注册自己。

以下是一个简单的案例:

version: '3.1'
services:
  nginx:
    image: nginx
    container_name: nginx
    restart: always
    ports:
      - 80:80
  mysql:
    image: mysql:8.0.26
    container_name: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456

假设 nginx 为一个业务服务,并且需要的数据来自 mysql。此时直接使用 docker-compose up -d 启动,发现 nginx 马上可以访问,因为业务服务比 mysql 启动快,但是此时如果是真正的业务服务,还是不能正常提供服务的。并且,有可能等 mysql 启动完成后,还是连接数据库失败的状态,需要重启业务服务才可以提供服务。

为了避免这种问题的出现,需要让 nginx 在 mysql 成功启动以后才进行启动,可以添加 depends_on 选项,告诉 nginx 依赖 mysql 的启动,等它启动以后自己再启动。当然,加了这个还是不够的,只能保证 nginx 在 mysql 后面启动,但是 nginx 启动太快了,所以还是会先启动完成。所以需要添加启动的条件,即给 mysql 添加健康检查,nginx 等 mysql 启动,并健康检查通过以后再启动,文件如下:

version: '3.1'
services:
  nginx:
    image: nginx
    container_name: nginx
    restart: always
    ports:
      - 80:80
    depends_on:
      mysql:
        condition: service_healthy
  mysql:
    image: mysql:8.0.26
    container_name: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    healthcheck:
      test: ["CMD", "mysql", "-u", "root", "-p123456", "-e", "select 1"]
      interval: 5s
      timeout: 3s
      retries: 10

此时运行启动命令,发现 nginx 需要等待一段时间才可以访问,说明达到了想要的效果。

Tips:清朝云网络工作室

阅读剩余
THE END