{"id":52071,"date":"2020-02-18T05:34:24","date_gmt":"2020-02-18T02:34:24","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy"},"modified":"2020-02-18T05:34:24","modified_gmt":"2020-02-18T02:34:24","slug":"horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","title":{"rendered":"Pensateci bene prima di usare Docker-in-Docker per ambienti CI o di test","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Pensateci bene prima di usare Docker-in-Docker per ambienti CI o di test\" src=\"\/wp-content\/uploads\/2020\/02\/50b03664f1984b36e1703717dfaa7ecc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDocker-in-Docker \u00e8 un ambiente virtualizzato del demone Docker, eseguito all'interno del contenitore stesso per costruire immagini del contenitore. L'obiettivo principale della creazione di Docker-in-Docker era aiutare nello sviluppo di Docker stesso. Molti lo usano per eseguire Jenkins CI. Inizialmente sembra normale, ma poi emergono problemi che possono essere evitati installando Docker nel contenitore Jenkins CI. In questo articolo si spiega come fare. Se siete interessati alla soluzione finale senza dettagli, leggete semplicemente l'ultima sezione dell'articolo \"Risolvere il problema\".<\/p>\n<p><img decoding=\"async\" alt=\"Pensateci bene prima di usare Docker-in-Docker per ambienti CI o di test\" src=\"\/wp-content\/uploads\/2020\/02\/0fdafa0c0a1768170cff52333e733314.png\" style=\"display:block;margin: 0 auto;\" \/><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Docker-in-Docker: \"Buono\"<\/h3>\n<p>\nPi\u00f9 di due anni fa, ho inserito in Docker <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/moby\/moby\/commit\/280901e5fbd0c2dabd14d7a9b69a073f6e8f87e4\">flag<\/a><\/noindex> -privileged e scritto <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jpetazzo\/dind\/commit\/bfbe19c0eec634f66c9f8bac53c6b7c7e0fdb063\">la prima versione di dind<\/a><\/noindex>. L'obiettivo era aiutare il team principale a sviluppare Docker pi\u00f9 rapidamente. Prima dell'arrivo di Docker-in-Docker, il ciclo di sviluppo tipo era il seguente:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>build;<\/li>\n<li>fermare il demone Docker in esecuzione;<\/li>\n<li>avviare un nuovo demone Docker;<\/li>\n<li>testare;<\/li>\n<li>ripetere il ciclo.<\/li>\n<\/ul>\n<p>\nSe si desiderava fare una build bella e riproducibile (cio\u00e8 in un contenitore), diventava pi\u00f9 complicato:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>assicurarsi di avere una versione funzionante di Docker in esecuzione;<\/li>\n<li>compilare un nuovo Docker con un vecchio Docker;<\/li>\n<li>fermare il demone Docker;<\/li>\n<li>avviare un nuovo demone Docker;<\/li>\n<li>testare;<\/li>\n<li>fermare il nuovo demone Docker;<\/li>\n<li>ripetere.<\/li>\n<\/ul>\n<p>\nCon l'arrivo di Docker-in-Docker, il processo si \u00e8 semplificato:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>compilazione + esecuzione in un'unica fase;<\/li>\n<li>ripetere il ciclo.<\/li>\n<\/ul>\n<p>\nNon \u00e8 vero che sia molto meglio?<\/p>\n<p><img decoding=\"async\" alt=\"Pensateci bene prima di usare Docker-in-Docker per ambienti CI o di test\" src=\"\/wp-content\/uploads\/2020\/02\/b4870536068c660a8d996ec53f079504.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Docker-in-Docker: \"Cattivo\"<\/h3>\n<p>\nTuttavia, contrariamente alla credenza popolare, Docker-in-Docker non \u00e8 composto al 100% da stelle, pony e unicorni. Voglio dire, ci sono alcuni problemi di cui gli sviluppatori devono essere a conoscenza.<\/p>\n<p>Uno dei problemi riguarda LSM (moduli di sicurezza Linux), come AppArmor e SELinux: quando si avvia un container, il 'Docker interno' pu\u00f2 cercare di applicare profili di sicurezza che confliggeranno o confonderanno il 'Docker esterno'. Questo \u00e8 stato il problema pi\u00f9 complesso da risolvere nel tentativo di unire l'implementazione originale del flag \u2013privileged. Le mie modifiche funzionavano e tutti i test avrebbero passato anche sulla mia macchina Debian e sulle macchine virtuali di prova Ubuntu, ma sarebbero crollate e bruciate sulla macchina di Michael Crosby (per quanto ricordi, aveva Fedora). Non riesco a ricordare la causa esatta del problema, ma potrebbe essere emersa perch\u00e9 Mike \u00e8 un uomo saggio che lavora con SELINUX=enforce (io usavo AppArmor) e le mie modifiche non tenevano conto dei profili SELinux.<\/p>\n<h3>Docker-in-Docker: 'Malvagio'<\/h3>\n<p>\nIl secondo problema riguarda i driver di archiviazione di Docker. Quando si esegue Docker-in-Docker, il Docker esterno funziona sopra un filesystem normale (EXT4, BTRFS o qualsiasi altro tu abbia), mentre il Docker interno funziona sopra un filesystem copy-on-write (AUFS, BTRFS, Device Mapper, ecc., a seconda di ci\u00f2 che \u00e8 configurato per essere utilizzato dal Docker esterno). Questo porta a molte combinazioni che non funzioneranno. Ad esempio, non puoi eseguire AUFS sopra AUFS. <\/p>\n<p>Se esegui BTRFS sopra BTRFS, inizialmente dovrebbe funzionare, ma una volta che compaiono i sottovolumi nidificati, non sar\u00e0 possibile eliminare il sottovolume genitore. Il modulo Device Mapper non ha spazi dei nomi, quindi, se pi\u00f9 istanze di Docker lo utilizzano su una macchina, tutte potranno vedere (e influenzare) le immagini l'una dell'altra e i dispositivi di backup dei container. Questo \u00e8 problematico.<\/p>\n<p>Ci sono soluzioni alternative per affrontare molti di questi problemi. Ad esempio, se vuoi utilizzare AUFS nel Docker interno, basta trasformare la cartella \/var\/lib\/docker in un volume, e tutto andr\u00e0 bene. Docker ha aggiunto alcuni spazi dei nomi di base ai nomi di destinazione del Device Mapper, in modo che, se pi\u00f9 chiamate a Docker vengono eseguite su una macchina, non si 'sovrapporranno' l'una all'altra.<\/p>\n<p>Tuttavia, una tale configurazione non \u00e8 affatto semplice, come si pu\u00f2 vedere da questi <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jpetazzo\/dind\/issues\/78\">articoli<\/a><\/noindex> nel repository dind su GitHub.<\/p>\n<h3>Docker-in-Docker: sta diventando ancora peggio<\/h3>\n<p>\nE per quanto riguarda la cache della build? Pu\u00f2 essere piuttosto complicato. Le persone spesso mi chiedono: \u201cse eseguo Docker-in-Docker, come posso utilizzare le immagini presenti sul mio host, invece di tirarle di nuovo nel mio Docker interno?\u201d<\/p>\n<p>Alcune persone intraprendenti hanno cercato di montare \/var\/lib\/docker dall'host nel contenitore Docker-in-Docker. A volte condividono \/var\/lib\/docker tra pi\u00f9 contenitori.<\/p>\n<p><img decoding=\"async\" alt=\"Pensateci bene prima di usare Docker-in-Docker per ambienti CI o di test\" src=\"\/wp-content\/uploads\/2020\/02\/192c9d26798d32078272aab1864bbccb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Vuoi danneggiare i dati? Perch\u00e9 questo \u00e8 esattamente ci\u00f2 che dannegger\u00e0 i tuoi dati!<\/i><\/p>\n<p>Il demone Docker \u00e8 chiaramente stato progettato per avere accesso esclusivo a \/var\/lib\/docker. Nient'altro dovrebbe \"toccare, pungere o frugare\" in qualsiasi file Docker che si trova in questa cartella.<\/p>\n<p>Perch\u00e9 \u00e8 cos\u00ec? Perch\u00e9 \u00e8 il risultato di una delle lezioni pi\u00f9 difficili apprese durante lo sviluppo di dotCloud. Il motore dei contenitori di dotCloud funzionava con pi\u00f9 processi che accedevano contemporaneamente a \/var\/lib\/dotcloud. I trucchi astuti, come la sostituzione atomica dei file (anzich\u00e9 la modifica in loco), la \u201cpepatura\u201d del codice con bloccchi raccomandati e obbligatori e altri esperimenti con sistemi sicuri, come SQLite e BDB, non funzionavano sempre. Quando abbiamo riprogettato il nostro motore dei contenitori, che alla fine \u00e8 diventato Docker, una delle principali decisioni progettuali \u00e8 stata quella di concentrare tutte le operazioni con i contenitori sotto un unico demone, per porre fine a tutta questa confusione di accesso simultaneo.<\/p>\n<p>Non fraintendetemi: \u00e8 del tutto possibile fare qualcosa di buono, affidabile e veloce che includa pi\u00f9 processi e gestione concorrente moderna. Ma riteniamo che sia pi\u00f9 semplice e facile scrivere e mantenere il codice utilizzando Docker come unico attore.<\/p>\n<p>Ci\u00f2 significa che se condividi la directory \/var\/lib\/docker tra pi\u00f9 istanze di Docker, avrai dei problemi. Certamente, potrebbe funzionare, soprattutto nelle fasi iniziali di test. \"Ascolta, mamma, posso far partire ubuntu con 'docker'!\" Ma prova a fare qualcosa di pi\u00f9 complesso, come estrarre la stessa immagine da due istanze diverse, e vedrai il mondo in fiamme.<\/p>\n<p>Questo significa che se il tuo sistema CI esegue build e rebuild, ogni volta che riavvii il container Docker-in-Docker rischi di resettare nel suo cache una bomba a orologeria. Non \u00e8 affatto ideale!<\/p>\n<h3>Soluzione del problema<\/h3>\n<p>\nFacciamo un passo indietro. Hai davvero bisogno di Docker-in-Docker oppure vuoi semplicemente poter eseguire Docker, cio\u00e8 costruire e avviare container e immagini dal tuo sistema CI mentre questo sistema CI stesso si trova in un container?<\/p>\n<p>Scommetto che la maggior parte delle persone ha bisogno dell'ultima opzione, ovvero vuole che un sistema CI come Jenkins possa eseguire container. E il modo pi\u00f9 semplice per farlo \u00e8 semplicemente montare il socket Docker nel tuo container CI, collegandolo con il flag -v.<\/p>\n<p>In termini semplici, quando esegui il tuo container CI (Jenkins o altro), invece di cercare di fare hack con Docker-in-Docker, avvialo con la seguente riga:<\/p>\n<pre><code class=\"plaintext\">docker run -v \/var\/run\/docker.sock:\/var\/run\/docker.sock ...<\/code><\/pre>\n<p>\nOra questo container avr\u00e0 accesso al socket Docker e quindi sar\u00e0 in grado di avviare container. A meno che, anzich\u00e9 lanciare container 'figli', lancer\u00e0 container 'fratelli'.<\/p>\n<p>Prova questo utilizzando l'immagine ufficiale di Docker (che contiene il file binario di Docker):<\/p>\n<pre><code class=\"plaintext\">docker run -v \/var\/run\/docker.sock:\/var\/run\/docker.sock \n           -ti docker<\/code><\/pre>\n<p>\nQuesto appare e funziona come Docker-in-Docker, ma non \u00e8 Docker-in-Docker: quando questo container creer\u00e0 ulteriori container, saranno creati nel Docker di livello superiore. Non sperimenterai effetti collaterali di annidamento e la cache di build sar\u00e0 condivisa per pi\u00f9 chiamate.<\/p>\n<p>Nota: le versioni precedenti di questo articolo consigliavano di collegare il file binario di Docker dall'host al container. Ora \u00e8 diventato inaffidabile, poich\u00e9 il meccanismo Docker non si applica pi\u00f9 a librerie statiche o quasi statiche.<\/p>\n<p>Pertanto, se desideri utilizzare Docker da Jenkins CI, hai 2 opzioni:<br \/>\ninstallare Docker CLI utilizzando il sistema di packaging di base dell'immagine (cio\u00e8 se la tua immagine \u00e8 basata su Debian, usa i pacchetti .deb), utilizzare l'API Docker.<\/p>\n<h3>Un po' di pubblicit\u00e0 \ud83d\ude42<\/h3>\n<p>\nGrazie per rimanere con noi. Ti piacciono i nostri articoli? Vuoi vedere pi\u00f9 contenuti interessanti? Supportaci effettuando un ordine o raccomandandoci a qualcuno. <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">VPS cloud per sviluppatori a partire da $4.99.<\/a><\/noindex>, <b>unica alternativa ai server entry-level, concepita da noi per te:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">Tutta la verit\u00e0 sui VPS (KVM) E5-2697 v3 (6 Core) 10GB DDR4 480GB SSD 1Gbps a partire da $19 o come dividere correttamente un server?<\/a><\/noindex> (sono disponibili opzioni con RAID1 e RAID10, fino a 24 core e fino a 40GB DDR4).<\/p>\n<p><b>Dell R730xd a met\u00e0 prezzo nel data center Equinix Tier IV ad Amsterdam?<\/b> Solo da noi <b><noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/serversnl\">2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TB a partire da $199<\/a><\/noindex> nei Paesi Bassi! <b>Dell R420 \u2014 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 a partire da $99!<\/b><\/b> Leggi di <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">Come costruire un'infrastruttura di livello enterprise utilizzando server Dell R730xd E5-2650 v4 del valore di 9000 euro a pochi spiccioli?<\/a><\/noindex><br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ua-hosting\/blog\/488536\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>Docker-in-Docker \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443 Docker-\u0434\u0435\u043c\u043e\u043d, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u0443\u044e \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0435\u043b\u044c\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Docker-in-Docker \u0431\u044b\u043b\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u0430\u043c\u043e\u0433\u043e Docker. \u041c\u043d\u043e\u0433\u0438\u0435 \u043b\u044e\u0434\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0435\u0433\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Jenkins CI. \u041f\u043e\u043d\u0430\u0447\u0430\u043b\u0443 \u044d\u0442\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u043c, \u043d\u043e \u0437\u0430\u0442\u0435\u043c \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0432 Docker \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 Jenkins CI. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043a\u0430\u043a \u044d\u0442\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":52072,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-52071","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\".\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0425\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0439\u0442\u0435, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Docker-in-Docker \u0434\u043b\u044f CI \u0438\u043b\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u044b | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\".\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-18T02:34:24+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T02:34:24+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Pensa bene prima di utilizzare Docker-in-Docker per CI o per un ambiente di test | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/it\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0425\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0439\u0442\u0435, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Docker-in-Docker \u0434\u043b\u044f CI \u0438\u043b\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u044b | ProHoster","og:description":".","og:url":"https:\/\/prohoster.info\/it\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-18T02:34:24+00:00","article:modified_time":"2020-02-18T02:34:24+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"52071","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:50:23","updated":"2022-09-27 17:46:30","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/52071","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=52071"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/52071\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/52072"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=52071"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=52071"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=52071"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}