如何检测docker容器是否崩溃

时间:2017-05-26 14:22:28

标签: 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;
    }
}

3 个答案:

答案 0 :(得分:2)

这主要取决于您对容器信息的需求。

有许多可用的监控解决方案,可以监控您的容器并在遇到麻烦时通知某人。

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

答案 1 :(得分:2)

我会使用docker events

从文档中提取

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

使用类似

的内容

docker events --filter 'event=stop'

答案 2 :(得分:1)

这更加突兀但是很好看:

使用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) 列:

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

或者您可以查询docker API:

docker run

PS:您可以在snc_redis: clients: default: type: predis alias: default dsn: redis://localhost doctrine: metadata_cache: client: default entity_manager: default document_manager: default result_cache: client: default entity_manager: [default, read] query_cache: client: default entity_manager: default 时设置运行状况检查(无需修改Dockerfile)。 docker provides