{"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\/es\/blog\/horosho-podumajte-prezhde-chem-ispolzovat-docker-in-docker-dlya-ci-ili-testovoj-sredy","title":{"rendered":"Piense bien antes de usar Docker-in-Docker para CI o un entorno de prueba","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Piense bien antes de usar Docker-in-Docker para CI o un entorno de prueba\" src=\"\/wp-content\/uploads\/2020\/02\/50b03664f1984b36e1703717dfaa7ecc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDocker-in-Docker es un entorno virtualizado del demonio Docker ejecutado dentro del mismo contenedor para construir im\u00e1genes de contenedor. El objetivo principal de crear Docker-in-Docker era ayudar en el desarrollo del propio Docker. Muchas personas lo utilizan para ejecutar Jenkins CI. Al principio parece normal, pero luego surgen problemas que se pueden evitar instalando Docker en un contenedor Jenkins CI. Este art\u00edculo explica c\u00f3mo hacerlo. Si le interesa la soluci\u00f3n final sin detalles, simplemente lea la \u00faltima secci\u00f3n del art\u00edculo 'Soluci\u00f3n al problema'.<\/p>\n<p><img decoding=\"async\" alt=\"Piense bien antes de usar Docker-in-Docker para CI o un entorno de prueba\" 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: 'Bueno'<\/h3>\n<p>\nHace m\u00e1s de dos a\u00f1os, integr\u00e9 en Docker <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/moby\/moby\/commit\/280901e5fbd0c2dabd14d7a9b69a073f6e8f87e4\">bandera<\/a><\/noindex> -privilegiado y escrib\u00ed <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jpetazzo\/dind\/commit\/bfbe19c0eec634f66c9f8bac53c6b7c7e0fdb063\">la primera versi\u00f3n de dind<\/a><\/noindex>. El objetivo era ayudar al equipo principal a desarrollar Docker m\u00e1s r\u00e1pido. Antes de Docker-in-Docker, el ciclo t\u00edpico de desarrollo era el siguiente:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>construcci\u00f3n (build);<\/li>\n<li>detener el demonio Docker en ejecuci\u00f3n;<\/li>\n<li>iniciar un nuevo demonio Docker;<\/li>\n<li>probar;<\/li>\n<li>repetir el ciclo.<\/li>\n<\/ul>\n<p>\nSin embargo, si deseaba hacer una construcci\u00f3n bonita y reproducible (es decir, en un contenedor), se volv\u00eda m\u00e1s compleja:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>asegurarse de que haya una versi\u00f3n funcional de Docker en ejecuci\u00f3n;<\/li>\n<li>construir un nuevo Docker con el antiguo Docker;<\/li>\n<li>detener el demonio Docker;<\/li>\n<li>iniciar un nuevo demonio Docker;<\/li>\n<li>probar;<\/li>\n<li>detener el nuevo demonio Docker;<\/li>\n<li>repetir.<\/li>\n<\/ul>\n<p>\nCon la llegada de Docker-in-Docker, el proceso se simplific\u00f3:<\/p>\n<ul>\n<li>hackity hack;<\/li>\n<li>construcci\u00f3n + ejecuci\u00f3n en un solo paso;<\/li>\n<li>repetir el ciclo.<\/li>\n<\/ul>\n<p>\n\u00bfNo es cierto que es mucho mejor as\u00ed?<\/p>\n<p><img decoding=\"async\" alt=\"Piense bien antes de usar Docker-in-Docker para CI o un entorno de prueba\" src=\"\/wp-content\/uploads\/2020\/02\/b4870536068c660a8d996ec53f079504.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Docker-in-Docker: 'Malo'<\/h3>\n<p>\nSin embargo, a pesar de la creencia popular, Docker-in-Docker no est\u00e1 hecho 100% de estrellas, ponis y unicornios. Quiero decir que hay varios problemas de los que el desarrollador debe estar consciente.<\/p>\n<p>Uno de ellos se refiere a LSM (m\u00f3dulos de seguridad de Linux), como AppArmor y SELinux: al iniciar el contenedor, 'Docker interno' puede intentar aplicar perfiles de seguridad que entrar\u00e1n en conflicto o confundir\u00e1n a 'Docker externo'. Este es el problema m\u00e1s complicado que se tuvo que resolver al intentar combinar la implementaci\u00f3n original de la bandera \u2013privileged. Mis cambios funcionaron y todas las pruebas tambi\u00e9n pasar\u00edan en mi m\u00e1quina Debian y en m\u00e1quinas virtuales de pruebas en Ubuntu, pero se caer\u00edan y arder\u00edan en la m\u00e1quina de Michael Crosby (hasta donde recuerdo, \u00e9l ten\u00eda Fedora). No puedo recordar la raz\u00f3n exacta del problema, pero puede que surg\u00eda porque Mike es una persona sabia que trabaja con SELINUX=enforce (yo us\u00e9 AppArmor), y mis cambios no tomaron en cuenta los perfiles de SELinux.<\/p>\n<h3>Docker-in-Docker: 'El malo'<\/h3>\n<p>\nEl segundo problema est\u00e1 relacionado con los controladores de almacenamiento de Docker. Cuando ejecutas Docker-in-Docker, el Docker externo funciona sobre un sistema de archivos normal (EXT4, BTRFS o cualquier otro que tengas), mientras que el Docker interno funciona sobre un sistema de copia en escritura (AUFS, BTRFS, Device Mapper, etc., dependiendo de lo que est\u00e9 configurado para usar el Docker externo). Esto da lugar a muchas combinaciones que no funcionar\u00e1n. Por ejemplo, no podr\u00e1s ejecutar AUFS sobre AUFS. <\/p>\n<p>Si ejecutas BTRFS sobre BTRFS, deber\u00eda funcionar al principio, pero tan pronto como aparezcan subvol\u00famenes anidados, no podr\u00e1s eliminar el subvolumen padre. El m\u00f3dulo Device Mapper no tiene espacios de nombres, por lo que si varias instancias de Docker lo usan en una sola m\u00e1quina, todas podr\u00e1n ver (y afectar) las im\u00e1genes unas de otras y los dispositivos de respaldo de contenedores. Eso es malo.<\/p>\n<p>Hay soluciones alternativas para muchos de estos problemas. Por ejemplo, si deseas usar AUFS en el Docker interno, simplemente convierte la carpeta \/var\/lib\/docker en ese sistema, y todo funcionar\u00e1 bien. Docker ha a\u00f1adido algunos espacios de nombres b\u00e1sicos a los nombres de destino de Device Mapper, de modo que si varias llamadas a Docker se realizan en una sola m\u00e1quina, no se 'pisar\u00e1n' unas a otras.<\/p>\n<p>Sin embargo, tal configuraci\u00f3n no es sencilla, como se puede ver en estos <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jpetazzo\/dind\/issues\/78\">art\u00edculos<\/a><\/noindex> en el repositorio dind en GitHub.<\/p>\n<h3>Docker-in-Docker: se pone a\u00fan peor<\/h3>\n<p>\n\u00bfY qu\u00e9 pasa con el cach\u00e9 de la construcci\u00f3n? Esto tambi\u00e9n puede resultar bastante complicado. La gente a menudo me pregunta: \u201csi estoy ejecutando Docker-in-Docker, \u00bfc\u00f3mo puedo usar las im\u00e1genes ubicadas en mi host en lugar de volver a descargarlas todas en mi Docker interno?\u201d<\/p>\n<p>Algunas personas ingeniosas han intentado enlazar \/var\/lib\/docker desde el host en el contenedor Docker-in-Docker. A veces comparten \/var\/lib\/docker entre varios contenedores.<\/p>\n<p><img decoding=\"async\" alt=\"Piense bien antes de usar Docker-in-Docker para CI o un entorno de prueba\" src=\"\/wp-content\/uploads\/2020\/02\/192c9d26798d32078272aab1864bbccb.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u00bfQuieres da\u00f1ar los datos? \u00a1Porque eso es exactamente lo que da\u00f1ar\u00e1 tus datos!<\/i><\/p>\n<p>El demonio de Docker claramente fue dise\u00f1ado para tener acceso exclusivo a \/var\/lib\/docker. Nadie m\u00e1s deber\u00eda \"tocar, hurgar o manipular\" los archivos de Docker en esta carpeta.<\/p>\n<p>\u00bfPor qu\u00e9 es as\u00ed? Porque es el resultado de una de las lecciones m\u00e1s duras aprendidas en el desarrollo de dotCloud. El motor de contenedores de dotCloud funcionaba teniendo varios procesos accediendo simult\u00e1neamente a \/var\/lib\/dotcloud. Trucos astutos, como el reemplazo at\u00f3mico de archivos (en lugar de editar en el lugar), bloquear el c\u00f3digo con bloqueos recomendados y obligatorios y otros experimentos con sistemas seguros como SQLite y BDB, no siempre funcionaban. Cuando reescribimos nuestro motor de contenedores, que eventualmente se convirti\u00f3 en Docker, una de las principales decisiones de dise\u00f1o fue condensar todas las operaciones de contenedores bajo un solo demonio para acabar con toda esta tonter\u00eda de accesos concurrentes.<\/p>\n<p>No me malinterpretes: es completamente posible hacer algo bueno, confiable y r\u00e1pido que incluya varios procesos y una gesti\u00f3n paralela moderna. Pero creemos que es m\u00e1s simple y f\u00e1cil escribir y mantener c\u00f3digo utilizando Docker como el \u00fanico jugador.<\/p>\n<p>Esto significa que si compartes el directorio \/var\/lib\/docker entre varias instancias de Docker, tendr\u00e1s problemas. Claro, puede funcionar, especialmente en las primeras etapas de prueba. \"\u00a1Mira, mam\u00e1, puedo correr ubuntu con 'docker'!\" Pero intenta hacer algo m\u00e1s complejo, como sacar la misma imagen de dos instancias diferentes, y ver\u00e1s c\u00f3mo el mundo arde.<\/p>\n<p>Esto significa que si su sistema CI realiza compilaciones y recompilaciones, cada vez que reinicie el contenedor Docker-in-Docker, corre el riesgo de hacer estallar una bomba de tiempo en su cach\u00e9. \u00a1No es nada genial!<\/p>\n<h3>Solucionar el problema<\/h3>\n<p>\nRetrocedamos un paso. \u00bfRealmente necesita Docker-in-Docker o simplemente quiere poder ejecutar Docker, es decir, construir y ejecutar contenedores e im\u00e1genes desde su sistema CI, mientras este sistema CI se encuentra en un contenedor?<\/p>\n<p>Apuesto a que la mayor\u00eda de la gente quiere la \u00faltima opci\u00f3n, es decir, quieren que un sistema CI como Jenkins pueda ejecutar contenedores. Y la forma m\u00e1s f\u00e1cil de hacerlo es simplemente conectar el socket de Docker a su contenedor CI, usando la bandera -v.<\/p>\n<p>En otras palabras, cuando inicie su contenedor CI (Jenkins u otro), en lugar de hackear algo con Docker-in-Docker, in\u00edcielo con la l\u00ednea:<\/p>\n<pre><code class=\"plaintext\">docker run -v \/var\/run\/docker.sock:\/var\/run\/docker.sock ...<\/code><\/pre>\n<p>\nAhora este contenedor tendr\u00e1 acceso al socket de Docker y, por lo tanto, podr\u00e1 ejecutar contenedores. Excepto que, en lugar de lanzar contenedores 'hijos', lanzar\u00e1 contenedores 'hermanos'.<\/p>\n<p>Pruebe esto usando la imagen oficial de Docker (que contiene el binario de 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>\nEsto se ve y funciona como Docker-in-Docker, pero no es Docker-in-Docker: cuando este contenedor cree contenedores adicionales, se crear\u00e1n en Docker de nivel superior. No experimentar\u00e1 efectos secundarios de anidamiento, y la cach\u00e9 de compilaci\u00f3n ser\u00e1 compartida entre m\u00faltiples invocaciones.<\/p>\n<p>Nota: versiones anteriores de este art\u00edculo recomendaban vincular el binario de Docker desde el host al contenedor. Ahora esto se ha vuelto poco fiable, ya que el mecanismo de Docker ya no se extiende a bibliotecas est\u00e1ticas o casi est\u00e1ticas.<\/p>\n<p>Por lo tanto, si desea utilizar Docker desde Jenkins CI, tiene 2 opciones:<br \/>\ninstalar Docker CLI utilizando el sistema de empaquetado de im\u00e1genes base (es decir, si su imagen se basa en Debian, utilice paquetes .deb), utilizar Docker API.<\/p>\n<h3>Un poco de publicidad \ud83d\ude42<\/h3>\n<p>\nGracias por permanecer con nosotros. \u00bfTe gustan nuestros art\u00edculos? \u00bfQuieres ver m\u00e1s contenido interesante? Ap\u00f3yanos haciendo un pedido o recomendando a tus conocidos, <noindex><a rel=\"nofollow\" href=\"https:\/\/ua-hosting.company\/cloudvps\/nl\">VPS en la nube para desarrolladores desde $4.99<\/a><\/noindex>, <b>un an\u00e1logo \u00fanico de servidores entry-level que hemos dise\u00f1ado para Ti:<\/b> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/347386\/\">Toda la verdad sobre VPS (KVM) E5-2697 v3 (6 n\u00facleos) 10GB DDR4 480GB SSD 1Gbps desde $19, o c\u00f3mo dividir correctamente un servidor?<\/a><\/noindex> (disponibles opciones con RAID1 y RAID10, hasta 24 n\u00facleos y hasta 40GB DDR4).<\/p>\n<p><b>\u00bfDell R730xd a mitad de precio en el centro de datos Equinix Tier IV en \u00c1msterdam?<\/b> Solo aqu\u00ed <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 desde $199<\/a><\/noindex> \u00a1en los Pa\u00edses Bajos! <b>Dell R420 \u2014 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB \u2014 \u00a1desde $99!<\/b><\/b> Lee sobre c\u00f3mo <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/company\/ua-hosting\/blog\/329618\/\">Construir infraestructura de clase empresarial usando servidores Dell R730xd E5-2650 v4 que cuestan 9000 euros a un precio asequible?<\/a><\/noindex><br \/>\n<br \/>Fuente: <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.2 - 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\/es\/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.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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\udd47Piense bien antes de usar Docker-in-Docker para CI o entornos de prueba | ProHoster","description":".","canonical_url":"https:\/\/prohoster.info\/es\/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":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/52071","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=52071"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/52071\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/52072"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=52071"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=52071"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=52071"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}