class_docstr: Docker cluster wrapper.
  
  Creates a directory for starting a fake multinode docker cluster.
  
  Includes APIs to update the cluster config as needed in tests,
  and to start and connect to the cluster.
class_docstr_tok: ["Docker","cluster","wrapper",".","Creates","a","directory","for","starting","a","fake","multinode","docker","cluster",".","Includes","APIs","to","update","the","cluster","config","as","needed","in","tests",",","and","to","start","and","connect","to","the","cluster","."]
code: def _update_nodes(self):
      with open(self._nodes_file, "rt") as f:
          self._nodes = json.load(f)
  
imports: import json
  import logging
  import os
  import random
  import shutil
  import subprocess
  import sys
  import tempfile
  import threading
  import time
  from typing import Any, Dict, Optional
  import yaml
  import ray
  from ray._private.dict import deep_update
  from ray.autoscaler._private.fake_multi_node.node_provider import FAKE_DOCKER_DEFAULT_CLIENT_PORT, FAKE_DOCKER_DEFAULT_GCS_PORT
  from ray.util.queue import Empty, Queue
label_desc: Use image node_id 18 for calling the DockerCluster obj's underlying member method code with example usage: obj._update_nodes() without return types