public void startContainer(InstanceStartRequest request, InstanceStartResponse response) {
    logger.info(String.format("begin startContainer: %s", request));

    try {
      // 1. create cmd
      StartContainerCmd startContainerCmd =
          dockerClient.startContainerCmd(request.getContainerId());

      // 2. invoke post processor before start container
      StartContainerContext startContainerContext =
          buildStartContainerContext(request, startContainerCmd);
      applyStartContainerProcessorsBeforeStart(startContainerContext);

      // 3. exec cmd
      startContainerCmd.exec();

      // 4. invoke post processor after start container
      applyStartContainerProcessorsAfterStart(startContainerContext);

      response.success();
    } catch (Exception e) {
      response.fail(e.toString());
      logger.error(String.format("error startContainer: %s", request), e);
    }

    logger.info(String.format("end startContainer: %s", response));
  }
  @Override
  public void stopContainer(InstanceStopRequest request, InstanceStopResponse response) {
    logger.info(String.format("begin stopContainer: %s", request));

    try {
      // 1. create cmd
      StopContainerCmd stopContainerCmd = dockerClient.stopContainerCmd(request.getContainerId());

      // 2. invoke post processors before stopContainer container

      // 3. exec cmd
      stopContainerCmd.exec();

      // 4. invoke post processors after stopContainer container

      response.success();
    } catch (Exception e) {
      response.fail(e.toString());
      logger.error(String.format("stopContainer error: %s", request), e);
    }

    logger.info(String.format("end stopContainer: %s", response));
  }
  public boolean createContainer(InstanceStartRequest request, InstanceStartResponse response) {
    logger.info(String.format("begin createContainer: %s", request));

    String imageId = request.getImageId();
    String containerId;
    try {
      // 1. create cmd
      CreateContainerCmd containerCmd = dockerClient.createContainerCmd(imageId);

      // 2. invoke post processor before create container
      CreateContainerContext createContainerContext =
          buildCreateContainerContext(request, containerCmd);
      applyCreateContainerProcessorsBeforeCreate(createContainerContext);

      // 3. exec cmd
      CreateContainerResponse createContainerResponse = containerCmd.exec();

      // 4. invoke post processor after create container
      applyCreateContainerProcessorsAfterCreate(createContainerContext);

      containerId = createContainerResponse.getId();
      request.setContainerId(containerId);

      if (containerId == null) {
        response.fail("create container failed, created containerId is null!");
      } else {
        response.success();
      }
    } catch (Exception e) {
      response.fail(e.toString());
      logger.error(String.format("error createContainer: %s", request), e);
    }

    logger.info(String.format("end createContainer: %s", response));

    return response.isSuccess();
  }