{"id":72572,"date":"2023-08-23T15:39:12","date_gmt":"2023-08-23T14:39:12","guid":{"rendered":"https:\/\/kinsta.com\/it\/?p=72572&#038;preview=true&#038;preview_id=72572"},"modified":"2023-08-31T09:22:08","modified_gmt":"2023-08-31T08:22:08","slug":"kinsta-docker","status":"publish","type":"post","link":"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/","title":{"rendered":"Come Kinsta ha migliorato l&#8217;esperienza di sviluppo end-to-end con la Dockerizzazione di ogni fase del ciclo di produzione"},"content":{"rendered":"<p>In Kinsta abbiamo progetti di tutte le dimensioni per l&#8217;Hosting di Applicazioni, l&#8217;Hosting di Database e l&#8217;Hosting WordPress Gestito.<\/p>\n<p>Con le soluzioni di cloud hosting di Kinsta, si possono <a href=\"https:\/\/sevalla.com\/application-hosting\/\">distribuire applicazioni<\/a> in diversi linguaggi e framework, come NodeJS, PHP, Ruby, Go, Scala e Python. Con un file Docker, potrete distribuire qualsiasi applicazione. Potete collegare il vostro repository Git (ospitato su GitHub, GitLab o Bitbucket) per distribuire il codice direttamente su Kinsta.<\/p>\n<p>Potete <a href=\"https:\/\/sevalla.com\/database-hosting\/\">ospitare i database MariaDB, Redis, MySQL e PostgreSQL<\/a> in modo immediato, risparmiando tempo per concentrarvi sullo sviluppo delle vostre applicazioni piuttosto che sulle configurazioni di hosting.<\/p>\n<p>Inoltre, se scegliete il nostro <a href=\"https:\/\/kinsta.com\/it\/hosting-wordpress\/\">Hosting WordPress Gestito<\/a>, potrete usufruire della potenza delle macchine di Google Cloud C2 sulla loro rete di livello Premium e della sicurezza integrata in Cloudflare, rendendo i vostri siti web WordPress i pi\u00f9 veloci e sicuri del mercato.<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>Superare la sfida dello sviluppo di applicazioni cloud-native in un team distribuito<\/h2>\n<p>Una delle sfide pi\u00f9 grandi dello sviluppo e della manutenzione di applicazioni cloud-native a livello aziendale \u00e8 quella di avere un&#8217;esperienza coerente durante l&#8217;intero ciclo di vita dello sviluppo. Questo \u00e8 ancora pi\u00f9 difficile per le aziende remote con team distribuiti che lavorano su piattaforme diverse, con configurazioni diverse e comunicazioni asincrone. Dobbiamo fornire una soluzione coerente, affidabile e scalabile che funzioni per:<\/p>\n<ul>\n<li>Sviluppatori e team di controllo qualit\u00e0, indipendentemente dai loro sistemi operativi, per creare una configurazione semplice e minima per lo sviluppo e il test delle funzionalit\u00e0.<\/li>\n<li>I team DevOps, SysOps e Infra, per configurare e mantenere gli ambienti di staging e di produzione.<\/li>\n<\/ul>\n<p>In Kinsta, ci affidiamo molto a <a href=\"https:\/\/kinsta.com\/it\/blog\/cosa-e-docker\/\">Docker<\/a> per ottenere un&#8217;esperienza coerente in ogni fase, dallo sviluppo alla produzione. In questo post vedremo:<\/p>\n<ul>\n<li>Come sfruttare Docker Desktop per aumentare la produttivit\u00e0 del team di sviluppo.<\/li>\n<li>Come costruiamo le immagini Docker e le inviamo a Google Container Registry tramite pipeline CI con CircleCI e GitHub Actions.<\/li>\n<li>Come usiamo le pipeline CD per promuovere modifiche incrementali alla produzione utilizzando immagini Docker, Google Kubernetes Engine e Cloud Deploy.<\/li>\n<li>Come il team QA usa senza problemi le immagini Docker precostituite in diversi ambienti.<\/li>\n<\/ul>\n<h2>Usare Docker Desktop per migliorare l&#8217;esperienza di sviluppo<\/h2>\n<p>L&#8217;esecuzione di un&#8217;applicazione in locale richiede che gli sviluppatori preparino meticolosamente l&#8217;ambiente, installino tutte le dipendenze, impostino i server e i servizi e si assicurino che siano configurati correttamente. Quando si eseguono pi\u00f9 applicazioni, tutto questo pu\u00f2 essere complicato, soprattutto quando si tratta di progetti complessi con molteplici dipendenze. Quando a questa variabile si aggiungono pi\u00f9 collaboratori con pi\u00f9 sistemi operativi, si scatena il caos. Per evitarlo, usiamo Docker.<\/p>\n<p>Con Docker si possono dichiarare le configurazioni dell&#8217;ambiente, installare le dipendenze e creare immagini con ogni cosa al suo posto. Chiunque, ovunque, con qualsiasi sistema operativo, pu\u00f2 usare le stesse immagini e avere la stessa esperienza di tutti gli altri.<\/p>\n<h2>Dichiarare la configurazione con Docker Compose<\/h2>\n<p>Per iniziare, creiamo un file <a href=\"https:\/\/docs.docker.com\/compose\/\" target=\"_blank\" rel=\"noopener noreferrer\">Docker Compose<\/a>, <code>docker-compose.yml<\/code>. Si tratta di un file di configurazione dichiarativo scritto in formato YAML che indica a Docker lo stato desiderato dell&#8217;applicazione. Docker usa queste informazioni per configurare l&#8217;ambiente per l&#8217;applicazione.<\/p>\n<p>I file Docker Compose sono molto utili quando si ha pi\u00f9 di un container in esecuzione e ci sono dipendenze tra i container.<\/p>\n<p>Per creare il file <code>docker-compose.yml<\/code>:<\/p>\n<ol>\n<li>Iniziamo scegliendo un file <a href=\"https:\/\/hub.docker.com\/\" target=\"_blank\" rel=\"noopener noreferrer\"><code>image<\/code><\/a> come base per la nostra applicazione. Cerchiamo su Docker Hub e cerchiamo di trovare un&#8217;immagine Docker che contenga gi\u00e0 le dipendenze dell&#8217;applicazione. Assicuriamoci di usare un tag immagine specifico per evitare errori. L&#8217;utilizzo del tag <code>latest<\/code> pu\u00f2 causare errori imprevisti nell\u2019applicazione. Possiamo usare pi\u00f9 immagini di base per pi\u00f9 dipendenze. Per esempio, una per <a href=\"https:\/\/kinsta.com\/it\/blog\/cosa-e-postgresql\/\">PostgreSQL<\/a> e una per <a href=\"https:\/\/kinsta.com\/it\/blog\/redis-docker\/\">Redis<\/a>.<\/li>\n<li>Usiamo <a href=\"https:\/\/docs.docker.com\/storage\/volumes\/\" target=\"_blank\" rel=\"noopener noreferrer\"><code>volumes<\/code><\/a> per persistere i dati sull&#8217;host, se necessario. La persistenza dei dati sul computer host aiuta a non perdere i dati se i container docker vengono cancellati o se \u00e8 necessario ricrearli.<\/li>\n<li>Usiamo <a href=\"https:\/\/docs.docker.com\/network\/\" target=\"_blank\" rel=\"noopener noreferrer\"><code>networks<\/code><\/a> per isolare la configurazione ed evitare conflitti di rete con l&#8217;host e gli altri container. Inoltre, aiutiamo i nostri container a trovarsi e a comunicare facilmente tra loro.<\/li>\n<\/ol>\n<p>Riunendo il tutto, abbiamo un <code>docker-compose.yml<\/code> che si presenta in questo modo:<\/p>\n<pre><code class=\"language-yaml\">version: '3.8'services:\n  db:\n\timage: postgres:14.7-alpine3.17\n\thostname: mk_db\n\trestart: on-failure\n\tports:\n  \t- ${DB_PORT:-5432}:5432\n\tvolumes:\n  \t- db_data:\/var\/lib\/postgresql\/data\n\tenvironment:\n  \tPOSTGRES_USER: ${DB_USER:-user}\n  \tPOSTGRES_PASSWORD: ${DB_PASSWORD:-password}\n  \tPOSTGRES_DB: ${DB_NAME:-main}\n\tnetworks:\n  \t- mk_network\n  redis:\n\timage: redis:6.2.11-alpine3.17\n\thostname: mk_redis\n\trestart: on-failure\n\tports:\n  \t- ${REDIS_PORT:-6379}:6379\n\tnetworks:\n  \t- mk_network\n \t \nvolumes:\n  db_data:\n\nnetworks:\n  mk_network:\n\tname: mk_network<\/code><\/pre>\n<h2>Containerizzare l&#8217;applicazione<\/h2>\n<h3>Creare un&#8217;immagine Docker per l&#8217;applicazione<\/h3>\n<p>Per prima cosa, dobbiamo creare un&#8217;immagine Docker utilizzando <code>Dockerfile<\/code> e poi richiamarla da <code>docker-compose.yml<\/code>.<\/p>\n<p>Per creare il <code>Dockerfile<\/code>:<\/p>\n<ol>\n<li>Iniziamo scegliendo un&#8217;immagine di base. Usiamo l&#8217;immagine di base pi\u00f9 piccola possibile per l&#8217;applicazione. Di solito, le immagini Alpine sono molto minimali e non hanno quasi nessun pacchetto extra installato. Possiamo iniziare con un&#8217;immagine Alpine e costruirci sopra:\n<pre><code class=\"language-markdown\">FROM node:18.15.0-alpine3.17\n<\/code><\/pre>\n<\/li>\n<li>A volte \u00e8 necessario usare un&#8217;architettura CPU specifica per evitare conflitti. Per esempio, supponiamo di usare un processore <code>arm64-based<\/code> ma di dover creare un&#8217;immagine <code>amd64<\/code>. Possiamo farlo specificando <code>-- platform<\/code> in <code>Dockerfile<\/code>:\n<pre><code class=\"language-markdown\">FROM --platform=amd64 node:18.15.0-alpine3.17\n<\/code><\/pre>\n<\/li>\n<li>Definiamo la directory dell&#8217;applicazione, installiamo le dipendenze e copiamo il risultato nella directory principale:\n<pre><code class=\"language-markdown\">WORKDIR \/opt\/app\nCOPY package.json yarn.lock .\/\nRUN yarn install\nCOPY . .<\/code><\/pre>\n<\/li>\n<li>Chiamiamo il sito <code>Dockerfile<\/code> da <code>docker-compose.yml<\/code>:\n<pre><code class=\"language-yaml\">services:\n  ...redis\n  ...db\n  \n  app:\n\tbuild:\n  \tcontext: .\n  \tdockerfile: Dockerfile\n\tplatforms:\n  \t- \"linux\/amd64\"\n\tcommand: yarn dev\n\trestart: on-failure\n\tports:\n  \t- ${PORT:-4000}:${PORT:-4000}\n\tnetworks:\n  \t- mk_network\n\tdepends_on:\n  \t- redis\n  \t- db<\/code><\/pre>\n<\/li>\n<li>Implementiamo il caricamento automatico in modo che quando viene modificato qualcosa nel codice sorgente, si possa vedere immediatamente l&#8217;anteprima delle modifiche senza dover ricostruire manualmente l&#8217;applicazione. Per farlo, costruiamo prima l&#8217;immagine e poi eseguiamola in un servizio separato:\n<pre><code class=\"language-yaml\">services:\n  ... redis\n  ... db\n  \n  build-docker:\n\timage: myapp\n\tbuild:\n  \tcontext: .\n  \tdockerfile: Dockerfile\n  app:\n\timage: myapp\n\tplatforms:\n  \t- \"linux\/amd64\"\n\tcommand: yarn dev\n\trestart: on-failure\n\tports:\n  \t- ${PORT:-4000}:${PORT:-4000}\n\tvolumes:\n  \t- .:\/opt\/app\n  \t- node_modules:\/opt\/app\/node_modules\n\tnetworks:\n  \t- mk_network\n\tdepends_on:\n  \t- redis\n  \t- db\n  \t- build-docker\n \t \nvolumes:\n  node_modules:<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>Suggerimento: <code>node_modules<\/code> viene montato esplicitamente per evitare problemi specifici della piattaforma con i pacchetti. Ci\u00f2 significa che invece di usare <code>node_modules<\/code> sull&#8217;host, il contenitore docker usa il proprio ma lo mappa sull&#8217;host in un volume separato.<\/p>\n<h2>Costruire in modo incrementale le immagini di produzione con l&#8217;integrazione continua<\/h2>\n<p>La maggior parte delle applicazioni e dei servizi usa la CI\/CD per la distribuzione. Docker svolge un ruolo importante in questo processo. Ogni modifica apportata al branch principale attiva immediatamente una pipeline di build attraverso GitHub Actions o CircleCI. Il flusso di lavoro generale \u00e8 molto semplice: installa le dipendenze, esegue i test, costruisce l&#8217;immagine docker e la invia al Google Container Registry (o Artifact Registry). La parte di cui parliamo in questo articolo \u00e8 la fase di build.<\/p>\n<h3>Creazione delle immagini Docker<\/h3>\n<p>Per motivi di sicurezza e di prestazioni, usiamo build in pi\u00f9 fasi.<\/p>\n<h4>Fase 1: Costruttore<\/h4>\n<p>In questa fase copiamo l&#8217;intero codice base con tutti i sorgenti e la configurazione, installiamo tutte le dipendenze, comprese quelle di dev, e costruiamo l&#8217;applicazione. Viene creata una cartella <code>dist\/<\/code> e in cui si copia la versione costruita del codice. Ma questa immagine \u00e8 troppo grande, con un&#8217;enorme serie di impronte, per essere utilizzata in produzione. Inoltre, dato che ci serviamo di registri NPM privati, usiamo anche il nostro <code>NPM_TOKEN<\/code> privato in questa fase. Quindi, non vogliamo assolutamente che questo stadio sia esposto al mondo esterno. L&#8217;unica cosa di cui abbiamo bisogno in questa fase \u00e8 la cartella <code>dist\/<\/code>.<\/p>\n<h4>Fase 2: Produzione<\/h4>\n<p>La maggior parte delle persone usa questo stage per il runtime perch\u00e9 \u00e8 molto vicino a ci\u00f2 che serve per far funzionare l&#8217;applicazione. Tuttavia, dobbiamo ancora installare le dipendenze di produzione e questo significa che lasciamo delle impronte e abbiamo bisogno di <code>NPM_TOKEN<\/code>. Quindi questo stadio non \u00e8 ancora pronto per essere esposto. Merita inoltre particolare attenzione <code>yarn cache clean<\/code> alla riga 19. Questo piccolo comando riduce le dimensioni della nostra immagine fino al 60%.<\/p>\n<h4>Fase 3: Runtime<\/h4>\n<p>L&#8217;ultimo stadio deve essere il pi\u00f9 sottile possibile e con un&#8217;impronta minima. Per questo motivo, copiamo l&#8217;applicazione gi\u00e0 pronta dalla produzione e andiamo avanti. Lasciamo da parte tutte le cose di yarn e <code>NPM_TOKEN<\/code> ed eseguiamo solo l&#8217;applicazione.<\/p>\n<p>Questa \u00e8 la versione finale di <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>Notate che, per tutte le fasi, iniziamo a copiare prima i file <code>package.json<\/code> e <code>yarn.lock<\/code>, installiamo le dipendenze e poi copiamo il resto del codice base. Il motivo \u00e8 che Docker costruisce ogni comando come un livello superiore al precedente. Ogni build pu\u00f2 usare i livelli precedenti, se disponibili, e costruire solo i nuovi livelli per motivi di prestazioni.<\/p>\n<p>Supponiamo di aver cambiato qualcosa in <code>src\/services\/service1.ts<\/code> senza toccare i pacchetti. Ci\u00f2 significa che i primi quattro livelli dello stage del builder non sono stati toccati e possono essere riutilizzati. Questo rende il processo di build incredibilmente pi\u00f9 veloce.<\/p>\n<h3>Inviare l&#8217;app al registro dei container di Google attraverso le pipeline di CircleCI<\/h3>\n<p>Esistono diversi modi per creare un&#8217;immagine Docker nelle pipeline di CircleCI. Nel nostro caso, abbiamo scelto di usare <code>circleci\/gcp-gcr orbs<\/code>:<\/p>\n<pre><code class=\"language-yaml\">executors:\n  docker-executor:\n    docker:\n  \t- image: cimg\/base:2023.03\norbs:\n  gcp-gcr: circleci\/gcp-gcr@0.15.1\njobs:\n  ...\n  deploy:\n\tdescription: Build & push image to Google Artifact Registry\n\texecutor: docker-executor\n\tsteps:\n  \t...\n  \t- gcp-gcr\/build-image:\n      \timage: my-app\n      \tdockerfile: Dockerfile.production\n      \ttag: ${CIRCLE_SHA1:0:7},latest\n  \t- gcp-gcr\/push-image:\n      \timage: my-app\n      \ttag: ${CIRCLE_SHA1:0:7},latest<\/code><\/pre>\n<p>Grazie a Docker, la configurazione necessaria per creare e inviare la nostra applicazione \u00e8 minima.<\/p>\n<h3>Eseguire il push dell&#8217;app nel registro di Google Container attraverso le azioni di GitHub<\/h3>\n<p>In alternativa a CircleCI, possiamo usare GitHub Actions per distribuire l&#8217;applicazione in modo continuo. Configuriamo <code>gcloud<\/code>, eseguiamo la build e poi il push dell&#8217;immagine Docker su <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    \techo \"TAG=$(git rev-parse --short HEAD)\" &gt;&gt; $GITHUB_ENV\n\n    - uses: google-github-actions\/setup-gcloud@master\n  \twith:\n    \tservice_account_key: ${{ secrets.GCP_SA_KEY }}\n    \tproject_id: ${{ secrets.GCP_PROJECT_ID }}\n\n    - run: |-\n    \tgcloud --quiet auth configure-docker\n\n    - name: Build\n      run: |-\n    \tdocker build\n      \t--tag \"gcr.io\/${{ secrets.GCP_PROJECT_ID }}\/my-app:$TAG\"\n      \t--tag \"gcr.io\/${{ secrets.GCP_PROJECT_ID }}\/my-app:latest\"\n      \t.\n\n    - name: Push\n      run: |-\n    \tdocker push \"gcr.io\/${{ secrets.GCP_PROJECT_ID }}\/my-app:$TAG\"\n    \tdocker push \"gcr.io\/${{ secrets.GCP_PROJECT_ID }}\/my-app:latest\"<\/code><\/pre>\n<p>A ogni piccola modifica apportata al branch principale, effettuiamo build e push di una nuova immagine Docker nel registro.<\/p>\n<h2>Distribuire le modifiche a Google Kubernetes Engine utilizzando le Delivery Pipeline di Google<\/h2>\n<p>Avere immagini Docker pronte all&#8217;uso per ogni singola modifica rende pi\u00f9 facile il deploy in produzione o il rollback nel caso in cui qualcosa vada storto. Usiamo Google Kubernetes Engine per gestire e servire le nostre applicazioni e usiamo Google Cloud Deploy e Delivery Pipelines per il nostro processo di distribuzione continua.<\/p>\n<p>Quando l&#8217;immagine Docker viene costruita dopo ogni piccola modifica (con la pipeline CI mostrata sopra) facciamo un ulteriore passo avanti e distribuiamo la modifica al nostro cluster di sviluppo utilizzando <code>gcloud<\/code>. Diamo un&#8217;occhiata a questa fase della pipeline CircleCI:<\/p>\n<pre><code class=\"language-yaml\">- run:\n\tname: Create new release\n\tcommand: 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>In questo modo si attiva un processo di rilascio per distribuire le modifiche nel nostro cluster Kubernetes di sviluppo. Dopo aver testato e ottenuto le approvazioni, promuoviamo la modifica a staging e poi a produzione. Tutto questo \u00e8 possibile perch\u00e9 per ogni modifica abbiamo un&#8217;immagine Docker isolata e sottile che contiene quasi tutto ci\u00f2 di cui ha bisogno. Dobbiamo solo indicare al deployment quale tag usare.<\/p>\n<h2>Come il team di Quality Assurance (QA) trae vantaggio da questo processo<\/h2>\n<p>Il team QA ha bisogno soprattutto di una versione cloud di pre-produzione delle applicazioni da testare. Tuttavia, a volte ha bisogno di eseguire un&#8217;app precostruita in locale (con tutte le dipendenze) per testare una determinata funzionalit\u00e0. In questi casi, non vogliono o non hanno bisogno di affrontare la clonazione dell&#8217;intero progetto, l&#8217;installazione dei pacchetti npm, la creazione dell&#8217;app, gli errori dello sviluppatore e l&#8217;intero processo di sviluppo per rendere l&#8217;app operativa. Ora che tutto \u00e8 gi\u00e0 disponibile come immagine Docker su Google Container Registry, tutto ci\u00f2 che serve \u00e8 un servizio nel file Docker compose:<\/p>\n<pre><code class=\"language-yaml\">services:\n  ...redis\n  ...db\n  \n  app:\n\timage: gcr.io\/${PROJECT_ID}\/my-app:latest\n\trestart: on-failure\n\tports:\n  \t- ${PORT:-4000}:${PORT:-4000}\n\tenvironment:\n  \t- NODE_ENV=production\n  \t- REDIS_URL=redis:\/\/redis:6379\n  \t- DATABASE_URL=postgresql:\/\/${DB_USER:-user}:${DB_PASSWORD:-password}@db:5432\/main\n\tnetworks:\n  \t- mk_network\n\tdepends_on:\n  \t- redis\n  \t- db<\/code><\/pre>\n<p>Con questo servizio, possono avviare l&#8217;applicazione sulle loro macchine locali usando i container Docker:<\/p>\n<pre><code class=\"language-shell\">docker compose up<\/code><\/pre>\n<p>Questo \u00e8 un enorme passo avanti verso la semplificazione dei processi di testing. Anche se il QA decide di testare un tag specifico dell&#8217;applicazione, pu\u00f2 facilmente cambiare il tag dell&#8217;immagine alla riga 6 ed eseguire nuovamente il comando Docker compose. Anche se decidono di confrontare simultaneamente diverse versioni dell&#8217;app, possono farlo facilmente con poche modifiche. Il vantaggio pi\u00f9 grande \u00e8 quello di tenere il nostro team di QA lontano dalle sfide degli sviluppatori.<\/p>\n<h2>Vantaggi dell&#8217;uso di Docker<\/h2>\n<ul>\n<li><strong>Impronte quasi nulle per le dipendenze<\/strong>: se si decide di aggiornare la versione di Redis o Postgres, \u00e8 possibile cambiare solo una riga e rieseguire l&#8217;applicazione. Non c&#8217;\u00e8 bisogno di cambiare nulla nel sistema. Inoltre, se si hanno due applicazioni che necessitano entrambe di Redis (magari anche con versioni diverse), \u00e8 possibile farle girare entrambe nel proprio ambiente isolato senza alcun conflitto tra loro.<\/li>\n<li><strong>Istanze multiple dell&#8217;applicazione<\/strong>: Ci sono molti casi in cui abbiamo bisogno di eseguire la stessa applicazione con un comando diverso. Per esempio, l&#8217;inizializzazione del DB, l&#8217;esecuzione di test, l&#8217;osservazione delle modifiche del DB o l&#8217;ascolto di messaggi. In ognuno di questi casi, dato che abbiamo gi\u00e0 l&#8217;immagine costruita pronta, basta aggiungere un altro servizio al file Docker compose con un comando diverso e il gioco \u00e8 fatto.<\/li>\n<li><strong>Ambiente di test pi\u00f9 semplice<\/strong>: Il pi\u00f9 delle volte, si ha solo bisogno di eseguire l&#8217;applicazione. Non servono codice, pacchetti o connessioni al database locale. Ci si vuole solo assicurare che l&#8217;applicazione funzioni correttamente o si ha bisogno di un&#8217;istanza funzionante come servizio di backend mentre si lavora a un progetto. Questo potrebbe essere anche il caso di QA, revisori di Pull Request o anche di persone UX che vogliono assicurarsi che il loro progetto sia stato implementato correttamente. La nostra configurazione docker rende molto semplice per tutti loro l&#8217;utilizzo senza dover affrontare troppi problemi tecnici.<\/li>\n<\/ul>\n<p><em>Questo articolo \u00e8 stato pubblicato originariamente su <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>.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In Kinsta abbiamo progetti di tutte le dimensioni per l&#8217;Hosting di Applicazioni, l&#8217;Hosting di Database e l&#8217;Hosting WordPress Gestito. Con le soluzioni di cloud hosting di &#8230;<\/p>\n","protected":false},"author":297,"featured_media":72573,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[26216,26206],"class_list":["post-72572","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-docker","topic-servizi-kinsta"],"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>Dockerizzare il ciclo di produzione: come Kinsta ha migliorato l&#039;esperienza di sviluppo end-to-end<\/title>\n<meta name=\"description\" content=\"Scopri come Kinsta ha migliorato l&#039;esperienza di sviluppo end-to-end grazie alla dockerizzazione di ogni fase del ciclo di produzione.\" \/>\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\/it\/blog\/kinsta-docker\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Come Kinsta ha migliorato l&#039;esperienza di sviluppo end-to-end con la Dockerizzazione di ogni fase del ciclo di produzione\" \/>\n<meta property=\"og:description\" content=\"Scopri come Kinsta ha migliorato l&#039;esperienza di sviluppo end-to-end grazie alla dockerizzazione di ogni fase del ciclo di produzione.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstaitalia\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-08-23T14:39:12+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-31T08:22:08+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/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=\"Scopri come Kinsta ha migliorato l&#039;esperienza di sviluppo end-to-end grazie alla dockerizzazione di ogni fase del ciclo di produzione.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/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_IT\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_IT\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Amin Choroomi\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/\"},\"author\":{\"name\":\"Amin Choroomi\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/afd8216d3181e47da9f6e804526b0a97\"},\"headline\":\"Come Kinsta ha migliorato l&#8217;esperienza di sviluppo end-to-end con la Dockerizzazione di ogni fase del ciclo di produzione\",\"datePublished\":\"2023-08-23T14:39:12+00:00\",\"dateModified\":\"2023-08-31T08:22:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/\"},\"wordCount\":2041,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg\",\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/\",\"url\":\"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/\",\"name\":\"Dockerizzare il ciclo di produzione: come Kinsta ha migliorato l'esperienza di sviluppo end-to-end\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg\",\"datePublished\":\"2023-08-23T14:39:12+00:00\",\"dateModified\":\"2023-08-31T08:22:08+00:00\",\"description\":\"Scopri come Kinsta ha migliorato l'esperienza di sviluppo end-to-end grazie alla dockerizzazione di ogni fase del ciclo di produzione.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/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\/it\/blog\/kinsta-docker\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Docker\",\"item\":\"https:\/\/kinsta.com\/it\/argomenti\/docker\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Come Kinsta ha migliorato l&#8217;esperienza di sviluppo end-to-end con la Dockerizzazione di ogni fase del ciclo di produzione\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/it\/#website\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluzioni di hosting premium, veloci e sicure\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/it\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/it\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstaitalia\/\",\"https:\/\/x.com\/Kinsta_IT\",\"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\/it\/#\/schema\/person\/afd8216d3181e47da9f6e804526b0a97\",\"name\":\"Amin Choroomi\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/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\/it\/blog\/author\/aminchoroomi\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Dockerizzare il ciclo di produzione: come Kinsta ha migliorato l'esperienza di sviluppo end-to-end","description":"Scopri come Kinsta ha migliorato l'esperienza di sviluppo end-to-end grazie alla dockerizzazione di ogni fase del ciclo di produzione.","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\/it\/blog\/kinsta-docker\/","og_locale":"it_IT","og_type":"article","og_title":"Come Kinsta ha migliorato l'esperienza di sviluppo end-to-end con la Dockerizzazione di ogni fase del ciclo di produzione","og_description":"Scopri come Kinsta ha migliorato l'esperienza di sviluppo end-to-end grazie alla dockerizzazione di ogni fase del ciclo di produzione.","og_url":"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstaitalia\/","article_published_time":"2023-08-23T14:39:12+00:00","article_modified_time":"2023-08-31T08:22:08+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/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":"Scopri come Kinsta ha migliorato l'esperienza di sviluppo end-to-end grazie alla dockerizzazione di ogni fase del ciclo di produzione.","twitter_image":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg","twitter_creator":"@Kinsta_IT","twitter_site":"@Kinsta_IT","twitter_misc":{"Scritto da":"Amin Choroomi","Tempo di lettura stimato":"11 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/"},"author":{"name":"Amin Choroomi","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/afd8216d3181e47da9f6e804526b0a97"},"headline":"Come Kinsta ha migliorato l&#8217;esperienza di sviluppo end-to-end con la Dockerizzazione di ogni fase del ciclo di produzione","datePublished":"2023-08-23T14:39:12+00:00","dateModified":"2023-08-31T08:22:08+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/"},"wordCount":2041,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg","inLanguage":"it-IT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/","url":"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/","name":"Dockerizzare il ciclo di produzione: come Kinsta ha migliorato l'esperienza di sviluppo end-to-end","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg","datePublished":"2023-08-23T14:39:12+00:00","dateModified":"2023-08-31T08:22:08+00:00","description":"Scopri come Kinsta ha migliorato l'esperienza di sviluppo end-to-end grazie alla dockerizzazione di ogni fase del ciclo di produzione.","breadcrumb":{"@id":"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/blog\/kinsta-docker\/#primaryimage","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/08\/how-kinsta-improved-the-end-to-end-development-experience-by-dockerizing-every-step-of-the-production-cycle.jpg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/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\/it\/blog\/kinsta-docker\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/it\/"},{"@type":"ListItem","position":2,"name":"Docker","item":"https:\/\/kinsta.com\/it\/argomenti\/docker\/"},{"@type":"ListItem","position":3,"name":"Come Kinsta ha migliorato l&#8217;esperienza di sviluppo end-to-end con la Dockerizzazione di ogni fase del ciclo di produzione"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/it\/#website","url":"https:\/\/kinsta.com\/it\/","name":"Kinsta\u00ae","description":"Soluzioni di hosting premium, veloci e sicure","publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/it\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/it\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstaitalia\/","https:\/\/x.com\/Kinsta_IT","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\/it\/#\/schema\/person\/afd8216d3181e47da9f6e804526b0a97","name":"Amin Choroomi","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/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\/it\/blog\/author\/aminchoroomi\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/72572","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/users\/297"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/comments?post=72572"}],"version-history":[{"count":15,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/72572\/revisions"}],"predecessor-version":[{"id":72726,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/72572\/revisions\/72726"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/72572\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/72572\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/72572\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/72572\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/72572\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/72572\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/72572\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/72572\/translations\/es"},{"href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/72572\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media\/72573"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media?parent=72572"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/tags?post=72572"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/topic?post=72572"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}