{"id":65197,"date":"2023-08-23T15:32:04","date_gmt":"2023-08-23T14:32:04","guid":{"rendered":"https:\/\/kinsta.com\/de\/?p=65197&#038;preview=true&#038;preview_id=65197"},"modified":"2023-08-31T09:25:46","modified_gmt":"2023-08-31T08:25:46","slug":"kinsta-docker","status":"publish","type":"post","link":"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/","title":{"rendered":"Wie Kinsta die End-to-End-Entwicklungserfahrung durch Dockerisierung jedes Schritts des Produktionszyklus verbessert hat"},"content":{"rendered":"<p>Bei Kinsta haben wir Projekte aller Gr\u00f6\u00dfenordnungen f\u00fcr Anwendungs-Hosting, Datenbank-Hosting und Managed WordPress Hosting.<\/p>\n<p>Mit den Cloud-Hosting-L\u00f6sungen von Kinsta kannst du Anwendungen in einer Reihe von Sprachen und Frameworks wie NodeJS, PHP, Ruby, Go, Scala und Python <a href=\"https:\/\/sevalla.com\/application-hosting\/\">bereitstellen<\/a>. Mit einem Dockerfile kannst du jede Anwendung bereitstellen. Du kannst dein Git-Repository (gehostet auf GitHub, GitLab oder Bitbucket) verbinden, um deinen Code direkt auf Kinsta bereitzustellen.<\/p>\n<p>Du kannst <a href=\"https:\/\/sevalla.com\/database-hosting\/\">MariaDB-, Redis-, MySQL- und PostgreSQL-Datenbanken<\/a> out-of-the-box hosten. So hast du Zeit, dich auf die Entwicklung deiner Anwendungen zu konzentrieren, anstatt dich mit Hosting-Konfigurationen herumzuschlagen.<\/p>\n<p>Und wenn du dich f\u00fcr unser <a href=\"https:\/\/kinsta.com\/de\/wordpress-hosting\/\">Managed WordPress Hosting<\/a> entscheidest, profitierst du von der Leistung der Google Cloud C2-Maschinen in ihrem Premium-Tier-Netzwerk und der in Cloudflare integrierten Sicherheit, die deine WordPress-Websites zu den schnellsten und sichersten auf dem Markt macht.<br \/>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc><\/p>\n<h2>\u00dcberwindung der Herausforderung, Cloud-native Anwendungen in einem verteilten Team zu entwickeln<\/h2>\n<p>Eine der gr\u00f6\u00dften Herausforderungen bei der Entwicklung und Wartung von Cloud-nativen Anwendungen auf Unternehmensebene ist eine konsistente Erfahrung w\u00e4hrend des gesamten Entwicklungslebenszyklus. Dies ist noch schwieriger f\u00fcr Unternehmen mit verteilten Teams, die auf verschiedenen Plattformen, mit unterschiedlichen Setups und asynchroner Kommunikation arbeiten. Wir m\u00fcssen eine konsistente, zuverl\u00e4ssige und skalierbare L\u00f6sung anbieten, die f\u00fcr alle funktioniert:<\/p>\n<ul>\n<li>Entwickler\/innen und Qualit\u00e4tssicherungs-Teams, unabh\u00e4ngig von ihren Betriebssystemen, ein einfaches und minimales Setup f\u00fcr die Entwicklung und das Testen von Funktionen schaffen.<\/li>\n<li>DevOps-, SysOps- und Infra-Teams, um Staging- und Produktionsumgebungen zu konfigurieren und zu pflegen.<\/li>\n<\/ul>\n<p>Bei Kinsta verlassen wir uns stark auf <a href=\"https:\/\/kinsta.com\/de\/blog\/was-ist-docker\/\">Docker<\/a>, um bei jedem Schritt, von der Entwicklung bis zur Produktion, eine einheitliche Erfahrung zu gew\u00e4hrleisten. In diesem Beitrag f\u00fchren wir dich durch:<\/p>\n<ul>\n<li>Wie wir Docker Desktop nutzen, um die Produktivit\u00e4t der Entwickler zu steigern.<\/li>\n<li>Wie wir Docker-Images erstellen und sie \u00fcber CI-Pipelines mit CircleCI und GitHub Actions in die Google Container Registry pushen.<\/li>\n<li>Wie wir CD-Pipelines nutzen, um inkrementelle \u00c4nderungen mit Docker-Images, Google Kubernetes Engine und Cloud Deploy in die Produktion zu bringen.<\/li>\n<li>Wie das QA-Team vorgefertigte Docker-Images nahtlos in verschiedenen Umgebungen einsetzt.<\/li>\n<\/ul>\n<h2>Die Verwendung von Docker Desktop zur Verbesserung der Entwicklererfahrung<\/h2>\n<p>Um eine Anwendung lokal auszuf\u00fchren, m\u00fcssen Entwickler\/innen die Umgebung sorgf\u00e4ltig vorbereiten, alle Abh\u00e4ngigkeiten installieren, Server und Dienste einrichten und sicherstellen, dass sie richtig konfiguriert sind. Wenn du mehrere Anwendungen betreibst, kann das m\u00fchsam sein, vor allem wenn es sich um komplexe Projekte mit vielen Abh\u00e4ngigkeiten handelt. Wenn du zu dieser Variable noch mehrere Mitwirkende mit verschiedenen Betriebssystemen hinzuf\u00fcgst, ist das Chaos vorprogrammiert. Um das zu verhindern, verwenden wir Docker.<\/p>\n<p>Mit Docker kannst du die Umgebungskonfigurationen deklarieren, die Abh\u00e4ngigkeiten installieren und Images bauen, bei denen alles da ist, wo es sein soll. Jeder, \u00fcberall, mit jedem Betriebssystem kann die gleichen Images verwenden und genau die gleiche Erfahrung machen wie alle anderen.<\/p>\n<h2>Deklariere deine Konfiguration mit Docker Compose<\/h2>\n<p>Um loszulegen, erstellst du eine <a href=\"https:\/\/docs.docker.com\/compose\/\" target=\"_blank\" rel=\"noopener noreferrer\">Docker Compose<\/a>-Datei, <code>docker-compose.yml<\/code>. Das ist eine deklarative Konfigurationsdatei im YAML-Format, die Docker mitteilt, wie der gew\u00fcnschte Zustand deiner Anwendung aussieht. Docker nutzt diese Informationen, um die Umgebung f\u00fcr deine Anwendung einzurichten.<\/p>\n<p>Docker Compose-Dateien sind sehr n\u00fctzlich, wenn du mehr als einen Container laufen hast und es Abh\u00e4ngigkeiten zwischen den Containern gibt.<\/p>\n<p>So erstellst du deine <code>docker-compose.yml<\/code> Datei:<\/p>\n<ol>\n<li>Beginne mit der Auswahl einer <a href=\"https:\/\/hub.docker.com\/\" target=\"_blank\" rel=\"noopener noreferrer\"><code>image<\/code><\/a> als Basis f\u00fcr unsere Anwendung. Suche im Docker Hub nach einem Docker-Image, das bereits die Abh\u00e4ngigkeiten deiner Anwendung enth\u00e4lt. Achte darauf, dass du einen bestimmten Image-Tag verwendest, um Fehler zu vermeiden. Die Verwendung des Tags <code>latest<\/code> kann zu unvorhergesehenen Fehlern in deiner Anwendung f\u00fchren. Du kannst mehrere Basis-Images f\u00fcr verschiedene Abh\u00e4ngigkeiten verwenden. Zum Beispiel eines f\u00fcr <a href=\"https:\/\/kinsta.com\/de\/blog\/was-ist-postgresql\/\">PostgreSQL<\/a> und eines f\u00fcr <a href=\"https:\/\/kinsta.com\/de\/blog\/redis-docker\/\">Redis<\/a>.<\/li>\n<li>Verwende <a href=\"https:\/\/docs.docker.com\/storage\/volumes\/\" target=\"_blank\" rel=\"noopener noreferrer\"><code>volumes<\/code><\/a> um Daten auf deinem Host zu persistieren, wenn du sie brauchst. Das Persistieren von Daten auf dem Host-Rechner hilft dir, Datenverluste zu vermeiden, wenn Docker-Container gel\u00f6scht werden oder du sie neu erstellen musst.<\/li>\n<li>Verwende <a href=\"https:\/\/docs.docker.com\/network\/\" target=\"_blank\" rel=\"noopener noreferrer\"><code>networks<\/code><\/a> um dein Setup zu isolieren, um Netzwerkkonflikte mit dem Host und anderen Containern zu vermeiden. Au\u00dferdem hilft es deinen Containern, einander leicht zu finden und miteinander zu kommunizieren.<\/li>\n<\/ol>\n<p>Wenn du alles zusammen nimmst, sieht <code>docker-compose.yml<\/code> wie folgt aus:<\/p>\n<pre><code class=\"language-yaml\">version: '3.8'services:\n  db:\n    image: postgres:14.7-alpine3.17\n    hostname: mk_db\n    restart: on-failure\n    ports:\n      - ${DB_PORT:-5432}:5432\n    volumes:\n      - db_data:\/var\/lib\/postgresql\/data\n    environment:\n      POSTGRES_USER: ${DB_USER:-user}\n      POSTGRES_PASSWORD: ${DB_PASSWORD:-password}\n      POSTGRES_DB: ${DB_NAME:-main}\n    networks:\n      - mk_network\n  redis:\n    image: redis:6.2.11-alpine3.17\n    hostname: mk_redis\n    restart: on-failure\n    ports:\n      - ${REDIS_PORT:-6379}:6379\n    networks:\n      - mk_network\n      \nvolumes:\n  db_data:\n\nnetworks:\n  mk_network:\n    name: mk_network<\/code><\/pre>\n<h2>Containerisierung der Anwendung<\/h2>\n<h3>Erstelle ein Docker-Image f\u00fcr deine Anwendung<\/h3>\n<p>Zuerst m\u00fcssen wir mit <code>Dockerfile<\/code> ein Docker-Image erstellen und dieses dann von <code>docker-compose.yml<\/code> aus aufrufen.<\/p>\n<p>So erstellst du deine <code>Dockerfile<\/code> Datei:<\/p>\n<ol>\n<li>Beginne damit, ein Image als Basis auszuw\u00e4hlen. Nimm das kleinste Basis-Image, das f\u00fcr deine Anwendung geeignet ist. Alpine-Images sind in der Regel sehr minimalistisch und haben fast keine zus\u00e4tzlichen Pakete installiert. Du kannst mit einem Alpine-Image beginnen und darauf aufbauen:\n<pre><code class=\"language-markdown\">FROM node:18.15.0-alpine3.17\n<\/code><\/pre>\n<\/li>\n<li>Manchmal musst du eine bestimmte CPU-Architektur verwenden, um Konflikte zu vermeiden. Nimm zum Beispiel an, dass du einen <code>arm64-based<\/code> Prozessor verwendest, aber ein <code>amd64<\/code> Image erstellen musst. Du kannst das tun, indem du <code>-- platform<\/code> in <code>Dockerfile<\/code> angibst:\n<pre><code class=\"language-markdown\">FROM --platform=amd64 node:18.15.0-alpine3.17\n<\/code><\/pre>\n<\/li>\n<li>Definiere das Anwendungsverzeichnis, installiere die Abh\u00e4ngigkeiten und kopiere die Ausgabe in dein Stammverzeichnis:\n<pre><code class=\"language-markdown\">WORKDIR \/opt\/app \nCOPY package.json yarn.lock .\/ \nRUN yarn install \nCOPY . .<\/code><\/pre>\n<\/li>\n<li>Rufe die <code>Dockerfile<\/code> von <code>docker-compose.yml<\/code> aus auf:\n<pre><code class=\"language-yaml\">services:\n  ...redis\n  ...db\n  \n  app:\n    build:\n      context: .\n      dockerfile: Dockerfile\n    platforms:\n      - \"linux\/amd64\"\n    command: yarn dev\n    restart: on-failure\n    ports:\n      - ${PORT:-4000}:${PORT:-4000}\n    networks:\n      - mk_network\n    depends_on:\n      - redis\n      - db<\/code><\/pre>\n<\/li>\n<li>Implementiere einen automatischen Reload, damit du, wenn du etwas im Quellcode \u00e4nderst, deine \u00c4nderungen sofort in der Vorschau sehen kannst, ohne die Anwendung manuell neu erstellen zu m\u00fcssen. Erstelle dazu zuerst das Image und f\u00fchre es dann in einem separaten Dienst aus:\n<pre><code class=\"language-yaml\">services:\n  ... redis\n  ... db\n  \n  build-docker:\n    image: myapp\n    build:\n      context: .\n      dockerfile: Dockerfile\n  app:\n    image: myapp\n    platforms:\n      - \"linux\/amd64\"\n    command: yarn dev\n    restart: on-failure\n    ports:\n      - ${PORT:-4000}:${PORT:-4000}\n    volumes:\n      - .:\/opt\/app\n      - node_modules:\/opt\/app\/node_modules\n    networks:\n      - mk_network\n    depends_on:\n      - redis\n      - db\n      - build-docker\n      \nvolumes:\n  node_modules:<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>Profi-Tipp: Beachte, dass <code>node_modules<\/code> auch explizit gemountet wird, um plattformspezifische Probleme mit Paketen zu vermeiden. Das bedeutet, dass der Docker-Container statt der <code>node_modules<\/code> auf dem Host seine eigene verwendet, diese aber auf dem Host in einem separaten Volume abbildet.<\/p>\n<h2>Inkrementelle Erstellung der Produktions-Images mit Continuous Integration<\/h2>\n<p>Die meisten unserer Anwendungen und Dienste nutzen CI\/CD f\u00fcr die Bereitstellung. Docker spielt bei diesem Prozess eine wichtige Rolle. Jede \u00c4nderung im Hauptzweig l\u00f6st sofort eine Build-Pipeline aus, entweder \u00fcber GitHub Actions oder CircleCI. Der allgemeine Arbeitsablauf ist sehr einfach: Er installiert die Abh\u00e4ngigkeiten, f\u00fchrt die Tests durch, erstellt das Docker-Image und stellt es in der Google Container Registry (oder Artifact Registry) bereit. Der Teil, den wir in diesem Artikel besprechen, ist der Build-Schritt.<\/p>\n<h3>Erstellen der Docker-Images<\/h3>\n<p>Wir verwenden aus Sicherheits- und Leistungsgr\u00fcnden mehrstufige Builds.<\/p>\n<h4>Stufe 1: Builder<\/h4>\n<p>In dieser Phase kopieren wir die gesamte Codebasis mit allen Quellen und Konfigurationen, installieren alle Abh\u00e4ngigkeiten, einschlie\u00dflich der Dev-Abh\u00e4ngigkeiten, und bauen die App. Es wird ein Ordner <code>dist\/<\/code> erstellt und die gebaute Version des Codes dorthin kopiert. Dieses Abbild ist jedoch viel zu gro\u00df und enth\u00e4lt zu viele Fu\u00dfabdr\u00fccke, um f\u00fcr die Produktion verwendet zu werden. Da wir private NPM-Registries nutzen, verwenden wir in dieser Phase auch unsere private <code>NPM_TOKEN<\/code>. Wir wollen also auf keinen Fall, dass diese Phase f\u00fcr die Au\u00dfenwelt sichtbar ist. Das Einzige, was wir in dieser Phase brauchen, ist der Ordner <code>dist\/<\/code>.<\/p>\n<h4>Stufe 2: Produktion<\/h4>\n<p>Die meisten Leute verwenden diese Stufe f\u00fcr die Runtime, da sie sehr nah an dem ist, was wir f\u00fcr den Betrieb der Anwendung brauchen. Allerdings m\u00fcssen wir noch die Abh\u00e4ngigkeiten f\u00fcr die Produktion installieren, was bedeutet, dass wir Fu\u00dfspuren hinterlassen und den <code>NPM_TOKEN<\/code> ben\u00f6tigen. Diese Stufe ist also noch nicht bereit, um ver\u00f6ffentlicht zu werden. Achte auch auf <code>yarn cache clean<\/code> in Zeile 19. Dieser winzige Befehl reduziert unsere Bildgr\u00f6\u00dfe um bis zu 60%.<\/p>\n<h4>Stufe 3: Laufzeit<\/h4>\n<p>Die letzte Phase soll so schlank wie m\u00f6glich sein und m\u00f6glichst wenig Speicherplatz beanspruchen. Also kopieren wir einfach die fertige Anwendung aus der Produktion und machen weiter. Wir lassen den ganzen Kram mit Garn und <code>NPM_TOKEN<\/code> hinter uns und f\u00fchren nur noch die Anwendung aus.<\/p>\n<p>Dies ist die endg\u00fcltige <code>Dockerfile.production<\/code>:<\/p>\n<pre><code class=\"language-markdown\"># Stage 1: build the source code \nFROM node:18.15.0-alpine3.17 as builder \nWORKDIR \/opt\/app \nCOPY package.json yarn.lock .\/ \nRUN yarn install \nCOPY . . \nRUN yarn build \n\n# Stage 2: copy the built version and build the production dependencies FROM node:18.15.0-alpine3.17 as production \nWORKDIR \/opt\/app \nCOPY package.json yarn.lock .\/ \nRUN yarn install --production && yarn cache clean \nCOPY --from=builder \/opt\/app\/dist\/ .\/dist\/ \n\n# Stage 3: copy the production ready app to runtime \nFROM node:18.15.0-alpine3.17 as runtime \nWORKDIR \/opt\/app \nCOPY --from=production \/opt\/app\/ . \nCMD [\"yarn\", \"start\"]<\/code><\/pre>\n<p>Beachte, dass wir in allen Phasen zuerst die Dateien <code>package.json<\/code> und <code>yarn.lock<\/code> kopieren, die Abh\u00e4ngigkeiten installieren und dann den Rest der Codebasis kopieren. Der Grund daf\u00fcr ist, dass Docker jeden Befehl als eine Schicht \u00fcber der vorherigen baut. Und jeder Build kann die vorherigen Layer verwenden, wenn sie verf\u00fcgbar sind, und nur die neuen Layer aus Leistungsgr\u00fcnden bauen.<\/p>\n<p>Nehmen wir an, du hast etwas in <code>src\/services\/service1.ts<\/code> ge\u00e4ndert, ohne die Pakete zu ver\u00e4ndern. Das bedeutet, dass die ersten vier Schichten der Builder-Stufe unangetastet bleiben und wiederverwendet werden k\u00f6nnen. Das macht den Build-Prozess unglaublich schnell.<\/p>\n<h3>Die Anwendung \u00fcber CircleCI Pipelines in die Google Container Registry pushen<\/h3>\n<p>Es gibt mehrere M\u00f6glichkeiten, ein Docker-Image in CircleCI-Pipelines zu erstellen. In unserem Fall haben wir uns f\u00fcr <code>circleci\/gcp-gcr orbs<\/code> entschieden:<\/p>\n<pre><code class=\"language-yaml\">executors:\n  docker-executor:\n    docker:\n      - image: cimg\/base:2023.03\norbs:\n  gcp-gcr: circleci\/gcp-gcr@0.15.1\njobs:\n  ...\n  deploy:\n    description: Build & push image to Google Artifact Registry\n    executor: docker-executor\n    steps:\n      ...\n      - gcp-gcr\/build-image:\n          image: my-app\n          dockerfile: Dockerfile.production\n          tag: ${CIRCLE_SHA1:0:7},latest\n      - gcp-gcr\/push-image:\n          image: my-app\n          tag: ${CIRCLE_SHA1:0:7},latest<\/code><\/pre>\n<p>Dank Docker ist nur eine minimale Konfiguration erforderlich, um unsere Anwendung zu erstellen und zu pushen.<\/p>\n<h3>Die Anwendung \u00fcber GitHub-Aktionen in die Google Container Registry pushen<\/h3>\n<p>Als Alternative zu CircleCI k\u00f6nnen wir GitHub Actions verwenden, um die Anwendung kontinuierlich zu verteilen. Wir richten <code>gcloud<\/code> ein und bauen und pushen das Docker-Image auf <code>gcr.io<\/code>:<\/p>\n<pre><code class=\"language-yaml\">jobs:\n  setup-build:\n    name: Setup, Build\n    runs-on: ubuntu-latest\n\n    steps:\n    - name: Checkout\n      uses: actions\/checkout@v3\n\n    - name: Get Image Tag\n      run: |\n        echo \"TAG=$(git rev-parse --short HEAD)\" &gt;&gt; $GITHUB_ENV\n\n    - uses: google-github-actions\/setup-gcloud@master\n      with:\n        service_account_key: ${{ secrets.GCP_SA_KEY }}\n        project_id: ${{ secrets.GCP_PROJECT_ID }}\n\n    - run: |-\n        gcloud --quiet auth configure-docker\n\n    - name: Build\n      run: |-\n        docker build \n          --tag \"gcr.io\/${{ secrets.GCP_PROJECT_ID }}\/my-app:$TAG\" \n          --tag \"gcr.io\/${{ secrets.GCP_PROJECT_ID }}\/my-app:latest\" \n          .\n\n    - name: Push\n      run: |-\n        docker push \"gcr.io\/${{ secrets.GCP_PROJECT_ID }}\/my-app:$TAG\"\n        docker push \"gcr.io\/${{ secrets.GCP_PROJECT_ID }}\/my-app:latest\"<\/code><\/pre>\n<p>Bei jeder kleinen \u00c4nderung, die wir am Hauptzweig vornehmen, bauen wir ein neues Docker-Image und pushen es in die Registry.<\/p>\n<h2>Bereitstellung von \u00c4nderungen an die Google Kubernetes Engine mithilfe der Google Delivery Pipelines<\/h2>\n<p>Fertige Docker-Images f\u00fcr jede einzelne \u00c4nderung zu haben, macht es auch einfacher, sie in die Produktion zu \u00fcberf\u00fchren oder ein Rollback durchzuf\u00fchren, falls etwas schief geht. Wir verwenden Google Kubernetes Engine f\u00fcr die Verwaltung und Bereitstellung unserer Anwendungen und nutzen Google Cloud Deploy und Delivery Pipelines f\u00fcr unseren kontinuierlichen Bereitstellungsprozess.<\/p>\n<p>Wenn das Docker-Image nach jeder kleinen \u00c4nderung erstellt ist (mit der oben gezeigten CI-Pipeline), gehen wir einen Schritt weiter und stellen die \u00c4nderung mit <code>gcloud<\/code> auf unserem Dev-Cluster bereit. Werfen wir einen Blick auf diesen Schritt in der CircleCI-Pipeline:<\/p>\n<pre><code class=\"language-yaml\">- run:\n    name: Create new release\n    command: gcloud deploy releases create release-${CIRCLE_SHA1:0:7} --delivery-pipeline my-del-pipeline --region $REGION --annotations commitId=$CIRCLE_SHA1 --images my-app=gcr.io\/${PROJECT_ID}\/my-app:${CIRCLE_SHA1:0:7}<\/code><\/pre>\n<p>Dadurch wird ein Release-Prozess ausgel\u00f6st, um die \u00c4nderungen in unserem Dev-Kubernetes-Cluster auszurollen. Nachdem wir die \u00c4nderungen getestet und genehmigt haben, \u00fcbertragen wir sie ins Staging und dann in die Produktion. Das alles ist m\u00f6glich, weil wir f\u00fcr jede \u00c4nderung ein schlankes, isoliertes Docker-Image haben, das fast alles enth\u00e4lt, was es braucht. Wir m\u00fcssen dem Deployment nur mitteilen, welches Tag es verwenden soll.<\/p>\n<h2>Wie das Qualit\u00e4tssicherungs-Team von diesem Prozess profitiert<\/h2>\n<p>Das QA-Team ben\u00f6tigt meistens eine Vorproduktions-Cloud-Version der zu testenden Anwendungen. Manchmal muss es jedoch eine vorgefertigte Anwendung (mit allen Abh\u00e4ngigkeiten) lokal ausf\u00fchren, um eine bestimmte Funktion zu testen. In diesen F\u00e4llen wollen oder m\u00fcssen sie sich nicht die M\u00fche machen, das gesamte Projekt zu klonen, npm-Pakete zu installieren, die Anwendung zu bauen, mit Entwicklerfehlern zu k\u00e4mpfen und den gesamten Entwicklungsprozess durchzugehen, um die Anwendung zum Laufen zu bringen. Jetzt, wo alles bereits als Docker-Image in der Google Container Registry verf\u00fcgbar ist, brauchen sie nur noch einen Dienst in der Docker Compose-Datei:<\/p>\n<pre><code class=\"language-yaml\">services:\n  ...redis\n  ...db\n  \n  app:\n    image: gcr.io\/${PROJECT_ID}\/my-app:latest\n    restart: on-failure\n    ports:\n      - ${PORT:-4000}:${PORT:-4000}\n    environment:\n      - NODE_ENV=production\n      - REDIS_URL=redis:\/\/redis:6379\n      - DATABASE_URL=postgresql:\/\/${DB_USER:-user}:${DB_PASSWORD:-password}@db:5432\/main\n    networks:\n      - mk_network\n    depends_on:\n      - redis\n      - db<\/code><\/pre>\n<p>Mit diesem Dienst k\u00f6nnen sie die Anwendung auf ihren lokalen Rechnern mit Docker-Containern zum Laufen bringen, indem sie ihn ausf\u00fchren:<\/p>\n<pre><code class=\"language-shell\">docker compose up<\/code><\/pre>\n<p>Dies ist ein gro\u00dfer Schritt zur Vereinfachung der Testprozesse. Selbst wenn die QA beschlie\u00dft, ein bestimmtes Tag der Anwendung zu testen, kann sie das Image-Tag in Zeile 6 einfach \u00e4ndern und den Docker Compose-Befehl erneut ausf\u00fchren. Selbst wenn sie beschlie\u00dfen, verschiedene Versionen der Anwendung gleichzeitig zu vergleichen, k\u00f6nnen sie das mit ein paar \u00c4nderungen leicht erreichen. Der gr\u00f6\u00dfte Vorteil ist, dass unser QA-Team nicht mit den Herausforderungen der Entwickler konfrontiert wird.<\/p>\n<h2>Vorteile der Verwendung von Docker<\/h2>\n<ul>\n<li><strong>Fast kein Fu\u00dfabdruck f\u00fcr Abh\u00e4ngigkeiten<\/strong>: Wenn du dich jemals entscheidest, die Version von Redis oder Postgres zu aktualisieren, kannst du einfach eine Zeile \u00e4ndern und die Anwendung neu starten. Du musst nichts an deinem System \u00e4ndern. Und wenn du zwei Anwendungen hast, die beide Redis ben\u00f6tigen (vielleicht sogar in unterschiedlichen Versionen), kannst du beide in ihrer eigenen isolierten Umgebung laufen lassen, ohne dass es zu Konflikten kommt.<\/li>\n<li><strong>Mehrere Instanzen der Anwendung<\/strong>: Es gibt viele F\u00e4lle, in denen wir die gleiche Anwendung mit einem anderen Befehl ausf\u00fchren m\u00fcssen. Zum Beispiel, um die DB zu initialisieren, Tests durchzuf\u00fchren, DB-\u00c4nderungen zu beobachten oder Nachrichten abzuh\u00f6ren. In jedem dieser F\u00e4lle f\u00fcgen wir einfach einen weiteren Dienst mit einem anderen Befehl in die Docker-Compose-Datei ein, da wir das fertige Image bereits haben &#8211; fertig.<\/li>\n<li><strong>Leichtere Testumgebung<\/strong>: In den meisten F\u00e4llen musst du nur die Anwendung ausf\u00fchren. Du brauchst den Code, die Pakete oder lokale Datenbankverbindungen nicht. Du willst nur sicherstellen, dass die Anwendung richtig funktioniert oder brauchst eine laufende Instanz als Backend-Service, w\u00e4hrend du an deinem eigenen Projekt arbeitest. Das kann auch der Fall sein f\u00fcr QA, Pull Request Reviewer oder sogar UX-Leute, die sicherstellen wollen, dass ihr Design richtig umgesetzt wurde. Unser Docker-Setup macht es f\u00fcr sie alle sehr einfach, die Dinge in Gang zu bringen, ohne dass sie sich mit zu vielen technischen Fragen besch\u00e4ftigen m\u00fcssen.<\/li>\n<\/ul>\n<p><em>Dieser Artikel wurde urspr\u00fcnglich auf <a href=\"https:\/\/www.docker.com\/blog\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle\/\">Docker<\/a> ver\u00f6ffentlicht.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bei Kinsta haben wir Projekte aller Gr\u00f6\u00dfenordnungen f\u00fcr Anwendungs-Hosting, Datenbank-Hosting und Managed WordPress Hosting. Mit den Cloud-Hosting-L\u00f6sungen von Kinsta kannst du Anwendungen in einer Reihe von &#8230;<\/p>\n","protected":false},"author":297,"featured_media":65198,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[937,957],"class_list":["post-65197","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-docker","topic-kinsta-leistungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Dockerisierung des Produktionszyklus: Wie Kinsta die End-to-End-Entwicklungserfahrung verbessert hat<\/title>\n<meta name=\"description\" content=\"Hier erf\u00e4hrst du, wie Kinsta durch die Dockerisierung aller Schritte des Produktionszyklus die gesamte Entwicklungsarbeit verbessert hat.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Wie Kinsta die End-to-End-Entwicklungserfahrung durch Dockerisierung jedes Schritts des Produktionszyklus verbessert hat\" \/>\n<meta property=\"og:description\" content=\"Hier erf\u00e4hrst du, wie Kinsta durch die Dockerisierung aller Schritte des Produktionszyklus die gesamte Entwicklungsarbeit verbessert hat.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-08-23T14:32:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-31T08:25:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Amin Choroomi\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Hier erf\u00e4hrst du, wie Kinsta durch die Dockerisierung aller Schritte des Produktionszyklus die gesamte Entwicklungsarbeit verbessert hat.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@Kinsta_DE\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_DE\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Amin Choroomi\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"11\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/\"},\"author\":{\"name\":\"Amin Choroomi\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/person\/afd8216d3181e47da9f6e804526b0a97\"},\"headline\":\"Wie Kinsta die End-to-End-Entwicklungserfahrung durch Dockerisierung jedes Schritts des Produktionszyklus verbessert hat\",\"datePublished\":\"2023-08-23T14:32:04+00:00\",\"dateModified\":\"2023-08-31T08:25:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/\"},\"wordCount\":2072,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/de\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg\",\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/\",\"url\":\"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/\",\"name\":\"Dockerisierung des Produktionszyklus: Wie Kinsta die End-to-End-Entwicklungserfahrung verbessert hat\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg\",\"datePublished\":\"2023-08-23T14:32:04+00:00\",\"dateModified\":\"2023-08-31T08:25:46+00:00\",\"description\":\"Hier erf\u00e4hrst du, wie Kinsta durch die Dockerisierung aller Schritte des Produktionszyklus die gesamte Entwicklungsarbeit verbessert hat.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Docker\",\"item\":\"https:\/\/kinsta.com\/de\/thema\/docker\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Wie Kinsta die End-to-End-Entwicklungserfahrung durch Dockerisierung jedes Schritts des Produktionszyklus verbessert hat\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/de\/#website\",\"url\":\"https:\/\/kinsta.com\/de\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/de\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/de\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/de\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/\",\"https:\/\/x.com\/Kinsta_DE\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/person\/afd8216d3181e47da9f6e804526b0a97\",\"name\":\"Amin Choroomi\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/kinsta.com\/de\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f986556230b70b812c88e12d0c4726cf?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f986556230b70b812c88e12d0c4726cf?s=96&d=mm&r=g\",\"caption\":\"Amin Choroomi\"},\"description\":\"Software developer at Kinsta. Passionate about Docker and Kubernetes, he specializes in application development and DevOps practices.\",\"url\":\"https:\/\/kinsta.com\/de\/blog\/author\/aminchoroomi\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Dockerisierung des Produktionszyklus: Wie Kinsta die End-to-End-Entwicklungserfahrung verbessert hat","description":"Hier erf\u00e4hrst du, wie Kinsta durch die Dockerisierung aller Schritte des Produktionszyklus die gesamte Entwicklungsarbeit verbessert hat.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/","og_locale":"de_DE","og_type":"article","og_title":"Wie Kinsta die End-to-End-Entwicklungserfahrung durch Dockerisierung jedes Schritts des Produktionszyklus verbessert hat","og_description":"Hier erf\u00e4hrst du, wie Kinsta durch die Dockerisierung aller Schritte des Produktionszyklus die gesamte Entwicklungsarbeit verbessert hat.","og_url":"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","article_published_time":"2023-08-23T14:32:04+00:00","article_modified_time":"2023-08-31T08:25:46+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg","type":"image\/jpeg"}],"author":"Amin Choroomi","twitter_card":"summary_large_image","twitter_description":"Hier erf\u00e4hrst du, wie Kinsta durch die Dockerisierung aller Schritte des Produktionszyklus die gesamte Entwicklungsarbeit verbessert hat.","twitter_image":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg","twitter_creator":"@Kinsta_DE","twitter_site":"@Kinsta_DE","twitter_misc":{"Verfasst von":"Amin Choroomi","Gesch\u00e4tzte Lesezeit":"11\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/"},"author":{"name":"Amin Choroomi","@id":"https:\/\/kinsta.com\/de\/#\/schema\/person\/afd8216d3181e47da9f6e804526b0a97"},"headline":"Wie Kinsta die End-to-End-Entwicklungserfahrung durch Dockerisierung jedes Schritts des Produktionszyklus verbessert hat","datePublished":"2023-08-23T14:32:04+00:00","dateModified":"2023-08-31T08:25:46+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/"},"wordCount":2072,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/de\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg","inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/","url":"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/","name":"Dockerisierung des Produktionszyklus: Wie Kinsta die End-to-End-Entwicklungserfahrung verbessert hat","isPartOf":{"@id":"https:\/\/kinsta.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg","datePublished":"2023-08-23T14:32:04+00:00","dateModified":"2023-08-31T08:25:46+00:00","description":"Hier erf\u00e4hrst du, wie Kinsta durch die Dockerisierung aller Schritte des Produktionszyklus die gesamte Entwicklungsarbeit verbessert hat.","breadcrumb":{"@id":"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/#primaryimage","url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg","contentUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/de\/blog\/kinsta-docker\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/de\/"},{"@type":"ListItem","position":2,"name":"Docker","item":"https:\/\/kinsta.com\/de\/thema\/docker\/"},{"@type":"ListItem","position":3,"name":"Wie Kinsta die End-to-End-Entwicklungserfahrung durch Dockerisierung jedes Schritts des Produktionszyklus verbessert hat"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/de\/#website","url":"https:\/\/kinsta.com\/de\/","name":"Kinsta\u00ae","description":"Schnelle, sichere und hochwertige Hosting-L\u00f6sungen","publisher":{"@id":"https:\/\/kinsta.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/de\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/de\/wp-content\/uploads\/sites\/5\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Deutschland-207459890108303\/","https:\/\/x.com\/Kinsta_DE","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/de\/#\/schema\/person\/afd8216d3181e47da9f6e804526b0a97","name":"Amin Choroomi","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/kinsta.com\/de\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/f986556230b70b812c88e12d0c4726cf?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f986556230b70b812c88e12d0c4726cf?s=96&d=mm&r=g","caption":"Amin Choroomi"},"description":"Software developer at Kinsta. Passionate about Docker and Kubernetes, he specializes in application development and DevOps practices.","url":"https:\/\/kinsta.com\/de\/blog\/author\/aminchoroomi\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/65197","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/users\/297"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/comments?post=65197"}],"version-history":[{"count":7,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/65197\/revisions"}],"predecessor-version":[{"id":65343,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/posts\/65197\/revisions\/65343"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/65197\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/65197\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/65197\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/65197\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/65197\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/65197\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/65197\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/65197\/translations\/es"},{"href":"https:\/\/kinsta.com\/de\/wp-json\/kinsta\/v1\/posts\/65197\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/media\/65198"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/media?parent=65197"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/tags?post=65197"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/de\/wp-json\/wp\/v2\/topic?post=65197"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}