java - 如何检测docker容器是否崩溃

标签 java docker

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

@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;
    }
}

最佳答案

这主要取决于您需要如何处理有关容器的信息。

有许多可用的监控解决方案,它们可以监控您的容器并在出现问题时通知某人。

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

关于java - 如何检测docker容器是否崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44203975/

相关文章:

java - 如何缩放和设置MediaView的坐标?

java - 从时间选择器获取时间值 - android

ubuntu - Docker 镜像 Ubuntu 14.04 未连接互联网

networking - 不同的 Docker 1.9 网络可以互相通信吗?

java - Docker 使用 Spring 和 mysql 镜像将推送推送到注册表

docker - 502 错误网关 Nginx 反向代理

java - 如何保存所选文件路径以供下次运行项目时使用?

java - 显示变更需求信息

java - 为什么我的 jar 无法从任务计划程序打开

amazon-web-services - docker 最适合生产环境吗?