如何检测docker集装箱是否坠毁

我每5分钟运行一个进程,检查一下每个容器。 如果容器没有响应,我可以将其标记为closures。 我有容器的IP地址,我通过每个IP循环,并检查它是否响应一个ping。 如果没有,我将其标记为closures。 有一个更好的方法吗? 我的代码:

@Transactional @Scheduled(fixedRate = 1000 * 60) //5 min public void monitorHosts(){ Iterable<Ncl> ncls = nclRepository.findAll(); for(Ncl ncl: ncls){ for(String host: ncl.getHosts()){ Boolean isHostAlive = isHostAlive(host); if(!isHostAlive){ Ncl nclWorking = nclRepository.findOne(ncl.getUuid()); if(nclWorking != null){ Set<String> hosts = nclWorking.getHosts().stream().filter(x -> x.equals(host)).collect(Collectors.toSet()); nclWorking.getHosts().clear(); nclWorking = nclRepository.save(nclWorking); nclWorking.setHosts(hosts); nclRepository.save(nclWorking); } } } } } private Boolean isHostAlive(String host){ try{ InetAddress address = InetAddress.getByName(host); boolean reachable = address.isReachable(10000); return reachable; } catch (Exception e){ e.printStackTrace(); return false; } } 

它主要取决于你需要做什么与你的容器的信息。

有一些监测解决scheme可用,可以监测你的容器,并通知某人,如果有一些麻烦。

如果必须在某些应用程序中使用此信息,则可以使用Consul.io等一些解决scheme,并让它们检查服务状态,而不是容器(大多数情况下,人们知道容器中的服务可用性,而不是容器本身)。 或者,您可以使用docker-api for Java,因为ICMP协议并不总是一个好的解决scheme,特别是在分布式networking中。

我会使用docker events

从文档中提取

https://docs.docker.com/engine/reference/commandline/events/#examples

使用类似的东西

docker events --filter 'event=stop'

这是更突出的,但是是一个很好的:

使用HEALTHCHECK 提供的 HEALTHCHECK

您可以为每个应用程序定制它。 就像是:

 HEALTHCHECK --interval=5m --timeout=3s \ CMD curl -f http://localhost/ || exit 1 

那么你可以检查健康状况如下:

 docker inspect --format='{{json .State.Health}}' <container_id> 

或者您可以使用docker ps并查看STATUS列:

 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 225426fc7c93 ubuntu "tail -f /dev/null" 5 seconds ago Up 4 seconds (healthy) 

或者你可以查询docker API:

 curl --unix-socket /var/run/docker.sock http:/v1.24/containers/json 

PS:您可以在docker docker run时设置健康检查(无需修改Dockerfile)。 文件