anchor.diff:      ok.
   
   -spec start_node(node_state()) -> node_state().
  -start_node(#{container_id := ID, hostname := Name} = NodeState) ->
  +start_node(NodeState) ->
  +    #{container_id := ID, hostname := Name, sockets := Sockets} = NodeState,
  +    [gen_tcp:close(S) || S <- Sockets],
       aest_docker_api:start_container(ID),
       log(NodeState, "Container ~p [~s] started", [Name, ID]),
  -    NodeState.
  +    NodeState#{sockets := []}.
   
   -spec stop_node(node_state(), stop_node_options()) -> node_state().
   stop_node(#{container_id := ID, hostname := Name} = NodeState, Opts) ->
  
positive.code:     pubkey := binary(),         % Public part of the peer key
      privkey := binary(),        % Private part of the peer key
      exposed_ports := #{service_label() => pos_integer()},
      local_ports := #{service_label() => pos_integer()}
  }.
  
  -type start_options() :: #{
  
negative.code:     {ok, Socket} = gen_tcp:listen(0, [{reuseaddr, true}]),
      {ok, Port} = inet:port(Socket),
      gen_tcp:close(Socket),
      {ok, Port, Socket}.
  
  allocate_ports(Labels) -> allocate_ports(Labels, #{}, []).
  
  allocate_ports([], Ports, Sockets) -> {Ports, Sockets};
  allocate_ports([Label | Labels], Ports, Sockets) ->
      {ok, Port, Socket} = free_port(),
      allocate_ports(Labels, Ports#{Label => Port}, [Socket | Sockets]).
  
  
  format(Fmt, Args) ->
  