diff --git a/gitlab-ci-config/check-packages.yml b/gitlab-ci-config/check-packages.yml
index 16e25313a74b436d424a187a4e01654839ff4ce3_Z2l0bGFiLWNpLWNvbmZpZy9jaGVjay1wYWNrYWdlcy55bWw=..976014349dbf74d1d6207050c7f5a99c0281a0a2_Z2l0bGFiLWNpLWNvbmZpZy9jaGVjay1wYWNrYWdlcy55bWw= 100644
--- a/gitlab-ci-config/check-packages.yml
+++ b/gitlab-ci-config/check-packages.yml
@@ -1,5 +1,6 @@
 stages:
   - package
+  - image
 
 variables:
   # BUILDER_IMAGE_REGISTRY is incorrectly passed from parent pipeline due to
@@ -204,3 +205,18 @@
   extends:
     - .zypper-install
     - .ee-tag-only
+
+Docker:
+  stage: image
+  needs: []
+  variables:
+    DOCKER_DRIVER: overlay2
+    DOCKER_HOST: tcp://docker:2375
+  services:
+    - name: docker:23.0.5-dind
+      alias: localhost
+  image: "${BUILDER_IMAGE_REGISTRY}/distribution_ci_tools:latest"
+  script:
+    - bash scripts/ci/deploy_docker.sh
+  tags: !reference [.distribution-amd64-tags]
+  retry: 2
diff --git a/gitlab-ci-config/dev-gitlab-org.yml b/gitlab-ci-config/dev-gitlab-org.yml
index 16e25313a74b436d424a187a4e01654839ff4ce3_Z2l0bGFiLWNpLWNvbmZpZy9kZXYtZ2l0bGFiLW9yZy55bWw=..976014349dbf74d1d6207050c7f5a99c0281a0a2_Z2l0bGFiLWNpLWNvbmZpZy9kZXYtZ2l0bGFiLW9yZy55bWw= 100644
--- a/gitlab-ci-config/dev-gitlab-org.yml
+++ b/gitlab-ci-config/dev-gitlab-org.yml
@@ -1149,6 +1149,7 @@
         deploy_instance: "true"
         package_repository: "pre-release"
         package_repo_token: "${PRE_RELEASE_REPO_TOKEN}:@"
+        image_registry: "${CI_REGISTRY_IMAGE}"
 
 # Check if the packages are available from public repositories
 check-packages-availability:
diff --git a/scripts/ci/deploy_docker.sh b/scripts/ci/deploy_docker.sh
new file mode 100644
index 0000000000000000000000000000000000000000..976014349dbf74d1d6207050c7f5a99c0281a0a2_c2NyaXB0cy9jaS9kZXBsb3lfZG9ja2VyLnNo
--- /dev/null
+++ b/scripts/ci/deploy_docker.sh
@@ -0,0 +1,66 @@
+#!/bin/env bash
+
+set -eo pipefail
+
+image_registry=${image_registry:-gitlab}
+
+if [ "${image_registry}" = "${CI_REGISTRY_IMAGE}" ] ; then
+  docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
+fi
+
+# Split the result from rake task at = and assign to two variables image_name
+# and image_tag
+IFS== read -r image_name image_tag <<< $(bundle exec rake build:package:name_version 2>&1 | tail -n1)
+
+GITLAB_HOME=/tmp/gitlab
+mkdir -p $GITLAB_HOME
+
+docker run --detach \
+  --hostname gitlab.example.com \
+  --env GITLAB_OMNIBUS_CONFIG="external_url 'http://gitlab.example.com'" \
+  --publish 443:443 --publish 80:80 --publish 2222:22 \
+  --name gitlab \
+  --restart always \
+  --volume $GITLAB_HOME/config:/etc/gitlab \
+  --volume $GITLAB_HOME/logs:/var/log/gitlab \
+  --volume $GITLAB_HOME/data:/var/opt/gitlab \
+  --shm-size 256m \
+  ${image_registry}/${image_name}:${image_tag}
+
+if [ "${deploy_instance}" != "true" ]; then
+  exit 0;
+fi
+
+function get_health {
+  state=$(docker inspect -f '{{ .State.Health.Status }}' gitlab)
+  return_code=$?
+  if [ ! ${return_code} -eq 0 ]; then
+    echo "Getting health status failed."
+    exit 1
+  fi
+
+  if [ "${state}" = "healthy" ]; then
+    return 0
+  else
+    return 1
+  fi
+}
+
+# Do not fail on the `return 1` above.
+set +e
+
+echo "Wait for GitLab to be healthy"
+for i in `seq 600`; do
+  get_health
+  state=$?
+
+  if [ ${state} -eq 0 ]; then
+    echo "GitLab is running successfully."
+    exit 0
+  fi
+
+  sleep 1
+done
+
+echo "GitLab not healthy after 10 minutes. Health status returned: $(docker inspect -f '{{ .State.Health.Status }}' gitlab)"
+exit 1