You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ji...@apache.org on 2022/02/15 16:38:00 UTC

[shardingsphere] branch master updated: Split DockerITContainer and EmbeddedITContainer (#15427)

This is an automated email from the ASF dual-hosted git repository.

jianglongtao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new d8ee21f  Split DockerITContainer and EmbeddedITContainer (#15427)
d8ee21f is described below

commit d8ee21fb37f602512bafc4aa925450a52354658c
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Wed Feb 16 00:35:08 2022 +0800

    Split DockerITContainer and EmbeddedITContainer (#15427)
    
    * Add ITContainer
    
    * Add DockerITContainer
    
    * Refactor DockerITContainer
    
    * Refactor DockerStorageContainer
    
    * Refactor MySQLContainer
    
    * Refactor GovernanceContainer
    
    * Refactor ComposedContainerRegistry
    
    * Refactor ComposedContainerRegistry
    
    * Refactor ShardingSphereProxyContainer
    
    * Refactor ShardingSphereJDBCContainer
    
    * Refactor AdapterContainer
    
    * Remove isFakedContainer
---
 ...AtomicContainer.java => DockerITContainer.java} | 24 ++----
 .../EmbeddedITContainer.java}                      | 28 +------
 .../ITContainer.java}                              | 30 ++------
 .../{AtomicContainers.java => ITContainers.java}   | 40 ++++++----
 .../container/atomic/adapter/AdapterContainer.java | 14 +---
 .../atomic/adapter/AdapterContainerFactory.java    |  6 +-
 .../adapter/impl/ShardingSphereJDBCContainer.java  | 40 +++-------
 .../adapter/impl/ShardingSphereProxyContainer.java | 15 +---
 .../atomic/governance/GovernanceContainer.java     | 10 +--
 .../atomic/governance/impl/ZookeeperContainer.java |  2 +-
 ...eContainer.java => DockerStorageContainer.java} | 33 +++-----
 ...ontainer.java => EmbeddedStorageContainer.java} | 42 ++---------
 .../container/atomic/storage/StorageContainer.java | 87 +++++++---------------
 .../container/atomic/storage/impl/H2Container.java | 19 ++---
 .../atomic/storage/impl/MySQLContainer.java        | 16 ++--
 .../atomic/storage/impl/PostgreSQLContainer.java   | 12 +--
 .../container/compose/ComposedContainer.java       |  9 +--
 .../compose/ComposedContainerRegistry.java         | 15 ++--
 .../compose/mode/ClusterComposedContainer.java     | 23 +++---
 .../compose/mode/MemoryComposedContainer.java      | 23 +++---
 20 files changed, 166 insertions(+), 322 deletions(-)

diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/AtomicContainer.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/DockerITContainer.java
similarity index 74%
rename from shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/AtomicContainer.java
rename to shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/DockerITContainer.java
index 8ca40ce..e4a98ff 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/AtomicContainer.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/DockerITContainer.java
@@ -30,38 +30,28 @@ import java.util.Collection;
 import java.util.stream.Collectors;
 
 /**
- * Atomic container.
+ * Docker IT container.
  */
-@Slf4j
 @Getter
-public abstract class AtomicContainer extends GenericContainer<AtomicContainer> {
+@Slf4j
+public abstract class DockerITContainer extends GenericContainer<DockerITContainer> implements ITContainer {
     
     private final String name;
     
-    private final boolean isFakedContainer;
-    
-    public AtomicContainer(final String name, final String dockerImageName, final boolean isFakedContainer) {
-        super(getDockerImage(dockerImageName, isFakedContainer));
+    public DockerITContainer(final String name, final String dockerImageName) {
+        super(new RemoteDockerImage(DockerImageName.parse(dockerImageName)));
         this.name = name;
-        this.isFakedContainer = isFakedContainer;
-    }
-    
-    private static RemoteDockerImage getDockerImage(final String imageName, final boolean isFakedContainer) {
-        RemoteDockerImage result = new RemoteDockerImage(DockerImageName.parse(imageName));
-        return isFakedContainer ? result.withImagePullPolicy(dockerName -> false) : result;
     }
     
     @Override
     public void start() {
         startDependencies();
-        if (!isFakedContainer) {
-            super.start();
-        }
+        super.start();
         execute();
     }
     
     private void startDependencies() {
-        Collection<AtomicContainer> dependencies = getDependencies().stream().map(each -> (AtomicContainer) each).collect(Collectors.toList());
+        Collection<DockerITContainer> dependencies = getDependencies().stream().filter(each -> each instanceof DockerITContainer).map(each -> (DockerITContainer) each).collect(Collectors.toList());
         dependencies.stream().filter(each -> !each.isCreated()).forEach(GenericContainer::start);
         dependencies.stream()
                 .filter(each -> {
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/ComposedContainer.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/EmbeddedITContainer.java
similarity index 63%
copy from shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/ComposedContainer.java
copy to shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/EmbeddedITContainer.java
index 78665fc..e9039d1 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/ComposedContainer.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/EmbeddedITContainer.java
@@ -15,32 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.test.integration.framework.container.compose;
-
-import javax.sql.DataSource;
-import java.util.Map;
+package org.apache.shardingsphere.test.integration.framework.container.atomic;
 
 /**
- * Composed container.
+ * Embedded IT container.
  */
-public interface ComposedContainer extends AutoCloseable {
-    
-    /**
-     * Start composed container.
-     */
-    void start();
-    
-    /**
-     * Get actual data source map.
-     *
-     * @return actual data source map
-     */
-    Map<String, DataSource> getActualDataSourceMap();
-    
-    /**
-     * Get target data source.
-     * 
-     * @return target data source
-     */
-    DataSource getTargetDataSource();
+public interface EmbeddedITContainer extends ITContainer {
 }
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/ComposedContainer.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/ITContainer.java
similarity index 63%
copy from shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/ComposedContainer.java
copy to shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/ITContainer.java
index 78665fc..14250c4 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/ComposedContainer.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/ITContainer.java
@@ -15,32 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.test.integration.framework.container.compose;
+package org.apache.shardingsphere.test.integration.framework.container.atomic;
 
-import javax.sql.DataSource;
-import java.util.Map;
+import org.testcontainers.lifecycle.Startable;
 
 /**
- * Composed container.
+ * IT container.
  */
-public interface ComposedContainer extends AutoCloseable {
+public interface ITContainer extends Startable {
     
-    /**
-     * Start composed container.
-     */
-    void start();
-    
-    /**
-     * Get actual data source map.
-     *
-     * @return actual data source map
-     */
-    Map<String, DataSource> getActualDataSourceMap();
-    
-    /**
-     * Get target data source.
-     * 
-     * @return target data source
-     */
-    DataSource getTargetDataSource();
+    @Override
+    default void stop() {
+    }
 }
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/AtomicContainers.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/ITContainers.java
similarity index 64%
rename from shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/AtomicContainers.java
rename to shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/ITContainers.java
index 7d0c589..f1905c3 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/AtomicContainers.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/ITContainers.java
@@ -21,6 +21,7 @@ import lombok.RequiredArgsConstructor;
 import org.slf4j.LoggerFactory;
 import org.testcontainers.containers.Network;
 import org.testcontainers.containers.output.Slf4jLogConsumer;
+import org.testcontainers.lifecycle.Startable;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -28,16 +29,18 @@ import java.util.LinkedList;
 import java.util.concurrent.TimeUnit;
 
 /**
- * Atomic containers.
+ * IT containers.
  */
 @RequiredArgsConstructor
-public final class AtomicContainers implements AutoCloseable {
+public final class ITContainers implements Startable {
     
     private final String scenario;
     
     private final Network network = Network.newNetwork();
     
-    private final Collection<AtomicContainer> containers = new LinkedList<>();
+    private final Collection<EmbeddedITContainer> embeddedContainers = new LinkedList<>();
+    
+    private final Collection<DockerITContainer> dockerContainers = new LinkedList<>();
     
     private volatile boolean started;
     
@@ -50,23 +53,27 @@ public final class AtomicContainers implements AutoCloseable {
      * @param <T> type of ShardingSphere container
      * @return registered container
      */
-    public <T extends AtomicContainer> T registerContainer(final String testSuiteName, final T container, final String containerType) {
-        container.setNetwork(network);
-        container.setNetworkAliases(Collections.singletonList(String.join(".", containerType.toLowerCase(), scenario, "host")));
-        String loggerName = String.join(":", testSuiteName, container.getName());
-        container.withLogConsumer(new Slf4jLogConsumer(LoggerFactory.getLogger(loggerName), true));
-        containers.add(container);
+    public <T extends ITContainer> T registerContainer(final String testSuiteName, final T container, final String containerType) {
+        if (container instanceof EmbeddedITContainer) {
+            embeddedContainers.add((EmbeddedITContainer) container);
+        } else {
+            DockerITContainer dockerContainer = (DockerITContainer) container;
+            dockerContainer.setNetwork(network);
+            dockerContainer.setNetworkAliases(Collections.singletonList(String.join(".", containerType.toLowerCase(), scenario, "host")));
+            String loggerName = String.join(":", testSuiteName, dockerContainer.getName());
+            dockerContainer.withLogConsumer(new Slf4jLogConsumer(LoggerFactory.getLogger(loggerName), true));
+            dockerContainers.add(dockerContainer);
+        }
         return container;
     }
     
-    /**
-     * Start containers.
-     */
+    @Override
     public void start() {
         if (!started) {
             synchronized (this) {
                 if (!started) {
-                    containers.stream().filter(each -> !each.isCreated()).forEach(AtomicContainer::start);
+                    embeddedContainers.forEach(EmbeddedITContainer::start);
+                    dockerContainers.stream().filter(each -> !each.isCreated()).forEach(DockerITContainer::start);
                     waitUntilReady();
                     started = true;
                 }
@@ -75,7 +82,7 @@ public final class AtomicContainers implements AutoCloseable {
     }
     
     private void waitUntilReady() {
-        containers.stream()
+        dockerContainers.stream()
                 .filter(each -> {
                     try {
                         return !each.isHealthy();
@@ -96,7 +103,8 @@ public final class AtomicContainers implements AutoCloseable {
     }
     
     @Override
-    public void close() {
-        containers.forEach(AtomicContainer::close);
+    public void stop() {
+        embeddedContainers.forEach(Startable::close);
+        dockerContainers.forEach(Startable::close);
     }
 }
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/AdapterContainer.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/AdapterContainer.java
index b80c381..9c97f0f 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/AdapterContainer.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/AdapterContainer.java
@@ -17,22 +17,14 @@
 
 package org.apache.shardingsphere.test.integration.framework.container.atomic.adapter;
 
-import org.apache.shardingsphere.test.integration.framework.container.atomic.AtomicContainer;
+import org.apache.shardingsphere.test.integration.framework.container.atomic.ITContainer;
 
 import javax.sql.DataSource;
 
 /**
  * Adapter container.
  */
-public abstract class AdapterContainer extends AtomicContainer {
-    
-    public AdapterContainer(final String dockerName, final String dockerImageName) {
-        this(dockerName, dockerImageName, false);
-    }
-    
-    public AdapterContainer(final String name, final String dockerImageName, final boolean isFakedContainer) {
-        super(name, dockerImageName, isFakedContainer);
-    }
+public interface AdapterContainer extends ITContainer {
     
     /**
      * Get target data source.
@@ -40,5 +32,5 @@ public abstract class AdapterContainer extends AtomicContainer {
      * @param serverLists server lists
      * @return target data source
      */
-    public abstract DataSource getTargetDataSource(String serverLists);
+    DataSource getTargetDataSource(String serverLists);
 }
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/AdapterContainerFactory.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/AdapterContainerFactory.java
index 2cbaceb..cb80768 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/AdapterContainerFactory.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/AdapterContainerFactory.java
@@ -22,6 +22,7 @@ import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.test.integration.framework.container.atomic.adapter.impl.ShardingSphereJDBCContainer;
 import org.apache.shardingsphere.test.integration.framework.container.atomic.adapter.impl.ShardingSphereProxyContainer;
+import org.apache.shardingsphere.test.integration.framework.container.atomic.storage.StorageContainer;
 
 /**
  * Adapter container factory.
@@ -34,15 +35,16 @@ public final class AdapterContainerFactory {
      *
      * @param adapter adapter
      * @param databaseType database type
+     * @param storageContainer storage container
      * @param scenario scenario
      * @return new instance of adapter container
      */
-    public static AdapterContainer newInstance(final String adapter, final DatabaseType databaseType, final String scenario) {
+    public static AdapterContainer newInstance(final String adapter, final DatabaseType databaseType, final StorageContainer storageContainer, final String scenario) {
         switch (adapter) {
             case "proxy":
                 return new ShardingSphereProxyContainer(databaseType, scenario);
             case "jdbc":
-                return new ShardingSphereJDBCContainer(scenario);
+                return new ShardingSphereJDBCContainer(storageContainer, scenario);
             default:
                 throw new RuntimeException(String.format("Adapter [%s] is unknown.", adapter));
         }
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/impl/ShardingSphereJDBCContainer.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/impl/ShardingSphereJDBCContainer.java
index 02ffa12..641f01f 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/impl/ShardingSphereJDBCContainer.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/impl/ShardingSphereJDBCContainer.java
@@ -17,57 +17,39 @@
 
 package org.apache.shardingsphere.test.integration.framework.container.atomic.adapter.impl;
 
-import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
+import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
 import org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory;
 import org.apache.shardingsphere.infra.yaml.config.pojo.YamlRootConfiguration;
 import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
 import org.apache.shardingsphere.test.integration.env.EnvironmentPath;
+import org.apache.shardingsphere.test.integration.framework.container.atomic.EmbeddedITContainer;
 import org.apache.shardingsphere.test.integration.framework.container.atomic.adapter.AdapterContainer;
 import org.apache.shardingsphere.test.integration.framework.container.atomic.storage.StorageContainer;
-import org.testcontainers.lifecycle.Startable;
 
 import javax.sql.DataSource;
 import java.io.File;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.sql.SQLException;
-import java.util.Map;
 import java.util.Objects;
-import java.util.Optional;
-import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * ShardingSphere JDBC container.
  */
-public final class ShardingSphereJDBCContainer extends AdapterContainer {
+@RequiredArgsConstructor
+public final class ShardingSphereJDBCContainer implements EmbeddedITContainer, AdapterContainer {
     
-    private final String scenario;
-    
-    private final AtomicBoolean isHealthy = new AtomicBoolean();
+    private final StorageContainer storageContainer;
     
-    private Map<String, DataSource> dataSourceMap;
+    private final String scenario;
     
     private final AtomicReference<DataSource> targetDataSourceProvider = new AtomicReference<>();
     
-    public ShardingSphereJDBCContainer(final String scenario) {
-        super("ShardingSphere-JDBC", "ShardingSphere-JDBC", true);
-        this.scenario = scenario;
-    }
-    
     @Override
     public void start() {
-        super.start();
-        dataSourceMap = findStorageContainer().getActualDataSourceMap();
-        isHealthy.set(true);
-    }
-    
-    private StorageContainer findStorageContainer() {
-        Optional<Startable> result = getDependencies().stream().filter(each -> each instanceof StorageContainer).findFirst();
-        Preconditions.checkState(result.isPresent());
-        return (StorageContainer) result.get();
     }
     
     @Override
@@ -76,7 +58,8 @@ public final class ShardingSphereJDBCContainer extends AdapterContainer {
         if (Objects.isNull(dataSource)) {
             if (Strings.isNullOrEmpty(serverLists)) {
                 try {
-                    targetDataSourceProvider.set(YamlShardingSphereDataSourceFactory.createDataSource(dataSourceMap, new File(EnvironmentPath.getRulesConfigurationFile(scenario))));
+                    targetDataSourceProvider.set(
+                            YamlShardingSphereDataSourceFactory.createDataSource(storageContainer.getActualDataSourceMap(), new File(EnvironmentPath.getRulesConfigurationFile(scenario))));
                 } catch (final SQLException | IOException ex) {
                     throw new RuntimeException(ex);
                 }
@@ -91,11 +74,6 @@ public final class ShardingSphereJDBCContainer extends AdapterContainer {
     private DataSource createGovernanceClientDataSource(final String serverLists) {
         YamlRootConfiguration rootConfig = YamlEngine.unmarshal(new File(EnvironmentPath.getRulesConfigurationFile(scenario)), YamlRootConfiguration.class);
         rootConfig.getMode().getRepository().getProps().setProperty("server-lists", serverLists);
-        return YamlShardingSphereDataSourceFactory.createDataSource(dataSourceMap, YamlEngine.marshal(rootConfig).getBytes(StandardCharsets.UTF_8));
-    }
-    
-    @Override
-    public boolean isHealthy() {
-        return isHealthy.get();
+        return YamlShardingSphereDataSourceFactory.createDataSource(storageContainer.getActualDataSourceMap(), YamlEngine.marshal(rootConfig).getBytes(StandardCharsets.UTF_8));
     }
 }
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/impl/ShardingSphereProxyContainer.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/impl/ShardingSphereProxyContainer.java
index d0d3ad2..ee48029 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/impl/ShardingSphereProxyContainer.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/adapter/impl/ShardingSphereProxyContainer.java
@@ -28,6 +28,7 @@ import org.apache.shardingsphere.infra.metadata.user.yaml.config.YamlUsersConfig
 import org.apache.shardingsphere.infra.yaml.engine.YamlEngine;
 import org.apache.shardingsphere.proxy.config.yaml.YamlProxyServerConfiguration;
 import org.apache.shardingsphere.test.integration.env.DataSourceEnvironment;
+import org.apache.shardingsphere.test.integration.framework.container.atomic.DockerITContainer;
 import org.apache.shardingsphere.test.integration.framework.container.atomic.adapter.AdapterContainer;
 import org.testcontainers.containers.BindMode;
 import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy;
@@ -44,7 +45,7 @@ import java.util.concurrent.atomic.AtomicReference;
  * ShardingSphere proxy container.
  */
 @Slf4j
-public final class ShardingSphereProxyContainer extends AdapterContainer {
+public final class ShardingSphereProxyContainer extends DockerITContainer implements AdapterContainer {
     
     private static final String AGENT_HOME_IN_CONTAINER = "/usr/local/shardingsphere-agent";
     
@@ -57,11 +58,7 @@ public final class ShardingSphereProxyContainer extends AdapterContainer {
     private final AtomicReference<DataSource> targetDataSourceProvider = new AtomicReference<>();
     
     public ShardingSphereProxyContainer(final DatabaseType databaseType, final String scenario) {
-        this(null, databaseType, scenario);
-    }
-    
-    public ShardingSphereProxyContainer(final String dockerName, final DatabaseType databaseType, final String scenario) {
-        super(Objects.isNull(dockerName) ? "ShardingSphere-Proxy" : dockerName, "apache/shardingsphere-proxy-test");
+        super("ShardingSphere-Proxy", "apache/shardingsphere-proxy-test");
         this.databaseType = databaseType;
         this.scenario = scenario;
     }
@@ -108,12 +105,6 @@ public final class ShardingSphereProxyContainer extends AdapterContainer {
     }
     
     @Override
-    protected void execute() {
-        log.info("Mapped port 3307: {}", getMappedPort(3307));
-        log.info("Mapped port 3308: {}", getMappedPort(3308));
-    }
-    
-    @Override
     public DataSource getTargetDataSource(final String serverLists) {
         DataSource dataSource = targetDataSourceProvider.get();
         if (Objects.isNull(dataSource)) {
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/governance/GovernanceContainer.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/governance/GovernanceContainer.java
index f8438b4..cd81a2a 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/governance/GovernanceContainer.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/governance/GovernanceContainer.java
@@ -17,17 +17,15 @@
 
 package org.apache.shardingsphere.test.integration.framework.container.atomic.governance;
 
-import org.apache.shardingsphere.test.integration.framework.container.atomic.AtomicContainer;
-import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy;
+import org.apache.shardingsphere.test.integration.framework.container.atomic.DockerITContainer;
 
 /**
  * Governance container.
  */
-public abstract class GovernanceContainer extends AtomicContainer {
+public abstract class GovernanceContainer extends DockerITContainer {
     
-    public GovernanceContainer(final String name, final String dockerImageName, final boolean isFakedContainer) {
-        super(name, dockerImageName, isFakedContainer);
-        setWaitStrategy(new LogMessageWaitStrategy().withRegEx(".*PrepRequestProcessor \\(sid:[0-9]+\\) started.*"));
+    public GovernanceContainer(final String name, final String dockerImageName) {
+        super(name, dockerImageName);
     }
     
     /**
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/governance/impl/ZookeeperContainer.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/governance/impl/ZookeeperContainer.java
index 50333d2..51f4127 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/governance/impl/ZookeeperContainer.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/governance/impl/ZookeeperContainer.java
@@ -26,7 +26,7 @@ import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy;
 public final class ZookeeperContainer extends GovernanceContainer {
     
     public ZookeeperContainer() {
-        super("zookeeper", "zookeeper:3.6.2", false);
+        super("zookeeper", "zookeeper:3.6.2");
         setWaitStrategy(new LogMessageWaitStrategy().withRegEx(".*PrepRequestProcessor \\(sid:[0-9]+\\) started.*"));
     }
     
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/StorageContainer.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/DockerStorageContainer.java
similarity index 81%
copy from shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/StorageContainer.java
copy to shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/DockerStorageContainer.java
index 32e9826..e1b96fe 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/StorageContainer.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/DockerStorageContainer.java
@@ -18,13 +18,14 @@
 package org.apache.shardingsphere.test.integration.framework.container.atomic.storage;
 
 import com.zaxxer.hikari.HikariDataSource;
+import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.SneakyThrows;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.test.integration.env.DataSourceEnvironment;
 import org.apache.shardingsphere.test.integration.env.EnvironmentPath;
 import org.apache.shardingsphere.test.integration.env.database.DatabaseEnvironmentManager;
-import org.apache.shardingsphere.test.integration.framework.container.atomic.AtomicContainer;
+import org.apache.shardingsphere.test.integration.framework.container.atomic.DockerITContainer;
 import org.testcontainers.containers.BindMode;
 
 import javax.sql.DataSource;
@@ -33,23 +34,21 @@ import java.io.IOException;
 import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.Map;
-import java.util.Optional;
 
 /**
- * Storage container.
+ * Docker storage container.
  */
-public abstract class StorageContainer extends AtomicContainer {
+@Getter(AccessLevel.PROTECTED)
+public abstract class DockerStorageContainer extends DockerITContainer implements StorageContainer {
     
-    @Getter
     private final DatabaseType databaseType;
     
-    @Getter
     private final String scenario;
     
     private Map<String, DataSource> actualDataSourceMap;
     
-    public StorageContainer(final DatabaseType databaseType, final String dockerImageName, final boolean isFakedContainer, final String scenario) {
-        super(databaseType.getName().toLowerCase(), dockerImageName, isFakedContainer);
+    public DockerStorageContainer(final DatabaseType databaseType, final String dockerImageName, final String scenario) {
+        super(databaseType.getName().toLowerCase(), dockerImageName);
         this.databaseType = databaseType;
         this.scenario = scenario;
     }
@@ -59,11 +58,7 @@ public abstract class StorageContainer extends AtomicContainer {
         withClasspathResourceMapping(EnvironmentPath.getInitSQLResourcePath(databaseType, scenario), "/docker-entrypoint-initdb.d/", BindMode.READ_ONLY);
     }
     
-    /**
-     * Get actual data source map.
-     *
-     * @return actual data source map
-     */
+    @Override
     @SneakyThrows({IOException.class, JAXBException.class})
     public synchronized Map<String, DataSource> getActualDataSourceMap() {
         if (null == actualDataSourceMap) {
@@ -77,7 +72,7 @@ public abstract class StorageContainer extends AtomicContainer {
     private DataSource createDataSource(final String dataSourceName) {
         HikariDataSource result = new HikariDataSource();
         result.setDriverClassName(DataSourceEnvironment.getDriverClassName(databaseType));
-        result.setJdbcUrl(DataSourceEnvironment.getURL(databaseType, isFakedContainer() ? null : getHost(), getPort(), dataSourceName));
+        result.setJdbcUrl(DataSourceEnvironment.getURL(databaseType, getHost(), getPort(), dataSourceName));
         result.setUsername(getUsername());
         result.setPassword(getPassword());
         result.setMaximumPoolSize(4);
@@ -85,14 +80,4 @@ public abstract class StorageContainer extends AtomicContainer {
         getConnectionInitSQL().ifPresent(result::setConnectionInitSql);
         return result;
     }
-    
-    protected abstract String getUsername();
-    
-    protected abstract String getPassword();
-    
-    protected Optional<String> getConnectionInitSQL() {
-        return Optional.empty();
-    }
-    
-    protected abstract int getPort();
 }
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/StorageContainer.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/EmbeddedStorageContainer.java
similarity index 69%
copy from shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/StorageContainer.java
copy to shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/EmbeddedStorageContainer.java
index 32e9826..8b78883 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/StorageContainer.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/EmbeddedStorageContainer.java
@@ -18,14 +18,14 @@
 package org.apache.shardingsphere.test.integration.framework.container.atomic.storage;
 
 import com.zaxxer.hikari.HikariDataSource;
+import lombok.AccessLevel;
 import lombok.Getter;
+import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.test.integration.env.DataSourceEnvironment;
-import org.apache.shardingsphere.test.integration.env.EnvironmentPath;
 import org.apache.shardingsphere.test.integration.env.database.DatabaseEnvironmentManager;
-import org.apache.shardingsphere.test.integration.framework.container.atomic.AtomicContainer;
-import org.testcontainers.containers.BindMode;
+import org.apache.shardingsphere.test.integration.framework.container.atomic.EmbeddedITContainer;
 
 import javax.sql.DataSource;
 import javax.xml.bind.JAXBException;
@@ -33,37 +33,21 @@ import java.io.IOException;
 import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.Map;
-import java.util.Optional;
 
 /**
- * Storage container.
+ * Embedded storage container.
  */
-public abstract class StorageContainer extends AtomicContainer {
+@RequiredArgsConstructor
+@Getter(AccessLevel.PROTECTED)
+public abstract class EmbeddedStorageContainer implements EmbeddedITContainer, StorageContainer {
     
-    @Getter
     private final DatabaseType databaseType;
     
-    @Getter
     private final String scenario;
     
     private Map<String, DataSource> actualDataSourceMap;
     
-    public StorageContainer(final DatabaseType databaseType, final String dockerImageName, final boolean isFakedContainer, final String scenario) {
-        super(databaseType.getName().toLowerCase(), dockerImageName, isFakedContainer);
-        this.databaseType = databaseType;
-        this.scenario = scenario;
-    }
-    
     @Override
-    protected void configure() {
-        withClasspathResourceMapping(EnvironmentPath.getInitSQLResourcePath(databaseType, scenario), "/docker-entrypoint-initdb.d/", BindMode.READ_ONLY);
-    }
-    
-    /**
-     * Get actual data source map.
-     *
-     * @return actual data source map
-     */
     @SneakyThrows({IOException.class, JAXBException.class})
     public synchronized Map<String, DataSource> getActualDataSourceMap() {
         if (null == actualDataSourceMap) {
@@ -77,7 +61,7 @@ public abstract class StorageContainer extends AtomicContainer {
     private DataSource createDataSource(final String dataSourceName) {
         HikariDataSource result = new HikariDataSource();
         result.setDriverClassName(DataSourceEnvironment.getDriverClassName(databaseType));
-        result.setJdbcUrl(DataSourceEnvironment.getURL(databaseType, isFakedContainer() ? null : getHost(), getPort(), dataSourceName));
+        result.setJdbcUrl(DataSourceEnvironment.getURL(databaseType, null, getPort(), dataSourceName));
         result.setUsername(getUsername());
         result.setPassword(getPassword());
         result.setMaximumPoolSize(4);
@@ -85,14 +69,4 @@ public abstract class StorageContainer extends AtomicContainer {
         getConnectionInitSQL().ifPresent(result::setConnectionInitSql);
         return result;
     }
-    
-    protected abstract String getUsername();
-    
-    protected abstract String getPassword();
-    
-    protected Optional<String> getConnectionInitSQL() {
-        return Optional.empty();
-    }
-    
-    protected abstract int getPort();
 }
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/StorageContainer.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/StorageContainer.java
index 32e9826..55d4999 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/StorageContainer.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/StorageContainer.java
@@ -17,82 +17,51 @@
 
 package org.apache.shardingsphere.test.integration.framework.container.atomic.storage;
 
-import com.zaxxer.hikari.HikariDataSource;
-import lombok.Getter;
-import lombok.SneakyThrows;
-import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import org.apache.shardingsphere.test.integration.env.DataSourceEnvironment;
-import org.apache.shardingsphere.test.integration.env.EnvironmentPath;
-import org.apache.shardingsphere.test.integration.env.database.DatabaseEnvironmentManager;
-import org.apache.shardingsphere.test.integration.framework.container.atomic.AtomicContainer;
-import org.testcontainers.containers.BindMode;
+import org.apache.shardingsphere.test.integration.framework.container.atomic.ITContainer;
 
 import javax.sql.DataSource;
-import javax.xml.bind.JAXBException;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Optional;
 
 /**
  * Storage container.
  */
-public abstract class StorageContainer extends AtomicContainer {
+public interface StorageContainer extends ITContainer {
     
-    @Getter
-    private final DatabaseType databaseType;
-    
-    @Getter
-    private final String scenario;
+    /**
+     * Get username.
+     * 
+     * @return username
+     */
+    String getUsername();
     
-    private Map<String, DataSource> actualDataSourceMap;
+    /**
+     * Get password.
+     * 
+     * @return password
+     */
+    String getPassword();
     
-    public StorageContainer(final DatabaseType databaseType, final String dockerImageName, final boolean isFakedContainer, final String scenario) {
-        super(databaseType.getName().toLowerCase(), dockerImageName, isFakedContainer);
-        this.databaseType = databaseType;
-        this.scenario = scenario;
+    /**
+     * Get connection init SQL.
+     * 
+     * @return connection init SQL
+     */
+    default Optional<String> getConnectionInitSQL() {
+        return Optional.empty();
     }
     
-    @Override
-    protected void configure() {
-        withClasspathResourceMapping(EnvironmentPath.getInitSQLResourcePath(databaseType, scenario), "/docker-entrypoint-initdb.d/", BindMode.READ_ONLY);
-    }
+    /**
+     * Get port.
+     * 
+     * @return port
+     */
+    int getPort();
     
     /**
      * Get actual data source map.
      *
      * @return actual data source map
      */
-    @SneakyThrows({IOException.class, JAXBException.class})
-    public synchronized Map<String, DataSource> getActualDataSourceMap() {
-        if (null == actualDataSourceMap) {
-            Collection<String> dataSourceNames = DatabaseEnvironmentManager.getDatabaseNames(scenario);
-            actualDataSourceMap = new LinkedHashMap<>(dataSourceNames.size(), 1);
-            dataSourceNames.forEach(each -> actualDataSourceMap.put(each, createDataSource(each)));
-        }
-        return actualDataSourceMap;
-    }
-    
-    private DataSource createDataSource(final String dataSourceName) {
-        HikariDataSource result = new HikariDataSource();
-        result.setDriverClassName(DataSourceEnvironment.getDriverClassName(databaseType));
-        result.setJdbcUrl(DataSourceEnvironment.getURL(databaseType, isFakedContainer() ? null : getHost(), getPort(), dataSourceName));
-        result.setUsername(getUsername());
-        result.setPassword(getPassword());
-        result.setMaximumPoolSize(4);
-        result.setTransactionIsolation("TRANSACTION_READ_COMMITTED");
-        getConnectionInitSQL().ifPresent(result::setConnectionInitSql);
-        return result;
-    }
-    
-    protected abstract String getUsername();
-    
-    protected abstract String getPassword();
-    
-    protected Optional<String> getConnectionInitSQL() {
-        return Optional.empty();
-    }
-    
-    protected abstract int getPort();
+    Map<String, DataSource> getActualDataSourceMap();
 }
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/impl/H2Container.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/impl/H2Container.java
index 609e821..d628bb0 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/impl/H2Container.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/impl/H2Container.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.test.integration.framework.container.atomic.st
 import lombok.SneakyThrows;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
 import org.apache.shardingsphere.test.integration.env.EnvironmentPath;
-import org.apache.shardingsphere.test.integration.framework.container.atomic.storage.StorageContainer;
+import org.apache.shardingsphere.test.integration.framework.container.atomic.storage.EmbeddedStorageContainer;
 import org.h2.tools.RunScript;
 
 import javax.sql.DataSource;
@@ -34,15 +34,15 @@ import java.util.Map.Entry;
 /**
  * H2 container.
  */
-public final class H2Container extends StorageContainer {
+public final class H2Container extends EmbeddedStorageContainer {
     
     public H2Container(final String scenario) {
-        super(DatabaseTypeRegistry.getActualDatabaseType("H2"), "h2:fake", true, scenario);
+        super(DatabaseTypeRegistry.getActualDatabaseType("H2"), scenario);
     }
     
     @Override
     @SneakyThrows({IOException.class, SQLException.class})
-    protected void execute() {
+    public void start() {
         File initSQLFile = new File(EnvironmentPath.getInitSQLFile(getDatabaseType(), getScenario()));
         for (Entry<String, DataSource> entry : getActualDataSourceMap().entrySet()) {
             String dbInitSQLFileName = "init-" + entry.getKey() + ".sql";
@@ -65,22 +65,17 @@ public final class H2Container extends StorageContainer {
     }
     
     @Override
-    public boolean isHealthy() {
-        return true;
-    }
-    
-    @Override
-    protected String getUsername() {
+    public String getUsername() {
         return "sa";
     }
     
     @Override
-    protected String getPassword() {
+    public String getPassword() {
         return "";
     }
     
     @Override
-    protected int getPort() {
+    public int getPort() {
         return 0;
     }
 }
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/impl/MySQLContainer.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/impl/MySQLContainer.java
index 86fe8fc..f862565 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/impl/MySQLContainer.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/impl/MySQLContainer.java
@@ -18,18 +18,18 @@
 package org.apache.shardingsphere.test.integration.framework.container.atomic.storage.impl;
 
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
-import org.apache.shardingsphere.test.integration.framework.container.atomic.storage.StorageContainer;
+import org.apache.shardingsphere.test.integration.framework.container.atomic.storage.DockerStorageContainer;
 
 import java.util.Collections;
 import java.util.Optional;
 
 /**
- * MySQL Container.
+ * MySQL container.
  */
-public final class MySQLContainer extends StorageContainer {
+public final class MySQLContainer extends DockerStorageContainer {
     
     public MySQLContainer(final String scenario) {
-        super(DatabaseTypeRegistry.getActualDatabaseType("MySQL"), "mysql/mysql-server:5.7", false, scenario);
+        super(DatabaseTypeRegistry.getActualDatabaseType("MySQL"), "mysql/mysql-server:5.7", scenario);
     }
     
     @Override
@@ -40,22 +40,22 @@ public final class MySQLContainer extends StorageContainer {
     }
     
     @Override
-    protected String getUsername() {
+    public String getUsername() {
         return "root";
     }
     
     @Override
-    protected String getPassword() {
+    public String getPassword() {
         return "root";
     }
     
     @Override
-    protected Optional<String> getConnectionInitSQL() {
+    public Optional<String> getConnectionInitSQL() {
         return Optional.of("SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))");
     }
     
     @Override
-    protected int getPort() {
+    public int getPort() {
         return getMappedPort(3306);
     }
 }
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/impl/PostgreSQLContainer.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/impl/PostgreSQLContainer.java
index 4dd2a16..370d5a9 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/impl/PostgreSQLContainer.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/atomic/storage/impl/PostgreSQLContainer.java
@@ -20,7 +20,7 @@ package org.apache.shardingsphere.test.integration.framework.container.atomic.st
 import lombok.SneakyThrows;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
 import org.apache.shardingsphere.test.integration.env.DataSourceEnvironment;
-import org.apache.shardingsphere.test.integration.framework.container.atomic.storage.StorageContainer;
+import org.apache.shardingsphere.test.integration.framework.container.atomic.storage.DockerStorageContainer;
 import org.postgresql.util.PSQLException;
 
 import java.sql.Connection;
@@ -30,10 +30,10 @@ import java.sql.SQLException;
 /**
  * PostgreSQL container.
  */
-public final class PostgreSQLContainer extends StorageContainer {
+public final class PostgreSQLContainer extends DockerStorageContainer {
     
     public PostgreSQLContainer(final String scenario) {
-        super(DatabaseTypeRegistry.getActualDatabaseType("PostgreSQL"), "postgres:12.6", false, scenario);
+        super(DatabaseTypeRegistry.getActualDatabaseType("PostgreSQL"), "postgres:12.6", scenario);
     }
     
     @Override
@@ -61,17 +61,17 @@ public final class PostgreSQLContainer extends StorageContainer {
     }
     
     @Override
-    protected String getUsername() {
+    public String getUsername() {
         return "root";
     }
     
     @Override
-    protected String getPassword() {
+    public String getPassword() {
         return "root";
     }
     
     @Override
-    protected int getPort() {
+    public int getPort() {
         return getMappedPort(5432);
     }
 }
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/ComposedContainer.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/ComposedContainer.java
index 78665fc..60d1b4d 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/ComposedContainer.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/ComposedContainer.java
@@ -17,18 +17,15 @@
 
 package org.apache.shardingsphere.test.integration.framework.container.compose;
 
+import org.testcontainers.lifecycle.Startable;
+
 import javax.sql.DataSource;
 import java.util.Map;
 
 /**
  * Composed container.
  */
-public interface ComposedContainer extends AutoCloseable {
-    
-    /**
-     * Start composed container.
-     */
-    void start();
+public interface ComposedContainer extends Startable {
     
     /**
      * Get actual data source map.
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/ComposedContainerRegistry.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/ComposedContainerRegistry.java
index 01a5c9f..bae4cdd 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/ComposedContainerRegistry.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/ComposedContainerRegistry.java
@@ -17,10 +17,10 @@
 
 package org.apache.shardingsphere.test.integration.framework.container.compose;
 
-import lombok.SneakyThrows;
 import org.apache.shardingsphere.test.integration.framework.container.compose.mode.ClusterComposedContainer;
 import org.apache.shardingsphere.test.integration.framework.container.compose.mode.MemoryComposedContainer;
 import org.apache.shardingsphere.test.integration.framework.param.model.ParameterizedArray;
+import org.testcontainers.lifecycle.Startable;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -52,21 +52,18 @@ public final class ComposedContainerRegistry implements AutoCloseable {
         }
     }
     
+    private String generateKey(final String testSuiteName, final ParameterizedArray parameterizedArray) {
+        return String.join("-", testSuiteName, parameterizedArray.getScenario(), parameterizedArray.getAdapter(), parameterizedArray.getDatabaseType().getName());
+    }
+    
     private ComposedContainer createComposedContainer(final String testSuiteName, final ParameterizedArray parameterizedArray) {
         // TODO fix sharding_governance
         return "sharding_governance".equals(parameterizedArray.getScenario())
                 ? new ClusterComposedContainer(testSuiteName, parameterizedArray) : new MemoryComposedContainer(testSuiteName, parameterizedArray);
     }
     
-    private String generateKey(final String testSuiteName, final ParameterizedArray parameterizedArray) {
-        return String.join("-", testSuiteName, parameterizedArray.getScenario(), parameterizedArray.getAdapter(), parameterizedArray.getDatabaseType().getName());
-    }
-    
     @Override
-    @SneakyThrows
     public void close() {
-        for (ComposedContainer each : composedContainers.values()) {
-            each.close();
-        }
+        composedContainers.values().forEach(Startable::close);
     }
 }
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/mode/ClusterComposedContainer.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/mode/ClusterComposedContainer.java
index f32f138..83b0356 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/mode/ClusterComposedContainer.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/mode/ClusterComposedContainer.java
@@ -17,7 +17,8 @@
 
 package org.apache.shardingsphere.test.integration.framework.container.compose.mode;
 
-import org.apache.shardingsphere.test.integration.framework.container.atomic.AtomicContainers;
+import org.apache.shardingsphere.test.integration.framework.container.atomic.DockerITContainer;
+import org.apache.shardingsphere.test.integration.framework.container.atomic.ITContainers;
 import org.apache.shardingsphere.test.integration.framework.container.atomic.adapter.AdapterContainer;
 import org.apache.shardingsphere.test.integration.framework.container.atomic.adapter.AdapterContainerFactory;
 import org.apache.shardingsphere.test.integration.framework.container.atomic.governance.GovernanceContainer;
@@ -35,7 +36,7 @@ import java.util.Map;
  */
 public final class ClusterComposedContainer implements ComposedContainer {
     
-    private final AtomicContainers containers;
+    private final ITContainers containers;
     
     private final GovernanceContainer governanceContainer;
     
@@ -44,14 +45,16 @@ public final class ClusterComposedContainer implements ComposedContainer {
     private final AdapterContainer adapterContainer;
     
     public ClusterComposedContainer(final String testSuiteName, final ParameterizedArray parameterizedArray) {
-        containers = new AtomicContainers(parameterizedArray.getScenario());
+        containers = new ITContainers(parameterizedArray.getScenario());
         // TODO support other types of governance
         governanceContainer = containers.registerContainer(testSuiteName, GovernanceContainerFactory.newInstance("ZooKeeper"), "zk");
-        storageContainer = containers.registerContainer(testSuiteName, 
-                StorageContainerFactory.newInstance(parameterizedArray.getDatabaseType(), parameterizedArray.getScenario()), parameterizedArray.getDatabaseType().getName());
-        adapterContainer = containers.registerContainer(testSuiteName, 
-                AdapterContainerFactory.newInstance(parameterizedArray.getAdapter(), parameterizedArray.getDatabaseType(), parameterizedArray.getScenario()), parameterizedArray.getAdapter());
-        adapterContainer.dependsOn(governanceContainer, storageContainer);
+        storageContainer = containers.registerContainer(testSuiteName, StorageContainerFactory.newInstance(
+                parameterizedArray.getDatabaseType(), parameterizedArray.getScenario()), parameterizedArray.getDatabaseType().getName());
+        adapterContainer = containers.registerContainer(testSuiteName, AdapterContainerFactory.newInstance(
+                parameterizedArray.getAdapter(), parameterizedArray.getDatabaseType(), storageContainer, parameterizedArray.getScenario()), parameterizedArray.getAdapter());
+        if (adapterContainer instanceof DockerITContainer) {
+            ((DockerITContainer) adapterContainer).dependsOn(governanceContainer, storageContainer);
+        }
     }
     
     @Override
@@ -70,7 +73,7 @@ public final class ClusterComposedContainer implements ComposedContainer {
     }
     
     @Override
-    public void close() {
-        containers.close();
+    public void stop() {
+        containers.stop();
     }
 }
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/mode/MemoryComposedContainer.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/mode/MemoryComposedContainer.java
index de74e58..7298c61 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/mode/MemoryComposedContainer.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/src/test/java/org/apache/shardingsphere/test/integration/framework/container/compose/mode/MemoryComposedContainer.java
@@ -17,7 +17,8 @@
 
 package org.apache.shardingsphere.test.integration.framework.container.compose.mode;
 
-import org.apache.shardingsphere.test.integration.framework.container.atomic.AtomicContainers;
+import org.apache.shardingsphere.test.integration.framework.container.atomic.DockerITContainer;
+import org.apache.shardingsphere.test.integration.framework.container.atomic.ITContainers;
 import org.apache.shardingsphere.test.integration.framework.container.atomic.adapter.AdapterContainer;
 import org.apache.shardingsphere.test.integration.framework.container.atomic.adapter.AdapterContainerFactory;
 import org.apache.shardingsphere.test.integration.framework.container.atomic.storage.StorageContainer;
@@ -33,19 +34,21 @@ import java.util.Map;
  */
 public final class MemoryComposedContainer implements ComposedContainer {
     
-    private final AtomicContainers containers;
+    private final ITContainers containers;
     
     private final StorageContainer storageContainer;
     
     private final AdapterContainer adapterContainer;
     
     public MemoryComposedContainer(final String testSuiteName, final ParameterizedArray parameterizedArray) {
-        containers = new AtomicContainers(parameterizedArray.getScenario());
-        storageContainer = containers.registerContainer(testSuiteName, 
-                StorageContainerFactory.newInstance(parameterizedArray.getDatabaseType(), parameterizedArray.getScenario()), parameterizedArray.getDatabaseType().getName());
-        adapterContainer = containers.registerContainer(testSuiteName, 
-                AdapterContainerFactory.newInstance(parameterizedArray.getAdapter(), parameterizedArray.getDatabaseType(), parameterizedArray.getScenario()), parameterizedArray.getAdapter());
-        adapterContainer.dependsOn(storageContainer);
+        containers = new ITContainers(parameterizedArray.getScenario());
+        storageContainer = containers.registerContainer(testSuiteName, StorageContainerFactory.newInstance(
+                parameterizedArray.getDatabaseType(), parameterizedArray.getScenario()), parameterizedArray.getDatabaseType().getName());
+        adapterContainer = containers.registerContainer(testSuiteName, AdapterContainerFactory.newInstance(
+                parameterizedArray.getAdapter(), parameterizedArray.getDatabaseType(), storageContainer, parameterizedArray.getScenario()), parameterizedArray.getAdapter());
+        if (adapterContainer instanceof DockerITContainer) {
+            ((DockerITContainer) adapterContainer).dependsOn(storageContainer);
+        }
     }
     
     @Override
@@ -64,7 +67,7 @@ public final class MemoryComposedContainer implements ComposedContainer {
     }
     
     @Override
-    public void close() {
-        containers.close();
+    public void stop() {
+        containers.stop();
     }
 }