{"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\/nl\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","title":{"rendered":"Denk goed na voordat je Docker-in-Docker gebruikt voor CI of een testomgeving.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Denk goed na voordat je Docker-in-Docker gebruikt voor CI of een testomgeving.\" src=\"\/wp-content\/uploads\/2020\/02\/50b03664f1984b36e1703717dfaa7ecc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDocker-in-Docker is a virtualized Docker daemon environment running inside the container to build container images. The primary goal of creating Docker-in-Docker was to assist in developing Docker itself. Many people use it to run Jenkins CI. At first, this seems normal, but then problems arise that can be avoided by installing Docker in the Jenkins CI container. This article discusses how to do that. If you're interested in the final solution without details, just read the last section of the article 'Problem Solution'.<\/p>\n<p><img decoding=\"async\" alt=\"Denk goed na voordat je Docker-in-Docker gebruikt voor CI of een testomgeving.\" 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: 'Good'<\/h3>\n<p>\nMore than two years ago, I included in Docker <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/moby\/moby\/commit\/280901e5fbd0c2dabd14d7a9b69a073f6e8f87e4\">vlag<\/a><\/noindex> \u2013privileged and wrote <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jpetazzo\/dind\/commit\/bfbe19c0eec634f66c9f8bac53c6b7c7e0fdb063\">the first version of dind<\/a><\/noindex>. The goal was to help the core team develop Docker faster. Before Docker-in-Docker, the typical development cycle was like this:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>build;<\/li>\n<li>stop the running Docker daemon;<\/li>\n<li>start a new Docker daemon;<\/li>\n<li>test;<\/li>\n<li>repeat the cycle.<\/li>\n<\/ul>\n<p>\nHowever, if you wanted to make a nice, reproducible build (in a container), it became more complex:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>make sure a working version of Docker is running;<\/li>\n<li>build new Docker with old Docker;<\/li>\n<li>stop the Docker daemon;<\/li>\n<li>start the new Docker daemon;<\/li>\n<li>test;<\/li>\n<li>stop the new Docker daemon;<\/li>\n<li>repeat.<\/li>\n<\/ul>\n<p>\nWith Docker-in-Docker, the process has become simpler:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>build + run in one step;<\/li>\n<li>repeat the cycle.<\/li>\n<\/ul>\n<p>\nIsn't it much better this way?<\/p>\n<p><img decoding=\"async\" alt=\"Denk goed na voordat je Docker-in-Docker gebruikt voor CI of een testomgeving.\" src=\"\/wp-content\/uploads\/2020\/02\/b4870536068c660a8d996ec53f079504.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Docker-in-Docker: 'Bad'<\/h3>\n<p>\nHowever, contrary to popular belief, Docker-in-Docker is not 100% stars, ponies, and unicorns. I mean, there are several issues that a developer needs to be aware of.<\/p>\n<p>Een van deze betreft LSM (Linux-beveiligingsmodules), zoals AppArmor en SELinux: wanneer je een container start, kan de \"interne Docker\" proberen beveiligingsprofielen toe te passen die in conflict komen met of verwarrend zijn voor de \"externe Docker\". Dit is het moeilijkste probleem dat moet worden opgelost bij het proberen te combineren van de oorspronkelijke implementatie van de -privileged vlag. Mijn wijzigingen werkten, en alle tests zouden ook op mijn Debian-machine en testvirtuele machines van Ubuntu zijn geslaagd, maar ze zouden falen en inbranden op de machine van Michael Crosby (voor zover ik me herinner, had hij Fedora). Ik kan me de exacte oorzaak van het probleem niet herinneren, maar het kan zijn dat het kwam omdat Mike \u2013 een wijze man \u2013 werkt met SELINUX=enforce (ik gebruikte AppArmor), en mijn wijzigingen hielden geen rekening met de SELinux-profielen.<\/p>\n<h3>Docker-in-Docker: \"Slecht\"<\/h3>\n<p>\nHet tweede probleem heeft betrekking op de Docker-opslagdrivers. Wanneer je Docker-in-Docker draait, werkt de externe Docker bovenop een normale bestandssysteem (EXT4, BTRFS of een andere die je hebt), terwijl de interne Docker werkt bovenop een copy-on-write systeem (AUFS, BTRFS, Device Mapper, enz., afhankelijk van wat is ingesteld voor de externe Docker). Dit leidt tot tal van combinaties die niet zullen werken. Bijvoorbeeld, je kunt geen AUFS bovenop AUFS draaien. <\/p>\n<p>Als je BTRFS bovenop BTRFS draait, zou dit in eerste instantie moeten werken, maar zodra er geneste subvolumes verschijnen, kun je het bovenliggende subvolume niet verwijderen. De Device Mapper-module heeft geen naamruimten, dus als meerdere Docker-instanties deze op \u00e9\u00e9n machine gebruiken, kunnen ze elkaar be\u00efnvloeden (en veranderen) in de beeldbestanden en de containerback-upapparaten. Dit is problematisch.<\/p>\n<p>Er zijn omwegen om veel van deze problemen op te lossen. Bijvoorbeeld, als je AUFS wilt gebruiken in de interne Docker, verander dan gewoon de map \/var\/lib\/docker in een volume en alles zou goed moeten zijn. Docker heeft enkele basisnaamruimten toegevoegd aan de doel-namen voor de Device Mapper, zodat als meerdere Docker-aanroepen op \u00e9\u00e9n machine worden gedaan, ze elkaar niet zullen \"aanvallen\".<\/p>\n<p>Toch is zo'n configuratie verre van eenvoudig, zoals je kunt zien uit deze <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jpetazzo\/dind\/issues\/78\">artikelen<\/a><\/noindex> in de dind-repository op GitHub.<\/p>\n<h3>Docker-in-Docker: het wordt nog erger<\/h3>\n<p>\nWat betreft de build-cache? Dat kan ook behoorlijk ingewikkeld zijn. Mensen vragen me vaak: \u201cAls ik Docker-in-Docker draai, hoe kan ik dan beelden gebruiken die op mijn host staan in plaats van alles opnieuw te downloaden in mijn interne Docker?\u201d<\/p>\n<p>Sommige ondernemende mensen hebben geprobeerd \/var\/lib\/docker van de host te koppelen aan de Docker-in-Docker-container. Soms delen ze \/var\/lib\/docker met meerdere containers.<\/p>\n<p><img decoding=\"async\" alt=\"Denk goed na voordat je Docker-in-Docker gebruikt voor CI of een testomgeving.\" src=\"\/wp-content\/uploads\/2020\/02\/192c9d26798d32078272aab1864bbccb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Wil je gegevens corrupt maken? Want dat is precies wat dit zal doen!<\/i><\/p>\n<p>De Docker-daemon is duidelijk ontworpen voor exclusieve toegang tot \/var\/lib\/docker. Niets anders zou toegang mogen hebben tot de Docker-bestanden in deze map.<\/p>\n<p>Waarom is dat zo? Omdat dit het resultaat is van een van de moeilijkste lessen die zijn geleerd tijdens de ontwikkeling van dotCloud. De container-engine van dotCloud werkte met meerdere processen die tegelijkertijd toegang hadden tot \/var\/lib\/dotcloud. Sluwe trucs, zoals atomair bestanden vervangen (in plaats van ter plaatse te bewerken), het \u2018peperen\u2019 van code met aanbevolen en verplichte vergrendelingen, en andere experimenten met veilige systemen zoals SQLite en BDB, werkten niet altijd. Toen we onze container-engine herschreven, die uiteindelijk Docker werd, was een van de belangrijkste ontwerpeisen dat alle containeroperaties onder \u00e9\u00e9n daemon moesten worden gebracht om al deze rompslomp van gelijktijdige toegang te be\u00ebindigen.<\/p>\n<p>Begrijp me niet verkeerd: het is heel goed mogelijk om iets goeds, betrouwbaar en snel te maken met meerdere processen en modern parallel management. Maar wij denken dat het eenvoudiger en gemakkelijker is om code te schrijven en te onderhouden door Docker als enige speler te gebruiken.<\/p>\n<p>Dit betekent dat als je de map \/var\/lib\/docker deelt tussen meerdere Docker-instanties, je problemen zult ondervinden. Natuurlijk kan dit werken, vooral in de vroege stadia van testen. 'Hoor eens, mam, ik kan 'docker' ubuntu draaien!' Maar probeer iets complexers te doen, zoals dezelfde afbeelding uit twee verschillende instanties te halen, en je zult zien hoe de wereld in vuur en vlam staat.<\/p>\n<p>Dit betekent dat als uw CI-systeem builds en rebuilds uitvoert, u elke keer dat u de Docker-in-Docker-container opnieuw opstart het risico loopt een 'time bomb' in zijn cache te resetten. Dat is beslist niet ideaal!<\/p>\n<h3>Oplossing van het probleem<\/h3>\n<p>\nLaten we een stap terugnemen. Heeft u echt Docker-in-Docker nodig of wilt u gewoon Docker kunnen draaien, namelijk containers en images vanuit uw CI-systeem bouwen en draaien, terwijl dat CI-systeem zich in een container bevindt?<\/p>\n<p>Ik wed dat de meeste mensen de laatste optie willen, dat wil zeggen dat ze willen dat een CI-systeem, zoals Jenkins, containers kan draaien. En de eenvoudigste manier om dit te doen is door de Docker-socket in uw CI-container te steken, gekoppeld met de flag -v.<\/p>\n<p>In simpele bewoordingen, wanneer u uw CI-container (Jenkins of een andere) opstart, begin het dan niet met het hacken van iets samen met Docker-in-Docker, maar start het met de volgende regel:<\/p>\n<pre><code class=\"plaintext\">docker run -v \/var\/run\/docker.sock:\/var\/run\/docker.sock ...<\/code><\/pre>\n<p>\nNu heeft deze container toegang tot de Docker-socket en kan dus containers draaien. Behalve dat in plaats van 'kind' containers te draaien, het 'broederlijke' containers zal draaien.<\/p>\n<p>Probeer dit met de offici\u00eble docker image (die het Docker-binaire bestand bevat):<\/p>\n<pre><code class=\"plaintext\">docker run -v \/var\/run\/docker.sock:\/var\/run\/docker.sock \n           -ti docker<\/code><\/pre>\n<p>\nDit ziet eruit en werkt als Docker-in-Docker, maar het is geen Docker-in-Docker: wanneer deze container extra containers aanmaakt, worden die op een hoger niveau in Docker aangemaakt. U zult geen bijwerkingen van geneste containers ervaren en de build-cache zal gedeeld worden voor meerdere aanroepen.<\/p>\n<p>Opmerking: eerdere versies van dit artikel adviseerden om het binaire bestand van Docker van de host naar de container te koppelen. Dit is nu onbetrouwbaar geworden, omdat de Docker-mechanisme niet langer van toepassing is op statische of bijna statische bibliotheken.<\/p>\n<p>Dus, als u Docker uit Jenkins CI wilt gebruiken, hebt u 2 opties:<br \/>\nInstalleer de Docker CLI met behulp van het basale image packaging systeem (d.w.z. als uw image op Debian is gebaseerd, gebruik .deb pakketten) of gebruik de Docker API.<\/p>\n<h3>Een beetje reclame \ud83d\ude42<\/h3>\n<p>\nBedankt dat je bij ons blijft. Houd je van onze artikelen? Wil je meer interessante inhoud zien? Ondersteun ons door een bestelling te plaatsen of ons aan vrienden aan te bevelen, <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">cloud VPS voor ontwikkelaars vanaf $4,99<\/a><\/noindex>, <b>een unieke variant van entry-level servers, die we voor jou hebben bedacht:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">De waarheid over VPS (KVM) E5-2697 v3 (6 Kernen) 10GB DDR4 480GB SSD 1Gbps vanaf $19 of hoe deel je een server correct?<\/a><\/noindex> (opties beschikbaar met RAID1 en RAID10, tot 24 cores en tot 40GB DDR4).<\/p>\n<p><b>Dell R730xd is 2 keer goedkoper in datacenter Equinix Tier IV in Amsterdam?<\/b> Alleen bij ons <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 100TB vanaf $199<\/a><\/noindex> in Nederland! <b>Dell R420 \u2014 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 vanaf $99!<\/b><\/b> Lees over hoe <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">je een infrastructuur van bedrijfsniveau kunt opbouwen met Dell R730xd E5-2650 v4 servers die wel \u20ac9000 kosten voor een prikkie?<\/a><\/noindex><br \/>\n<br \/>Bron: <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.3 - 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\/nl\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\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\/nl\/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\udd47 Denk goed na voordat u Docker-in-Docker gebruikt voor CI of testomgevingen | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/nl\/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":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/52071","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=52071"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/52071\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/52072"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=52071"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=52071"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=52071"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}