diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 1ca81acf95e0e7ade693b0b2431b7962eedba884..8de33ee9869141beb2d80e46118830d25041f54f 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -3,7 +3,8 @@ variables:
 
 stages:
   - test
-  - documentation
+  - build
+  - deploy
 
 before_script:
   - git config --global url."https://$GO_MODULES_USER:$GO_MODULES_ACCESS_TOKEN@code.fbi.h-da.de".insteadOf "https://code.fbi.h-da.de"
@@ -12,3 +13,4 @@ include:
   - local: '/build/ci/.code-quality-ci.yml'
   - local: '/build/ci/.documentation-ci.yml'
   - local: '/build/ci/.security-and-compliance-ci.yml'
+  - local: '/build/ci/.build-container.yml'
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..f7e594ad6965ed62f27518a9fa05326cb3322bc2
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,16 @@
+FROM golang:alpine AS builder
+ARG GITLAB_USER
+ARG GITLAB_TOKEN
+WORKDIR /src/gosdn
+COPY . .
+RUN git config --global url."https://$GITLAB_USER:$GITLAB_TOKEN@code.fbi.h-da.de".insteadOf "https://code.fbi.h-da.de"
+RUN go mod download
+RUN CGO_ENABLED=0 GOOS=linux go build ./cmd/gosdn
+
+FROM alpine:latest
+EXPOSE 8443
+COPY --from=builder /src/gosdn/gosdn .
+COPY --from=builder /src/gosdn/config .
+
+ENTRYPOINT [ "./gosdn" ]
+CMD [""]
diff --git a/build/ci/.build-container.yml b/build/ci/.build-container.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b33146da229fd4bc0e3968fec6bc0030772372c3
--- /dev/null
+++ b/build/ci/.build-container.yml
@@ -0,0 +1,44 @@
+variables:
+  DOCKER_IMAGE_SHA: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
+
+build:docker:
+  stage: build
+  tags:
+    - baremetal
+  script:
+    - >
+      docker build \
+        --build-arg <GITLAB_USER>=<$GO_MODULES_USER> \
+        --build-arg <GITLAB_TOKEN>=<$GO_MODULES_ACCESS_TOKEN> \
+        -t $DOCKER_IMAGE_SHA .
+
+.deploy: &deploy
+  stage: deploy
+  needs: ["build:docker"]
+  tags:
+    - baremetal
+  script:
+    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
+    - docker tag $DOCKER_IMAGE_SHA $TAG
+    - docker push $TAG
+
+deploy:develop:
+  variables:
+    TAG: $CI_REGISTRY_IMAGE:develop
+  rules:
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH
+  <<: *deploy
+
+deploy:tagged:
+  variables:
+    TAG: $CI_REGISTRY_IMAGE:CI_COMMIT_TAG
+  rules:
+    - if: CI_COMMIT_TAG
+  <<: *deploy
+
+deploy:latest:
+  variables:
+    TAG: $CI_REGISTRY_IMAGE:latest
+  rules:
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+  <<: *deploy
\ No newline at end of file
diff --git a/build/ci/.documentation-ci.yml b/build/ci/.documentation-ci.yml
index cd9bbc427f9afacd78c3f4ec6be1f3cf9544c844..23a5caf7f43f0601939a1740e3ca3803d37ae007 100644
--- a/build/ci/.documentation-ci.yml
+++ b/build/ci/.documentation-ci.yml
@@ -5,7 +5,7 @@ documentation:pdf:
     name: pandoc/latex
     entrypoint:
     - ''
-  stage: documentation
+  stage: deploy
   rules:
     - changes:
       - documentation/design/*.md
@@ -22,7 +22,7 @@ documentation:pdf:
       - cargo install mdbook
   image:
     name: rust:latest
-  stage: documentation
+  stage: deploy
   script:
   - mdbook build documentation --dest-dir public
   cache: