2017-05-26 52 views
4

我每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; 
    } 
} 
+0

在cron作業上編寫shell腳本不是更好嗎? – CSK

+0

你能澄清你在這裏想達到的目標嗎?您是否正在測試運行Docker容器的一組主機已啓動?或者你是否試圖在特定的主機上測試一組給定的容器正在運行? –

+0

你的第二個陳述。主機=容器IP地址。主機是容器的IP地址。我有一個所有容器IP地址的列表。然後我通過容器ips進行循環。當我找到一個不可達的IP時,我將其刪除。 – Luke101

回答

2

它主要取決於您需要如何處理有關容器的信息。

有一些監測解決方案可用,它們可以監測您的容器並在出現問題時通知某些人。

如果在一些應用程序中使用這些信息,那麼你可以使用一些解決方案,如Consul.io,讓他們來檢查您的服務狀態,而不是容器(在大多數情況下,男人知道在容器中的服務可用性,而不是容器本身)。或者您可以使用docker-api用於Java,因爲ICMP協議並不總是一個好的解決方案,尤其是在分佈式網絡中。

1

這是比較突兀,但是是一個很好的一個:

使用HEALTHCHECKdocker provides

您可以爲每個應用程序定製它。喜歡的東西:

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) 

或者你也可以查詢碼頭API:

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

PS:您可以在docker run時間(無需修改Dockerfile)設置健康檢查。 Docs