<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ docker - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ docker - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Fri, 19 Jun 2026 05:19:13 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/tag/docker/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Docker y dockerizar - qué significan estos términos? ]]>
                </title>
                <description>
                    <![CDATA[  Docker es una de las herramientas más populares en el mundo del desarrollo de software, especialmente en el ámbito de la virtualización y la gestión de aplicaciones. Empecemos por lo básico, partiendo con las definiciones y avanzamos en aspectos particulares más adelante. -------------------------------------------------------------------------------- ¿Qué es Docker? Docker es una ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/dockerizando-una-aplicacion-node/</link>
                <guid isPermaLink="false">67dc10375e145c04f2f2ea88</guid>
                
                    <category>
                        <![CDATA[ docker ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Leonardo José Castillo Lacruz ]]>
                </dc:creator>
                <pubDate>Fri, 11 Apr 2025 20:41:20 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2025/04/Youtube--36-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <h2></h2><p>Docker es una de las herramientas más populares en el mundo del desarrollo de software, especialmente en el ámbito de la virtualización y la gestión de aplicaciones. Empecemos por lo básico, partiendo con las definiciones y avanzamos en aspectos particulares más adelante.</p><hr><h3 id="-qu-es-docker">¿Qué es Docker?</h3><p>Docker es una plataforma de código abierto que permite a los desarrolladores crear, implementar y ejecutar aplicaciones en contenedores, ¿pero qué es un contenedor?</p><p>Un contenedor es una unidad ligera y portátil que incluye todo lo necesario para que una aplicación funcione: código, bibliotecas, dependencias y configuraciones. Más adelante encontrarás una definición formal tanto de imagen como de contenedor.</p><p>Esto asegura que las aplicaciones se ejecuten de manera consistente en cualquier entorno, ya sea en tu máquina local, en un servidor o en la nube.</p><hr><h3 id="aspectos-importantes-de-usar-docker">Aspectos importantes de usar Docker</h3><p>Docker ha revolucionado la forma en que se desarrollan y despliegan aplicaciones debido a sus múltiples beneficios:</p><ul><li><strong>Portabilidad:</strong> Los contenedores Docker funcionan de la misma manera en cualquier sistema operativo que soporte Docker, eliminando problemas de compatibilidad.</li><li><strong>Eficiencia:</strong> Los contenedores son más ligeros que las máquinas virtuales, ya que comparten el kernel del sistema operativo, lo que reduce el uso de recursos.</li><li><strong>Escalabilidad:</strong> Facilita la creación de entornos replicables, lo que permite escalar aplicaciones rápidamente.</li><li><strong>Aislamiento:</strong> Cada contenedor es independiente, lo que evita conflictos entre aplicaciones o dependencias.</li><li><strong>Automatización:</strong> Docker simplifica los procesos de integración y entrega continua (CI/CD).</li></ul><hr><h3 id="gu-a-r-pida-de-instalaci-n">Guía rápida de instalación</h3><p>Para instalar Docker en tu sistema, sigue estos pasos básicos:</p><ol><li><strong>Linux (Ubuntu): </strong>bashCopy Codesudo apt update sudo apt install docker.io sudo systemctl start docker sudo systemctl enable docker</li><li><strong>Windows/Mac:</strong></li></ol><ul><li>Descarga Docker Desktop desde <a href="https://www.docker.com/" rel="noopener noreferrer">docker.com</a>.</li><li>Sigue las instrucciones del instalador.</li><li>Asegúrate de habilitar la integración con WSL 2 (en Windows).</li></ul><p><strong>Verifica la instalación:</strong><br>Ejecuta el siguiente comando para confirmar que Docker está instalado correctamente: bashCopy Codedocker --version</p><p>Quieres un paso a paso de instalar Docker, acá te comparto un contenido donde mostramos la instalación en Windows usando WSL2, así que funciona también para Linux.</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/Z27M2qGwHW4?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" title="Primeros Pasos con Docker: Instala WSL y Docker en Windows + Comandos Básicos 🚀" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><hr><h3 id="-qu-es-una-imagen">¿Qué es una imagen?</h3><p>Una imagen en Docker es una plantilla inmutable que contiene todo lo necesario para ejecutar una aplicación, incluyendo el sistema operativo base, las dependencias y el código de la aplicación. Las imágenes son la base para crear contenedores y se almacenan en repositorios como Docker Hub.</p><hr><h3 id="-qu-es-un-contenedor">¿Qué es un contenedor?</h3><p>Un contenedor es una instancia en ejecución de una imagen. Es un entorno aislado que ejecuta una aplicación de manera independiente. Los contenedores son ligeros, rápidos y desechables, lo que significa que puedes detenerlos, eliminarlos y recrearlos fácilmente.</p><hr><h3 id="-c-mo-correr-un-contenedor-de-una-imagen">¿Cómo correr un contenedor de una imagen?</h3><p>Para ejecutar un contenedor a partir de una imagen, utiliza el siguiente comando:</p><pre><code>docker run -d --name nombre_del_contenedor imagen</code></pre><p>Por ejemplo, para ejecutar un servidor web Nginx:</p><pre><code>docker run -d --name mi_nginx -p 8080:80 nginx</code></pre><p>Este comando ejecuta un contenedor en segundo plano (<code>-d</code>), lo nombra como <code>mi_nginx</code> y mapea el puerto 80 del contenedor al puerto 8080 de tu máquina. </p><p>Con esto tendras un servidor web en tu máquina ejecutandose en el puerto 8080.</p><hr><h3 id="-qu-es-dockerizar-una-aplicaci-n">¿Qué es dockerizar una aplicación?</h3><p>Dockerizar una aplicación significa empaquetarla en un contenedor Docker para que pueda ejecutarse de manera consistente en cualquier entorno. Esto incluye agregar todas las dependencias, configuraciones y scripts necesarios en una imagen Docker.</p><hr><h3 id="-qu-es-el-dockerfile">¿Qué es el Dockerfile?</h3><p>El <code>Dockerfile</code> es un archivo de texto que contiene una serie de instrucciones para construir una imagen Docker. Cada instrucción en el Dockerfile define una capa en la imagen, lo que permite que Docker reutilice capas anteriores para optimizar el proceso de construcción.</p><hr><h3 id="comandos-b-sicos-del-dockerfile">Comandos básicos del Dockerfile</h3><p>Algunos comandos comunes en un Dockerfile son:</p><ul><li><strong>FROM:</strong> Define la imagen base. dockerfileCopy CodeFROM node:16</li><li><strong>WORKDIR:</strong> Establece el directorio de trabajo dentro del contenedor. dockerfileCopy CodeWORKDIR /app</li><li><strong>COPY:</strong> Copia archivos desde el sistema host al contenedor. dockerfileCopy CodeCOPY . .</li><li><strong>RUN:</strong> Ejecuta comandos durante la construcción de la imagen. dockerfileCopy CodeRUN npm install</li><li><strong>CMD:</strong> Define el comando que se ejecutará cuando el contenedor inicie. dockerfileCopy CodeCMD ["npm", "start"]</li></ul><hr><h3 id="-c-mo-dockerizar-una-aplicaci-n-node-js">¿Cómo dockerizar una aplicación Node.js?</h3><p>Para dockerizar una aplicación Node.js, sigue estos pasos:</p><p><strong>Crea un archivo <code>Dockerfile</code>:</strong><br>Este archivo define cómo se construirá la imagen Docker. Un ejemplo básico para una aplicación Node.js sería:</p><pre><code># Usa una imagen base de Node.js 
FROM node:16 

# Establece el directorio de trabajo 
WORKDIR /app 

# Copia la definición del proyecto 
COPY package*.json ./ 

#Carga las dependencias
RUN npm install 

# Copia los archivos de la aplicación 
COPY . . 

# Expone el puerto de la aplicación 
EXPOSE 3000 

# Comando para ejecutar la aplicación 
CMD ["npm", "start"]</code></pre><p><strong>Crea un archivo <code>.dockerignore</code>:</strong><br>Este archivo especifica qué archivos o carpetas deben excluirse al construir la imagen. Por ejemplo:</p><pre><code>node_modules  
npm-debug.log  
</code></pre><p><strong>Construye la imagen:</strong></p><pre><code>docker build -t mi_app_node .</code></pre><p><strong>Ejecuta el contenedor:</strong></p><pre><code>docker run -d -p 3000:3000 mi_app_node</code></pre><hr><h3 id="importancia-del-archivo-dockerignore">Importancia del archivo <code>.dockerignore</code></h3><p>El archivo <code>.dockerignore</code> es crucial para optimizar el proceso de construcción de imágenes Docker. Este archivo especifica qué archivos o carpetas deben excluirse al construir la imagen, lo que reduce el tamaño de la imagen y mejora la seguridad al evitar incluir archivos sensibles o innecesarios, como:</p><ul><li>Archivos de configuración locales.</li><li>Dependencias ya instaladas (como <code>node_modules</code>).</li><li>Archivos temporales o de depuración.</li></ul><p>Un ejemplo de <code>.dockerignore</code> sería:</p><pre><code>node_modules  
*.log  
.env  
</code></pre><hr><p>Veamos un ejemplo práctico de como dockerizar una aplicación Node.</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/tpai8uzkROA?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" title="¡Dockeriza tu Aplicación como un PRO! 🐳 Aprende Dockerfile, .dockerignore y Más 🚀" name="fitvid1"></iframe>
          </div>
        </div>
      </figure> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo habilitar la recarga en vivo en aplicaciones basadas en Docker con volúmenes de Docker ]]>
                </title>
                <description>
                    <![CDATA[ En este post aprenderás cómo configurar un entorno de desarrollo con recarga en vivo habilitada (live reload). Esto te permitirá convertir una aplicación legacy (código anticuado u obsoleto) para que use Docker, volúmenes de Docker y docker-compose. Algunos desarrolladores levantan sus narices cuando hablan sobre usar Docker para su entorno ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-activar-la-recarga-en-vivo-en-aplicaciones-basadas-en-docker-con-volumenes-docker/</link>
                <guid isPermaLink="false">65498b37208bc703b414b143</guid>
                
                    <category>
                        <![CDATA[ docker ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Elias Ezequiel Pereyra Gomez ]]>
                </dc:creator>
                <pubDate>Thu, 30 Nov 2023 19:02:47 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/11/5f9c9a0f740569d1a4ca233c.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-enable-live-reload-on-docker-based-applications/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Enable Live-reload on Docker-based Applications with Docker Volumes</a>
      </p><p>En este post aprenderás cómo configurar un entorno de desarrollo con recarga en vivo habilitada (live reload). Esto te permitirá convertir una aplicación legacy (código anticuado u obsoleto) para que use Docker, volúmenes de Docker y docker-compose.</p><p>Algunos desarrolladores levantan sus narices cuando hablan sobre usar Docker para su entorno de desarrollo. Dicen que Docker no es bueno para el desarrollo porque siempre necesita reconstruir toda la imagen para reflejar todas las nuevas modificaciones. Esto lo hace improductivo y lento.</p><p>En este artículo, nuestro objetivo es cambiar esta manera de pensar demostrando cómo las configuraciones simples pueden resultar en muchos beneficios como un entorno confiable sobre entornos de producción y desarrollo. &nbsp;</p><p>Al final de este post habrás aprendido a cómo:</p><ul><li>Convertir una aplicación "legacy" para que se ejecute dentro de un contenedor de Docker.</li><li>Permitir el cacheo de dependencias en módulos de Node.js.</li><li>Permitir la recarga en vivo usando volúmenes de Docker.</li><li>Agregar todos los servicios dentro de docker-compose.</li></ul><h2 id="requerimientos"><strong>Requerimientos</strong></h2><p>En los próximos pasos, clonarás un proyecto existente para ejecutar todos los ejemplos en este artículo. Antes de empezar a codificar asegúrate de tener las siguientes herramientas instaladas en tu máquina:</p><ul><li><a href="https://docs.docker.com/desktop/">Docker</a> and <a href="https://docs.docker.com/compose/">Docker compose</a></li><li><a href="https://nodejs.org/en/download/current/">Node.js 1</a>0+</li><li><a href="https://code.visualstudio.com/download">Git</a></li></ul><h2 id="-por-qu-usar-docker"><strong>¿Por qué usar<strong><strong> </strong></strong>D<strong><strong>ocker?</strong></strong></strong></h2><p>Más y más tecnologías innovadoras están siendo lanzadas al internet todo el tiempo. Son estables, y son divertidas para desarrollar y lanzar, pero su comportamiento no es consistente al trabajar sobre diferentes entornos. Así que los desarrolladores crearon Docker para ayudar reducir las probabilidades de posibles errores.</p><p>Docker es una de mis herramientas favoritas con la que trabajo todos los días en el escritorio, en la web y con aplicaciones IoT. Me ha dado el poder de no solamente mover aplicaciones a través de diferentes entornos, sino también de mantener mi entorno local lo más limpio posible.</p><p>Los desarrolladores que trabajan con tecnologías innovadoras siempre están trabajando con algo nuevo. Pero ¿qué hay de las aplicaciones legacy? ¿Deberíamos sólo reescribir todo con nuevas tecnologías? Sé que esto no es tan simple como parece. Deberíamos trabajar en nuevas cosas, pero también hacer mejoras a las aplicaciones existentes.</p><p>Digamos que te has decidido a mover servidores de Windows a servidores de Unix. ¿Cómo lo harías? ¿Conoces la lista completa de cada dependencia que tu aplicación requiere para trabajar?</p><h2 id="-c-mo-deber-a-lucir-un-entorno-de-desarrollo"><strong>¿Cómo debería lucir un entorno de desarrollo? </strong></h2><p>Los desarrolladores siempre han intentado de ser más productivos agregando plugins, boilerplates, y bases de código en sus editores/IDEs/terminales. El mejor entorno en mi opinión debería de ser:</p><ol><li>Fácil de ejecutar y probar.</li><li>Ser un entorno agnóstico.</li><li>Rápido de evaluar modificaciones.</li><li>Fácil de replicar en cualquier máquina.</li></ol><p>Siguiendo estos principios, configuraremos una aplicación a lo largo de las siguientes secciones de este artículo. También, si nunca has oído sobre recarga en vivo (o recarga caliente), es una característica que observa los cambios en tu código y reinicia el servidor si es necesario. Así que no necesitas ir y venir, reiniciando tu aplicación o inclusive reconstruyendo el sistema.</p><h2 id="comenzando"><strong>Comenzando</strong></h2><p>Primero, necesitarás tener una carpeta vacía llamado <code>post-docker-livereload</code> el cual usarás como un espacio de trabajo. Ve al <a href="https://github.com/ErickWendel/nodejs-with-mongodb-api-example">repositorio de Github</a> y clónalo en tu carpeta post-docker-live-reload.</p><p>Segundo, analicemos lo que la aplicación requiere. Si miras al archivo README.md, hay algunas instrucciones indicando cómo ejecutar esta aplicación como se muestra en la imagen de abajo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/06/Screen-Shot-2020-06-24-at-18.10.43-1.png" class="kg-image" alt="Screen-Shot-2020-06-24-at-18.10.43-1" width="600" height="400" loading="lazy"></figure><p>Se requiere la versión 10 de Node.js o superior y MongoDB. En vez de instalar MongoDB en tu máquina de entorno local, lo instalarás usando Docker. También lo expondrás en localhost:27107 así las aplicaciones que no se ejecutan a través de Docker podrán acceder sin conocer la dirección IP interna de Docker.</p><p>Copia el comando de abajo y pégalo en tu terminal:</p><pre><code class="language-bash">docker run --name mongodb -p 27017:27017 -d mongo:4</code></pre><p>Usando el comando de arriba, descargará y ejecutará la instancia de MongoDB. Fíjate que si ya tienes una instancia con este nombre lanzará un error de nombre inválido.</p><p>Si ves el error, ejecuta <code>docker rm mongodb</code> y de esta forma removerá cualquier instancia previa, así podrás ejecutar el comando docker run nuevamente.</p><h2 id="profundizando-en-la-aplicaci-n"><strong>Profundizando en la aplicación</strong></h2><p>El archivo README.md dice que necesitas una instancia de MongoDB ejecutándose antes de comenzar tu aplicación, en conjunto con Node.js.</p><p>Si tienes Node.js instalado, ve a la carpeta <code>nodejs-with-mongodb-api-example</code> y ejecuta los siguientes comandos:</p><pre><code class="language-bash">npm i 
npm run build 
npm start</code></pre><p>Después de ejecutar estos comandos, puedes ir al navegador en <a href="http://localhost:3000/">http://localhost:3000</a> y ver la aplicación ejecutándose como se muestra en la imagen de abajo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/06/01-start.gif" class="kg-image" alt="01-start" width="600" height="400" loading="lazy"></figure><p>Ten en cuenta que la aplicación ya tiene un comando de activar recarga en vivo el cual es <code>npm run dev:watch</code>. El pipeline (flujo o embudo) debería reflejar los siguientes pasos:</p><ol><li>El desarrollador edita archivos de Typescript.</li><li>Typescript "transpila" (compilar entre lenguajes) los archivos a JavaScript.</li><li>El servidor ve los cambios realizados en JavaScript y reinicia el servidor de Node.js.</li></ol><p>Así que duplicar los archivos a contenedores de Docker reflejará todos los cambios en el contenedor. El <code>npm run build:watch</code> de la aplicación capturará los cambios y generará archivos de salida en la carpeta lib, de esa forma <code>npm run dev:run</code> reiniciará el servidor cada vez que se haya disparado.</p><h2 id="dockerizando-aplicaciones"><strong>Dockerizando aplicaciones</strong></h2><p>Si Docker es un mundo completamente nuevo para ti, ¡no temas! Lo configurarás desde cero. Necesitarás crear un par de archivos para empezar:</p><ol><li><code>Dockerfile</code> - un archivo de recibo, que enlista instrucciones para instalar y ejecutar tu aplicación.</li><li><code>.dockerignore</code> - archivo que enlista cuáles archivos no irán dentro de la instancia del contenedor de Docker.</li></ol><h3 id="creando-el-archivo-docker"><strong>Creando el archivo Docker</strong></h3><p>El archivo Docker es el concepto clave aquí. Allí especificas los pasos y dependencias para preparar y ejecutar la aplicación. Siempre y cuando hayas leído el archivo README.md, será fácil de implementar el archivo de recibo.</p><p>Voy a poner todo el archivo abajo y lo indagaremos más adelante. En tu carpeta <code>nodejs-with-mongodb-api-example</code> crea un archivo <code>Dockerfile</code> y pega el código de abajo:</p><pre><code class="language-dockerfile">FROM node:14-alpine

WORKDIR /src

ADD package.json /src 

RUN npm i --silent

ADD . /src 

RUN npm run build 

CMD npm start</code></pre><p>¿Qué está ocurriendo ahí?</p><ul><li>En la línea 1. Usa como su imagen base la versión alpine de Node: Node.js 14.</li><li>De las líneas 2 a 4. Copia e instala dependencias de Node.js del host al contenedor. Fíjate que el orden ahí es importante. Agregar un archivo <code>package.json</code> a la carpeta <code>src</code> antes de restaurar las dependencias los guardará en caché y prevendrá que reinstale los paquetes cada vez que necesites construir tu imagen.</li><li>De las líneas 6 a 7. Ejecuta comandos para el proceso de compilación y luego comienza el programa como se menciona en el archivo README.md. </li></ul><h3 id="ignorando-archivos-innecesarios-con-dockerignore"><strong>Ignorando archivos innecesarios con .dockerignore</strong></h3><p>También, estoy trabajando en un sistema basado en OSX y el contenedor de Docker se ejecutará en un sistema basado en Linux Alpine. Cuando ejecutes <code>npm install</code> restaurará las dependencias para los entornos específicos.</p><p>Ahora crearás un archivo para ignorar el código generado desde tu máquina local como <code>node_modules</code> y <code>lib</code>. Así que cuando copies todos los archivos del directorio actual al contenedor este no tendrá versiones de paquetes inválidos.</p><p>En la carpeta <code>nodejs-with-mongodb-api-example</code> crea un archivo <code>.dockerignore</code><em><em> </em></em>y copia el código de abajo:</p><pre><code class="language-txt">node_modules/
lib/</code></pre><h3 id="construyendo-la-imagen-de-docker"><strong>Construyendo la imagen de docker</strong></h3><p>Prefiero ejecuta esta aplicación desde la carpeta <code>rootFolder</code>. Regresa a la carpeta <code>post-docker-live-reload</code> y ejecuta los siguientes comandos para preparar una imagen para su posterior uso:</p><pre><code class="language-shell">docker build -t app nodejs-with-mongodb-api-example</code></pre><p>Fíjate que el comando de arriba usa la bandera <code>-t</code> para especificar el nombre de la imagen y, justo después de eso, la carpeta que contiene el archivo <code>Dockerfile</code>.</p><h3 id="trabajando-con-vol-menes"><strong>Trabajando con volúmenes</strong></h3><p>Antes de ejecutar la aplicación, hagamos algunos trucos para mejorar nuestra experiencia en los contenedores de Docker.</p><p>Los volúmenes de Docker son una característica que permite duplicar archivos a entre tu máquina local y tu entorno de Docker. También puedes compartir volúmenes en los contenedores y reusarlos para cachear dependencias.</p><p>Tu objetivo es mirar cualquier cambio en los archivos locales <code>.ts</code> y duplicar esos cambios en el contenedor. Aunque los archivos y la carpeta <code>node_modules</code> están en la misma ruta.</p><p>¿Recuerdas que dije que las dependencias en cada sistema operativo serían diferentes? Pues para asegurarnos de que nuestro entorno local no afectará al entorno de Docker cuando se dupliquen archivos, aislaremos la carpeta <code>node_modules</code> del contenedor en un volumen distinto.</p><p>Consecuentemente, cuando se crea la carpeta <code>node_modules</code> en el contenedor, esto no creará la carpeta en el entorno de la máquina local. Ejecuta el comando de abajo en tu terminal para crearla:</p><pre><code class="language-shell">docker volume create --name nodemodules
</code></pre><h3 id="ejecutar-y-activa-recarga-en-vivo"><strong>Ejecutar y activa recarga en vivo</strong></h3><p>Como sabes, el <code>npm run dev:watch</code> especificado en el README.md te muestra cómo activar la recarga en vivo. El problema es que estás codificando en una máquina local y debe reflejarse directamente en tu contenedor.</p><p>Ejecutando los siguientes comandos enlazarás tu entorno local con el contenedor de Docker así que cualquier cambio en <code><code>nodejs-with-mongodb-api-example</code></code> afectará la carpeta <code>src</code> del contenedor.</p><pre><code class="language-shell">docker run \
    --name app \
    --link mongodb \
    -e MONGO_URL=mongodb \
    -e PORT=4000 \
    -p 4000:4000 \
    -v `pwd`/nodejs-with-mongodb-api-example:/src \
    -v nodemodules:/src/node_modules \
    app npm run dev:watch</code></pre><p>Indaguemos que está ocurriendo ahí:</p><ul><li><code>--link</code> da permiso a la aplicación para acceder a la instancia de MongoDB.</li><li><code>-e</code> son las variables de entorno. Como se mencionó en el archivo README.md puedes especificar la cadena de conexión de MongoDB que quieres conectar sobrescribiendo la variable <code>MONGO_URL</code>. Sobrescribe la variable <code>PORT</code> si quieres ejecutarlo en un puerto distinto. Fíjate que el valor <code>mongodb</code> es el mismo nombre que usamos para crear nuestra instancia de MongoDB en las secciones anteriores. Este valor es también un alias para la IP de la instancia interna de MongoDB.</li><li><code>-v</code> - vincula el directorio actual al contenedor de Docker usando un volumen virtual. Usando el comando <code>pwd</code> puedes obtener la ruta absoluta hacia tu directorio de trabajo actual y luego la carpeta que quieres duplicar en el contenedor de Docker. Está el <code>:/src</code>. La ruta <code>src</code> es la instrucción <code>WORKDIR</code> definida en el <code>Dockerfile</code> por lo tanto duplicamos la carpeta local en la carpeta <code>src</code> del contenedor de Docker.</li><li><code>-v</code> el segundo volumen ahí duplicará el volumen individual que creamos en la carpeta <code>node_modules</code> del contenedor.</li><li><code>app</code> el nombre de la imagen.</li><li><code>npm run dev:watch</code> este último comando sobrescribirá la instrucción <code>CMD</code> desde el archivo <code>Dockerfile</code>.</li></ul><p>Después de ejecutar el comando de abajo, puedes lanzar el navegador después de cambiar el archivo <code>index.ts</code> para ver los resultados. El video de abajo demuestra estos pasos en la práctica:</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.25%;" class="fluid-width-video-wrapper">
            <iframe width="480" height="270" src="https://www.youtube.com/embed/O9vEQhU_JEM?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" name="fitvid0" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 22px; vertical-align: middle; position: absolute; top: 0px; left: 0px; width: 720px; height: 405px;"></iframe>
          </div>
        </div>
      </figure><h2 id="resumiendo"><strong>Resumiendo</strong></h2><p>Sabes que trabajar con los comandos del shell funciona. Pero no es tan común para usarlos en este caso, y no es productivo ejecutar todos esos comandos; construyendo imágenes y gestionando instancias manualmente. ¡Así que usa compose!</p><p>Docker compose es una forma de simplificar la agregación y enlazamientos de servicios. Puedes especificar las bases de datos, logs, aplicación, volúmenes, redes, y así sucesivamente.</p><p>Primero, necesitas quitar todas las instancias activas para evitar conflictos en puertos expuestos. Ejecuta los siguientes comandos en tu terminal para remover volúmenes, servicios y contenedores:</p><pre><code class="language-bash">docker rm app 
docker volume rm nodemodules
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)</code></pre><h3 id="el-archivo-docker-compose"><strong>El archivo docker-compose</strong></h3><p>Crea un archivo <code>docker-compose.yml</code> en tu carpeta <code>post-docker-livereload</code> usando los datos de abajo:</p><pre><code class="language-yaml">version: '3'
services:
    mongodb:
        image: mongo:4
        ports:
            - 27017:27017
    app:
        build: nodejs-with-mongodb-api-example
        command: npm run dev:watch
        ports:
            - 4000:4000
        environment: 
            MONGO_URL: mongodb
            PORT: 4000
        volumes:
            - ./nodejs-with-mongodb-api-example:/src/
            - nodemodules:/src/node_modules
        links:
            - mongodb
        depends_on: 
            - mongodb

volumes:
    nodemodules: {}</code></pre><p>El archivo de arriba especifica los recursos por secciones. Fíjate que tienes las secciones <code>links</code> y <code>depends_on</code> allí. El campo links es la misma bandera que has usado en tu comando de shell. El <code>depends_on</code> se asegurará que el MongoDB es una dependencia para ejecutar tu aplicación. Ejecutará el MongoDB antes de tu aplicación, ¡como si fuera magia!</p><p>Volviendo a tu terminal, para iniciar todos los servicios y construir la imagen de Docker, crear volúmenes y enlazar servicios, ejecuta el siguiente comando:</p><pre><code class="language-shell">docker-compose up --build</code></pre><p>Si necesitas remover todos los servicios creados antes por el <code>Dockerfile</code> también puedes ejecutar <code>docker-compose down</code>.</p><h2 id="-docker-es-tu-amigo-"><strong>¡Docker es tu amigo!</strong></h2><p>Así es, mi amigo. Docker te puede ayudar para prevenir muchos posibles errores antes de que ocurran. Puedes usarlos para aplicaciones front y back end. Inclusive para IoT cuando necesites controlar el hardware, puedes especificar políticas para usarlo.</p><p>Para tus próximos pasos, recomiendo mucho que mires a orquestadores de contenedores tales como Kubernetes y Docker swarm. Podrían mejorar mucho más tus aplicaciones existentes y ayudarte a ir al siguiente nivel.</p><h2 id="gracias-por-leer"><strong>Gracias por leer</strong></h2><p>Aprecio mucho el tiempo que pasamos juntos. Espero que este contenido sea más que solo texto. Espero que te ayude a pensar mejor y programar mejor. Sígueme en <a href="https://twitter.com/erickwendel_">Twitter</a> y mira my <a href="https://erickwendel.com/">blog personal</a> donde comparto todo mi contenido de valor.</p><p>¡Nos vemos!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ ¿Dónde se almacenan las imágenes de Docker? Rutas de contenedores Docker explicadas ]]>
                </title>
                <description>
                    <![CDATA[ Docker ha sido ampliamente adoptado y se utiliza para ejecutar y escalar aplicaciones en producción. Además, se puede usar para iniciar aplicaciones rápidamente ejecutando un solo comando de Docker. Las empresas también están invirtiendo cada vez más esfuerzos para mejorar el desarrollo en contenedores Docker locales y remotos, lo que ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/donde-se-almacenan-las-imagenes-de-docker-rutas-de-contenedores-docker-explicadas/</link>
                <guid isPermaLink="false">63f99fe92154fe0736d613b5</guid>
                
                    <category>
                        <![CDATA[ docker ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrés  Torres ]]>
                </dc:creator>
                <pubDate>Tue, 07 Mar 2023 22:15:38 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/02/Docker-container-paths.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/where-are-docker-images-stored-docker-container-paths-explained/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Where are Docker Images Stored? Docker Container Paths Explained</a>
      </p><p>Docker ha sido ampliamente adoptado y se utiliza para ejecutar y escalar aplicaciones en producción. Además, se puede usar para iniciar aplicaciones rápidamente ejecutando un solo comando de Docker.</p><p>Las empresas también están invirtiendo cada vez más esfuerzos para mejorar el desarrollo en contenedores Docker locales y remotos, lo que también tiene muchas ventajas.</p><p>Puedes obtener la información básica sobre la configuración de su Docker ejecutando:</p><pre><code class="language-shell">$ docker info

...
 Storage Driver: overlay2
 Docker Root Dir: /var/lib/docker
...</code></pre><p>El resultado contiene información sobre su controlador de almacenamiento, así como del directorio raíz de Docker.</p><h3 id="la-ubicaci-n-de-almacenamiento-de-im-genes-y-contenedores-de-docker">La ubicación de almacenamiento de imágenes y contenedores de Docker</h3><p>Un contenedor de Docker consta de configuraciones de red, volúmenes e imágenes. La ubicación de los archivos de Docker depende de su sistema operativo. Aquí hay una descripción general de los sistemas operativos más utilizados:</p><ul><li>Ubuntu: <code>/var/lib/docker/</code></li><li>Fedora: <code>/var/lib/docker/</code></li><li>Debian: <code>/var/lib/docker/</code></li><li>Windows: <code>C:\ProgramData\DockerDesktop</code></li><li>MacOS: <code>~/Library/Containers/com.docker.docker/Data/vms/0/</code></li></ul><p>En macOS y Windows, Docker ejecuta contenedores de Linux en un entorno virtual. Por lo tanto, hay algunas cosas adicionales que debe saber.</p><h3 id="docker-para-mac">Docker para Mac</h3><p>Docker no es compatible de forma nativa con macOS, de allí que <a href="https://github.com/moby/hyperkit">Hyperkit</a> es usado para correr una imagen virtual. Esta imagen virtual está localizada en:</p><p><code>~/Library/Containers/com.docker.docker/Data/vms/0</code></p><p>Dentro de la imagen virtual, la ruta es la que presenta Docker por default: <code>/var/lib/docker</code>.</p><p>Podemos investigar la dirección de nuestro directorio de Docker mediante el <em>shell</em> en el entorno virtual:</p><pre><code class="language-shell">$ screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty </code></pre><p>Puedes cerrar esta sesión presionando <strong>Ctrl+a, seguido de k e y</strong>.</p><h3 id="docker-para-windows"><strong>Docker para Windows</strong></h3><p>En Windows, Docker está un poco fraccionado. Hay contenedores nativos de Windows que funcionan de manera similar a los contenedores de Linux. Los contenedores de Linux se ejecutan en un entorno virtual mínimo basado en Hyper-V.<br>La configuración y la imagen virtual para ejecutar las imágenes de Linux se guardan en la carpeta raíz predeterminada de Docker.</p><p><code>C:\ProgramData\DockerDesktop</code></p><p>Si inspeccionas imágenes regulares, obtendrá rutas de Linux como:</p><pre><code class="language-shell">$ docker inspect nginx

...
"UpperDir": "/var/lib/docker/overlay2/585...9eb/diff"
...
</code></pre><p>Puedes conectarte con la imagen virtual mediante:</p><pre><code class="language-shell">docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -i sh</code></pre><p>Luego, puedes ir a la localización referenciada:</p><pre><code class="language-shell">$ cd /var/lib/docker/overlay2/585...9eb/
$ ls -lah

drwx------    4 root     root        4.0K Feb  6 06:56 .
drwx------   13 root     root        4.0K Feb  6 09:17 ..
drwxr-xr-x    3 root     root        4.0K Feb  6 06:56 diff
-rw-r--r--    1 root     root          26 Feb  6 06:56 link
-rw-r--r--    1 root     root          57 Feb  6 06:56 lower
drwx------    2 root     root        4.0K Feb  6 06:56 work</code></pre><h2 id="la-estructura-interna-de-una-carpeta-de-ra-z-de-docker"><strong>La estructura interna de una carpeta de raíz de Docker</strong></h2><p>En el interior de <code>/var/lib/docker</code> se almacena diferente información. Por ejemplo, datos para contenedor, volúmenes, compilaciones, redes y clústeres.</p><pre><code class="language-shell">$ ls -la /var/lib/docker

total 152
drwx--x--x   15 root     root          4096 Feb  1 13:09 .
drwxr-xr-x   13 root     root          4096 Aug  1  2019 ..
drwx------    2 root     root          4096 May 20  2019 builder
drwx------    4 root     root          4096 May 20  2019 buildkit
drwx------    3 root     root          4096 May 20  2019 containerd
drwx------    2 root     root         12288 Feb  3 19:35 containers
drwx------    3 root     root          4096 May 20  2019 image
drwxr-x---    3 root     root          4096 May 20  2019 network
drwx------    6 root     root         77824 Feb  3 19:37 overlay2
drwx------    4 root     root          4096 May 20  2019 plugins
drwx------    2 root     root          4096 Feb  1 13:09 runtimes
drwx------    2 root     root          4096 May 20  2019 swarm
drwx------    2 root     root          4096 Feb  3 19:37 tmp
drwx------    2 root     root          4096 May 20  2019 trust
drwx------   15 root     root         12288 Feb  3 19:35 volumes
</code></pre><h3 id="im-genes-en-docker"><strong>Imágenes en Docker </strong></h3><p>Los contenidos más pesados son, a menudo, las imágenes. Si usas la superposición del controlador de almacenamiento predeterminado, tus imágenes de Docker se almacenarán en <code>/var/lib/docker/overlay2</code>. </p><p>Allí, podrás encontrar diferentes archivos que representan capas de solo lectura de una imagen de Docker y una capa superior que contiene sus cambios.<br>Exploremos el contenido usando un ejemplo:</p><pre><code class="language-shell">$ docker image pull nginx
$ docker image inspect nginx

[
    {
        "Id": "sha256:207...6e1",
        "RepoTags": [
            "nginx:latest"
        ],
        "RepoDigests": [
            "nginx@sha256:ad5...c6f"
        ],
        "Parent": "",
 ...
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 126698063,
        "VirtualSize": 126698063,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/585...9eb/diff:
                             /var/lib/docker/overlay2/585...9eb/diff",
                "MergedDir": "/var/lib/docker/overlay2/585...9eb/merged",
                "UpperDir": "/var/lib/docker/overlay2/585...9eb/diff",
                "WorkDir": "/var/lib/docker/overlay2/585...9eb/work"
            },
...
</code></pre><p>LowerDir contiene las capas de solo lectura de una imagen. La capa de lectura y escritura que representa los cambios es parte de UpperDir. En este caso, la carpeta NGINX UpperDir contiene los archivos de registro:</p><pre><code class="language-shell">$ ls -la /var/lib/docker/overlay2/585...9eb/diff

total 8
drwxr-xr-x    2 root     root    4096 Feb  2 08:06 .
drwxr-xr-x    3 root     root    4096 Feb  2 08:06 ..
lrwxrwxrwx    1 root     root      11 Feb  2 08:06 access.log -&gt; /dev/stdout
lrwxrwxrwx    1 root     root      11 Feb  2 08:06 error.log -&gt; /dev/stderr</code></pre><p>MergedDir representa el resultado de UpperDir y LowerDir que utiliza Docker para ejecutar el contenedor. WorkDir es un directorio interno para overlay2 y debe estar vacío.</p><h3 id="vol-menes-en-docker">Volúmenes en Docker</h3><p>Es posible agregar un almacenamiento persistente a los contenedores para conservar los datos durante más tiempo del que existe en el contenedor o para compartir el volumen con el host o con otros contenedores. Un contenedor se puede iniciar con un volumen usando la<strong> opción -v</strong>:</p><pre><code class="language-shell">$ docker run --name nginx_container -v /var/log nginx</code></pre><p>Podemos obtener información sobre la ubicación del volumen conectado mediante:</p><pre><code class="language-shell">$ docker inspect nginx_container

...
"Mounts": [
            {
                "Type": "volume",
                "Name": "1e4...d9c",
                "Source": "/var/lib/docker/volumes/1e4...d9c/_data",
                "Destination": "/var/log",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
...
</code></pre><p>El directorio al que se hace referencia contiene archivos de la ubicación <code>/var/log</code> del contenedor NGINX.</p><pre><code class="language-shell">$ ls -lah /var/lib/docker/volumes/1e4...d9c/_data

total 88
drwxr-xr-x    4 root     root        4.0K Feb  3 21:02 .
drwxr-xr-x    3 root     root        4.0K Feb  3 21:02 ..
drwxr-xr-x    2 root     root        4.0K Feb  3 21:02 apt
-rw-rw----    1 root     43             0 Jan 30 00:00 btmp
-rw-r--r--    1 root     root       34.7K Feb  2 08:06 dpkg.log
-rw-r--r--    1 root     root        3.2K Feb  2 08:06 faillog
-rw-rw-r--    1 root     43         29.1K Feb  2 08:06 lastlog
drwxr-xr-x    2 root     root        4.0K Feb  3 21:02 nginx
-rw-rw-r--    1 root     43             0 Jan 30 00:00 w
</code></pre><h3 id="limpiar-el-espacio-utilizado-por-docker">Limpiar el espacio utilizado por Docker</h3><p>Se recomienda utilizar el comando Docker para limpiar los contenedores no utilizados. El contenedor, las redes, las imágenes y la caché de compilación se pueden limpiar ejecutando:</p><pre><code class="language-shell">$ docker system prune -a</code></pre><p>Además, también puede eliminar volúmenes no utilizados ejecutando:</p><pre><code class="language-shell">$ docker volumes prune</code></pre><h3 id="resumen">Resumen</h3><p>Docker es una parte importante de los entornos y herramientas de muchas personas. A veces, Docker se siente un poco mágico al resolver problemas de una manera muy inteligente sin decirle al usuario cómo se hacen las cosas detrás de escena. Aun así, Docker es una herramienta común que almacena sus partes pesadas en ubicaciones que se pueden abrir y cambiar.</p><p>A veces, <strong>el almacenamiento puede llenarse rápidamente. Por lo tanto, es útil inspeccionar su carpeta raíz</strong>, pero no se recomienda eliminar o cambiar ningún archivo manualmente. En su lugar, los comandos de poda se pueden utilizar para liberar espacio en disco.</p><p>Espero que hayas disfrutado el artículo. Si te gusta y sientes la necesidad de un aplauso, sígueme en Twitter. Trabajo en eBay Kleinanzeigen, una de las mayores empresas de anuncios clasificados del mundo. Por cierto, ¡estamos contratando!</p><p>Feliz exploración de Docker :)</p><h2 id="referencias"><strong>Referencias</strong></h2><p>Documentación del Storage Diver de Docker:<br><a href="https://docs.docker.com/storage/storagedriver/">https://docs.docker.com/storage/storagedriver/</a></p><p>Sistema de archivos de superposición de documentación<br><a href="https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt">https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como obtener la dirección IP de un contenedor Docker - Explicado con ejemplos ]]>
                </title>
                <description>
                    <![CDATA[ Docker brinda la capacidad de empaquetar y ejecutar una aplicación en un entorno aislado llamado contenedor. Sé lo que estás pensando: Venga, no otra publicación que explique qué es Docker, ¡Está en todas partes en estos días! Pero no se preocupe, nos estamos saltando esa introducción básica. El público objetivo ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-obtener-la-direccion-ip-de-un-contenedor-docker-explicado-con-ejemplos/</link>
                <guid isPermaLink="false">63e555919a3ea706f58b0aaf</guid>
                
                    <category>
                        <![CDATA[ docker ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Johsttin Eduardo Curahua Gutierrez ]]>
                </dc:creator>
                <pubDate>Mon, 20 Feb 2023 19:33:49 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/02/5f9c9a19740569d1a4ca2384.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-get-a-docker-container-ip-address-explained-with-examples/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Get A Docker Container IP Address - Explained with Examples</a>
      </p><p>Docker brinda la capacidad de empaquetar y ejecutar una aplicación en un entorno aislado llamado contenedor.</p><p>Sé lo que estás pensando: Venga, no otra publicación que explique qué es Docker, ¡Está en todas partes en estos días!</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/06/docker-i-see.jpg" class="kg-image" alt="docker-i-see" width="600" height="400" loading="lazy"></figure><p>Pero no se preocupe, nos estamos saltando esa introducción básica. El público objetivo de este artículo ya debería tener una comprensión básica de lo que son Docker y Contenedores.</p><p>Pero, ¿Alguna vez se ha preguntado cómo obtener una dirección IP del contenedor Docker?</p><h2 id="explicando-redes-en-docker">Explicando redes en Docker</h2><p><br>Primero, comprendamos cómo funciona las redes en Docker. Para eso, nos vamos a centrar en la red predeterminada <code>bridge</code>. Cuando usa Docker, si no especifica un controlador, este es el tipo de red que está usando.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/06/docker-network.png" class="kg-image" alt="docker-network" width="600" height="400" loading="lazy"><figcaption>Docker network, image from <a href="https://www.docker.com/blog/understanding-docker-networking-drivers-use-cases/" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">understanding-docker-networking-drivers-use-cases</a></figcaption></figure><p>La red <code>bridge</code> funciona como una red privada interna del host para que los contenedores puedan comunicarse. El acceso externo se otorga al exponer los puertos de los contenedores. </p><p>Las redes bridge se utilizan cuando sus aplicaciones se ejecutan en contenedores independientes que necesitan comunicarse.</p><p>En la imagen de arriba, <code>db</code> y <code>web</code> pueden comunicarse entre sí mediante una red bridge creada por el usuario llamada <code>mybridge</code>. </p><p>Si nunca ha agregado una red en Docker, debería ver algo similar a esto:</p><pre><code class="language-bash">$ docker network ls

NETWORK ID          NAME                  DRIVER              SCOPE
c3cd46f397ce        bridge                bridge              local
ad4e4c24568e        host                  host                local
1c69593fc6ac        none                  null                local</code></pre><p>La red <code>bridge</code> predeterminada aparece en la lista, junto con <code>host</code> y <code>none</code>. Ignoraremos los otros dos y usaremos la red <code>bridge</code> cuando lleguemos a los ejemplos.</p><h2 id="direcci-n-ip-de-un-contenedor-de-docker"><strong>Dirección IP de un contenedor de Docker</strong></h2><p><br>De forma predeterminada, al contenedor se le asigna una dirección IP para cada red de Docker a la que se conecta. Y cada red se crea con una máscara de subred predeterminada, que se usa como un pool para luego proporcionar las direcciones IP.</p><p>Por lo general, Docker usa la subred predeterminada <strong>172.17. 0.0/16</strong> &nbsp;para los contenedores.</p><p>Ahora, para entenderlo mejor, ejecutaremos un caso de uso real.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/06/flamenco-done.png" class="kg-image" alt="drawing" width="600" height="400" loading="lazy"></figure><h3 id="ejemplo-docker">Ejemplo Docker</h3><p><br>Para ilustrar esto, usaremos un entorno Hive y Hadoop, que contiene 5 contenedores Docker.</p><p>Revise el archivo <code>docker-compose.yml</code> &nbsp;que estamos a punto de ejecutar:</p><pre><code>version: "3"

services:
  namenode:
    image: bde2020/hadoop-namenode:2.0.0-hadoop2.7.4-java8
    volumes:
      - namenode:/hadoop/dfs/name
    environment:
      - CLUSTER_NAME=test
    env_file:
      - ./hadoop-hive.env
    ports:
      - "50070:50070"
  datanode:
    image: bde2020/hadoop-datanode:2.0.0-hadoop2.7.4-java8
    volumes:
      - datanode:/hadoop/dfs/data
    env_file:
      - ./hadoop-hive.env
    environment:
      SERVICE_PRECONDITION: "namenode:50070"
    ports:
      - "50075:50075"
  hive-server:
    image: bde2020/hive:2.3.2-postgresql-metastore
    env_file:
      - ./hadoop-hive.env
    environment:
      HIVE_CORE_CONF_javax_jdo_option_ConnectionURL: "jdbc:postgresql://hive-metastore/metastore"
      SERVICE_PRECONDITION: "hive-metastore:9083"
    ports:
      - "10000:10000"
  hive-metastore:
    image: bde2020/hive:2.3.2-postgresql-metastore
    env_file:
      - ./hadoop-hive.env
    command: /opt/hive/bin/hive --service metastore
    environment:
      SERVICE_PRECONDITION: "namenode:50070 datanode:50075 hive-metastore-postgresql:5432"
    ports:
      - "9083:9083"
  hive-metastore-postgresql:
    image: bde2020/hive-metastore-postgresql:2.3.0

volumes:
  namenode:
  datanode:
</code></pre><p><a href="https://github.com/mesmacosta/docker-hive">Desde <strong><strong>docker-hive</strong></strong> GitHub</a></p><p>Nadie quiere leer un archivo de configuración <strong>ENORME</strong>, ¿verdad? Así que aquí hay una imagen:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/06/Screen-Shot-2020-06-21-at-2.48.18-PM.png" class="kg-image" alt="Screen-Shot-2020-06-21-at-2.48.18-PM" width="600" height="400" loading="lazy"></figure><p>¡Mucho mejor! Ahora vamos a poner en marcha esos contenedores:</p><pre><code class="language-bash">docker-compose up -d
</code></pre><p>Podemos ver 5 contenedores:</p><pre><code class="language-bash">$ docker ps --format \
"table {{.ID}}\t{{.Status}}\t{{.Names}}"

CONTAINER ID        STATUS                   NAMES
158741ba0339        Up 1 minutes             dockerhive_hive-metastore-postgresql
607b00c25f29        Up 1 minutes             dockerhive_namenode
2a2247e49046        Up 1 minutes             dockerhive_hive-metastore
7f653d83f5d0        Up 1 minutes (healthy)   dockerhive_hive-server
75000c343eb7        Up 1 minutes (healthy)   dockerhive_datanode</code></pre><p>A continuación vamos a comprobar nuestras redes Docker</p><pre><code class="language-bash">$ docker network ls

NETWORK ID          NAME                  DRIVER              SCOPE
c3cd46f397ce        bridge                bridge              local
9f6bc3c15568        docker-hive_default   bridge              local
ad4e4c24568e        host                  host                local
1c69593fc6ac        none                  null                local</code></pre><p>Un momento... ¡Hay una nueva red llamada <code>docker-hive_default</code>!</p><p>Por defecto, <code>docker compose</code> configura una sola red para su aplicación. Y la red de su aplicación recibe un nombre basado en el "nombre del proyecto", que se origina a partir del nombre del directorio en el que se encuentra.</p><p>Entonces, dado que nuestro directorio se llama <code>docker-hive</code>, esto explica la nueva red.</p><p>A continuación, algunos ejemplos sobre cómo obtener la dirección IP de Docker.</p><h2 id="como-obtener-la-direcci-n-ip-de-un-contenedor-docker-ejemplos"><strong>Como obtener la dirección IP de un contenedor Docker - ejemplos</strong><br></h2><p>Y ahora que tengo su atención, vamos a develar el misterio.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/06/bermuda-logged-out-1.png" class="kg-image" alt="drawing" width="600" height="400" loading="lazy"></figure><h3 id="1-usando-docker-inspect"><strong>1. Usando Docker Inspect</strong></h3><p><br><code>docker inspect</code> es una excelente manera de recuperar información de bajo nivel sobre los objetos de Docker. Puede seleccionar cualquier campo del JSON devuelto de una manera bastante sencilla.</p><p>Entonces, ¿lo usaremos para obtener la dirección IP de <code>dockerhive_datanode</code>?</p><pre><code class="language-bash">$ docker inspect -f \
'{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
75000c343eb7

172.18.0.5</code></pre><p>¿No dije que Docker usa la subred <strong>172.17.0.0/16</strong> predeterminada para las redes de contenedores? ¿Por qué la dirección IP devuelta: <strong>172.18.0.5</strong> está fuera de ella?</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/06/Screen-Shot-2020-06-22-at-3.25.07-PM.png" class="kg-image" alt="Screen-Shot-2020-06-22-at-3.25.07-PM" width="600" height="400" loading="lazy"><figcaption>Image created on <a href="https://tehnoblog.org/ip-tools/ip-address-in-cidr-range/" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">ip-address-in-cidr-range</a></figcaption></figure><p>Para responder eso tenemos que mirar nuestra configuración de red:</p><pre><code class="language-bash">$ docker network inspect -f \
'{{range .IPAM.Config}}{{.Subnet}}{{end}}'  9f6bc3c15568

172.18.0.0/16</code></pre><p>Ejecutamos este ejemplo en una Compute Engine VM y en esta prueba, a la red docker se le asignó una subred diferente: <strong>172.18.0.0/16</strong>. ¡Eso lo explica!</p><p>Además, también podemos buscar todas las direcciones IP dentro de la red <code>docker-hive_default</code>.</p><p>Por lo tanto, no necesitamos buscar la IP de cada contenedor individualmente:</p><pre><code class="language-bash">$ docker network inspect -f \
'{{json .Containers}}' 9f6bc3c15568 | \
jq '.[] | .Name + ":" + .IPv4Address'

"dockerhive_hive-metastore-postgresql:172.18.0.6/16"
"dockerhive_hive-metastore:172.18.0.2/16"
"dockerhive_namenode:172.18.0.3/16"
"dockerhive_datanode:172.18.0.5/16"
"dockerhive_hive-server:172.18.0.4/16"</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/06/cherry-success.png" class="kg-image" alt="drawing" width="600" height="400" loading="lazy"></figure><p>Si no se dio cuenta, usamos la ayuda de <a href="https://github.com/stedolan/jq"><strong><strong>jq</strong></strong></a> para analizar el objeto de mapa de los <code>Contenedores</code>.</p><h3 id="2-usando-docker-exec"><strong>2. Usando Docker exec</strong></h3><p>En el siguiente ejemplo trabajaremos con el <code>dockerhive_namenode</code>.</p><pre><code class="language-bash">$ docker exec dockerhive_namenode cat /etc/hosts

127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.3      607b00c25f29</code></pre><h3 id="3-dentro-del-contenedor-docker"><strong>3. Dentro del contenedor Docker</strong></h3><pre><code class="language-bash">$ docker exec -it dockerhive_namenode /bin/bash

# running inside the dockerhive_namenode container
ip -4 -o address

7: eth0    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0</code></pre><p>Incluso podemos encontrar direcciones IP de otros contenedores que están dentro de la misma red:</p><p><strong><strong>Data node</strong></strong></p><pre><code class="language-bash"># running inside the dockerhive_namenode container
ping dockerhive_datanode

PING dockerhive_datanode (172.18.0.5): 56 data bytes
64 bytes from 172.18.0.5: icmp_seq=0 ttl=64 time=0.092 ms</code></pre><p><strong><strong>Hive mestastore</strong></strong></p><pre><code class="language-bash"># running inside the dockerhive_namenode container
ping dockerhive_hive-metastore

PING dockerhive_hive-metastore_1 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: icmp_seq=0 ttl=64 time=0.087 ms</code></pre><p><strong><strong>Hive server</strong></strong></p><pre><code class="language-bash"># running inside the container
ping dockerhive_hive-server

PING dockerhive_hive-server (172.18.0.4): 56 data bytes
64 bytes from 172.18.0.4: icmp_seq=0 ttl=64 time=0.172 ms</code></pre><h2 id="tener-en-cuenta"><strong>Tener en cuenta</strong></h2><p>Todos los ejemplos se ejecutaron en una Compute Engine VM de distribución Linux. Si los ejecuta en entornos macOS o Windows, los comandos de muestra pueden cambiar un poco.</p><p>También tenga en cuenta que esas direcciones IP en los ejemplos dados son internas a la red de ejemplo <code>docker-hive_default</code>. Entonces, si necesita conectarse a esos contenedores externamente, necesitará usar la IP externa de la máquina host (suponiendo que está exponiendo los puertos de los contenedores correctamente).<br><br>O si está utilizando kubernetes, por ejemplo, para administrar sus contenedores Docker, deje que kubernetes maneje las direcciones IP por usted.</p><p><strong><strong>* </strong>Ilustraciones de<strong> <a href="https://icons8.com/">icons8.com</a> </strong>por<strong> <a href="https://dribbble.com/muratkalkavan">Murat Kalkavan</a>.</strong></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 7 Casos en los que no deberías usar Docker ]]>
                </title>
                <description>
                    <![CDATA[ Docker es un cambio de juego. Pero no es una solución única para todos. Docker tiene muchas cosas buenas. Empaca, expide, y ejecuta aplicaciones como una herramienta de contenerización con ligera, portable y autosuficiente. Docker es genial para negocios de todos los tamaños. Cuando trabajas un pedazo de código en ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/7-casos-en-los-que-no-deberias-usar-docker/</link>
                <guid isPermaLink="false">63d15ba30498b108662130d9</guid>
                
                    <category>
                        <![CDATA[ docker ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Enrique Viveros Acosta ]]>
                </dc:creator>
                <pubDate>Mon, 30 Jan 2023 03:04:20 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/01/Docker-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/7-cases-when-not-to-use-docker/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">7 Cases When You Should Not Use Docker</a>
      </p><p><strong>Docker es un cambio de juego. Pero no es una solución única para todos.</strong></p><p>Docker tiene muchas cosas buenas. Empaca, expide, y ejecuta aplicaciones como una herramienta de contenerización con ligera, portable y autosuficiente. Docker es genial para negocios de todos los tamaños. Cuando trabajas un pedazo de código en un equipo pequeño, elimina el problema "pero funciona en mi computador" . Mientras tanto, empresas usan Docker para construir entregas de ductos de software ágil y ductos para enviar nuevas funciones de forma más rápida y segura.</p><p>Con su sistema de contenedores incorporado, Docker es una excelente herramienta para la computación en la nube. A su vez, Docker Swarm promueve la agrupación en clústeres y el diseño descentralizado. Suena demasiado bueno para ser verdad, ¿verdad? Bueno, todavía hay varios casos en los que no se debe usar Docker. Aquí hay siete de ellos.</p><p>Veámoslos uno por uno.</p><h2 id="no-uses-docker-si-necesitas-aumentar-la-velocidad"><strong><strong>No uses Docker si necesitas aumentar la velocidad</strong></strong></h2><p>Los contenedores Docker son más pequeños y requieren menos recursos que una máquina virtual con un servidor y una base de datos. Al mismo tiempo, Docker utilizará tantos recursos del sistema como lo permita el programador del kernel del alojamiento. No esperes que Docker acelere una aplicación de ninguna manera.</p><p>Es más, Docker podría incluso hacerlo más lento. Si estás trabajando con él, debes establecer límites sobre la cantidad de memoria, CPU o bloque IO que puede usar el contenedor. De lo contrario, si el kernel detecta que la memoria de la máquina de alojamiento se está agotando para realizar funciones importantes del sistema, podría comenzar a eliminar procesos importantes. Si se elimina el proceso incorrecto (incluido el propio Docker), el sistema será inestable.</p><p>Desafortunadamente, los ajustes de memoria de Docker, la prioridad de falta de memoria en el demonio de Docker (Docker daemon) , no resuelven este problema. Por el contrario, una capa adicional entre una aplicación y el sistema operativo también podría resultar en una reducción de la velocidad. Sin embargo, esta disminución será insignificante. Los contenedores Docker no están completamente aislados y no contienen un sistema operativo completo como cualquier máquina virtual.</p><h2 id="no-uses-docker-si-priorisas-la-seguridad"><strong>No uses Docker si priorisas la seguridad </strong></h2><p>La mayor ventaja de seguridad de Docker es que divide la aplicación en partes más pequeñas. Si la seguridad de una parte se ve comprometida, el resto de ellas no se verá afectada.</p><p>Sin embargo, mientras que los procesos aislados en los contenedores prometen una mayor seguridad, todos los contenedores comparten el acceso a un solo sistema operativo de alojamiento. Corres el riesgo de ejecutar contenedores Docker con un aislamiento incompleto. Cualquier código malicioso puede acceder a la memoria de su computadora.</p><p>Existe una práctica popular para ejecutar muchos contenedores en un solo entorno. Así es como haces que tu aplicación esté predispuesta al tipo de ataques de abuso de recursos, a menos que limites las capacidades del contenedor de recursos. Para una máxima eficiencia y aislamiento, cada contenedor debes abordar un área específica de interés.</p><p>Otro problema es la configuración predeterminada de Docker: los usuarios no tienen espacios de nombres (namespace) . Los espacios de nombres permiten que los recursos de software usen otros recursos solo si pertenecen a un espacio de nombres específico.</p><p>Ejecutar aplicaciones con Docker implica ejecutar el demonio de Docker (Docker daemon) &nbsp;con privilegios de superusuario (root). Cualquier proceso que salga del contenedor Docker tendrá los mismos privilegios en el alojamiento que tenía en el contenedor. Ejecutar sus procesos dentro de los contenedores como un usuario sin privilegios no puede garantizar la seguridad. Depende de las capacidades que agregue o elimine. Para mitigar los riesgos de ruptura de contenedores de Docker, no debes descargar contenedores listos para usar de fuentes no confiables.</p><h2 id="no-uses-docker-si-desarrollas-una-aplicaci-n-gui-de-escritorio"><strong>No uses Docker si desarrollas una aplicación GUI de escritorio</strong></h2><p>Docker no se adapta a las aplicaciones que requieren una interfaz de usuario rica. Docker está destinado principalmente a contenedores aislados con aplicaciones basadas en consola. Las aplicaciones basadas en GUI no son una prioridad, su soporte dependerá del caso y la aplicación específicos. Los contenedores de Windows se basan en Nano o Core Server; no permite a los usuarios iniciar una interfaz basada en GUI o un servidor Docker RDP en el contenedor Docker.</p><p>Sin embargo, aún puedes ejecutar <a href="https://hub.docker.com/r/tzutalin/py2qt4/">aplicaciones basadas en GUI</a> desarrolladas con Python y el marco QT en un contenedor de Linux. Además, puedes usar el reenvío X11, pero esta solución es algo incómoda.</p><h2 id="no-uses-docker-si-quieres-aliviar-el-desarrollo-y-la-depuraci-n"><strong>No uses Docker si quieres aliviar el desarrollo y la depuración</strong></h2><p>Docker fue creado por desarrolladores y para desarrolladores. Brinda estabilidad al entorno: un contenedor en la máquina de desarrollo funcionará exactamente igual en el escenario, la producción o cualquier otro entorno. Esto elimina el problema de varias versiones de programas en diferentes entornos.</p><p>Con la ayuda de Docker, puedes agregar fácilmente una nueva dependencia a tu aplicación. Ningún desarrollador de tu equipo necesitará repetir esta manipulación en su máquina. Todo estará funcionando en el contenedor y distribuido a todo el equipo.</p><p>Al mismo tiempo, debes realizar una configuración adicional para codificar tu aplicación en Docker. Además, con la depuración de Docker, debes configurar la salida de registros y configurar los puertos de depuración. Es posible que también necesites asignar puertos para sus aplicaciones y servicios en contenedores. Entonces, si tienes un proceso de implementación complicado y tedioso, Docker ayudará mucho. Si tienes una aplicación simple, solo agregas una complejidad innecesaria.</p><h2 id="no-uses-docker-si-necesitas-usar-diferentes-sistemas-operativos-o-kernels"><strong>No uses Docker si necesitas usar diferentes sistemas operativos o kernels </strong></h2><p>Con las máquinas virtuales, el hipervisor puede abstraer un dispositivo completo. Puede usar Microsoft Azure para ejecutar ambas instancias de Windows Server y Linux Server al mismo tiempo. Sin embargo, la imagen de Docker requiere el mismo sistema operativo para el que se creó.</p><p>Hay una gran base de datos de imágenes de contenedores Docker: Docker Hub. Sin embargo, si se creó una imagen en Linux Ubuntu, solo se ejecutará en el mismo Ubuntu.</p><p>Si una aplicación se desarrolla en Windows, pero la producción se ejecuta en Linux, no podrás usar Docker de manera efectiva. A veces, es más fácil configurar un servidor si tiene varias aplicaciones estáticas.</p><h2 id="no-uses-docker-si-tienes-muchos-datos-valiosos-que-almacenar"><strong>No uses Docker si tienes muchos datos valiosos que almacenar</strong></h2><p>Por diseño, todos los archivos de Docker se crean dentro de un contenedor y se almacenan en una capa de contenedor de escritura. Puede ser difícil recuperar los datos del contenedor si un proceso diferente los necesita. Además, la capa de escritura de un contenedor está conectada a la máquina host en la que se ejecuta el contenedor. Si necesitas mover los datos a otro lugar, no puedes hacerlo fácilmente. Más que eso, todos los datos almacenados dentro de un contenedor se perderán para siempre una vez que el contenedor se apague.</p><p>Primero debes pensar en formas de guardar tus datos en otro lugar. Para mantener los datos seguros en Docker, debes emplear una herramienta adicional: Volúmenes de datos de Docker. Sin embargo, esta solución sigue siendo bastante torpe y necesita ser mejorada.</p><h2 id="no-uses-docker-si-est-s-buscando-la-tecnolog-a-m-s-f-cil-de-administrar"><strong>No uses Docker si estás buscando la tecnología más fácil de administrar </strong></h2><p>Al ser introducido en 2012, Docker sigue siendo una nueva tecnología. Como desarrollador, es posible que debas actualizar las versiones de Docker con regularidad. Desafortunadamente, la compatibilidad con versiones anteriores no está garantizada. Además, la documentación se está quedando atrás con respecto al avance de la tecnología. Como desarrollador, tendrás que resolver algunas cosas tú mismo.</p><p>Además, las opciones de monitorización que ofrece Docker son bastante pobres. Puedes obtener una visión rápida de algunas estadísticas simples. Sin embargo, si deseas ver algunas funciones de monitoreo avanzadas, Docker no tiene nada que ofrecer.</p><p>También, en el caso de una aplicación grande y compleja, la implementación de Docker tiene un costo. Crear y mantener la comunicación entre numerosos contenedores en numerosos servidores requerirá mucho tiempo y esfuerzo. Sin embargo, existe una herramienta útil que facilita el trabajo con aplicaciones Docker de varios contenedores: Docker Compose. Docker Compose define servicios, redes y volúmenes en un solo archivo YAML.</p><p>No obstante, el ecosistema de Docker está bastante fracturado: no todos los productos de contenedores compatibles funcionan bien entre sí. Cada producto está respaldado por una determinada empresa o comunidad. La competencia acalorada entre ellas produce incompatibilidad.</p><h2 id="para-concluir"><strong>Para concluir</strong></h2><p>Los profesionales de KeenEthics disfrutan trabajar con Docker y, a menudo, lo usan para el desarrollo de aplicaciones. A pesar de algunos inconvenientes, puedes usarlo fácilmente para ejecutar y administrar aplicaciones en paralelo en contenedores aislados.</p><p>Instalar una aplicación puede ser tan simple como ejecutar un solo comando – &lt;docker run&gt;. Docker también proporciona un entorno de aislamiento limpio y original para cada prueba, lo que lo convierte en una herramienta importante y útil para las pruebas de automatización.</p><p>Las características de Docker ofrecen beneficios en términos de administración de dependencias y seguridad. Mejorado con herramientas tan útiles como Docker Hub, Docker Swarm y Docker Compose, Docker es una solución popular y fácil de usar.</p><p>A pesar de todos los beneficios de Docker, no debes usarlo para contener todas y cada una de las aplicaciones que desarrolles.</p><p><em>Recuerda</em>:<em> Docker cambia las reglas del juego</em>. <em>Pero no es una solución única para todos.</em></p><p>Docker tampoco es la única herramienta de este tipo en el mercado. Las alternativas de Docker son <a href="https://www.redhat.com/es/technologies/cloud-computing/openshift">rkt</a>, pronunciado como 'rocket', <a href="https://linuxcontainers.org/">Linux Containers</a> u <a href="https://openvz.org/">OpenVZ</a>. Cada uno de estos con sus ventajas y desventajas es bastante similar a Docker. La creciente popularidad y las tasas de uso de Docker se deben únicamente a la decisión de las empresas de adoptarlo.</p><p>Antes de saltar a conclusiones sobre si debe usar Docker o no, investiga los requisitos del proyecto. Habla con tus compañeros de equipo o compañeros y permítales que te ayuden a decidir cuándo usar Docker, &nbsp;y cuándo no usar contenedores y si es uno de esos casos de uso de Docker.</p><p>Te guste o no, esta tecnología tiene futuro. Hay algunos desarrolladores y agencias de desarrollo que odian a Docker y tratan de eliminarlo de todos sus proyectos en curso. Al mismo tiempo, hay especialistas que contienen todo lo que pueden porque ven a Docker como una panacea. Tal vez, no deberías unirte a ninguno de los campos. Mantente imparcial, mantente objetivo y toma una decisión dependiendo de la situación en particular.</p><h2 id="tienes-una-idea-para-un-proyecto-docker"><strong>Tienes una idea para un proyecto Docker?</strong></h2><p>Mi empresa KeenEthics es un equipo de <a href="https://keenethics.com/services-web-development">desarrolladores de aplicaciones web</a> experimentados. En caso de que necesites un presupuesto gratuito de un proyecto similar, no dudes en <a href="https://keenethics.com/contacts?activeForm=estimate">ponerte en contacto</a>.</p><h3 id="p-s-">P.S.</h3><p>Además, me gustaría decir "gracias" a <a href="https://www.linkedin.com/in/oleksiy-pletnov-212b3764/">Alex Pletnov</a> por ser coautor de este artículo, así como a los lectores por leer hasta el final.</p><p></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Guía de Docker para principiantes: cómo crear tu primera aplicación Docker ]]>
                </title>
                <description>
                    <![CDATA[ ¿Eres desarrollador y quieres empezar con Docker? Este artículo es para ti. Luego de una corta introducción sobre qué es Docker y por qué utilizarlo, podrás crear tu primera aplicación con Docker. ¿Qué es Docker? Docker [https://www.docker.com/] es un software gratuito desarrollado por Docker Inc. Se presentó al público general ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/guia-de-docker-para-principiantes-como-crear-tu-primera-aplicacion-docker/</link>
                <guid isPermaLink="false">62cbee84771a97081f0e31b1</guid>
                
                    <category>
                        <![CDATA[ docker ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ María Braeuner ]]>
                </dc:creator>
                <pubDate>Mon, 18 Jul 2022 03:39:17 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/07/docker_main.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/a-beginners-guide-to-docker-how-to-create-your-first-docker-application-cc03de9b639f/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">A beginner’s guide to Docker — how to create your first Docker application</a>
      </p><h4 id="-eres-desarrollador-y-quieres-empezar-con-docker-este-art-culo-es-para-ti-"><strong>¿Eres desarrollador y quieres empezar con Docker? Este artículo es para ti<strong>.</strong></strong></h4><p>Luego de una corta introducción sobre qué es Docker y por qué utilizarlo, podrás crear tu primera aplicación con Docker.</p><h4 id="-qu-es-docker"><strong>¿Qué es Docker?</strong></h4><p><a href="https://www.docker.com/" rel="noopener">Docker</a> es un software gratuito desarrollado por Docker Inc. Se presentó al público general el 13 de marzo del 2013 y desde entonces se ha convertido en un imprescindible en el mundo del desarrollo informático.</p><p>Le permite a los usuarios crear entornos independientes y aislados para desplegar sus aplicaciones. Estos entornos se denominan "contenedores".</p><p>Esto le permitirá al desarrollador ejecutar un contenedor en cualquier máquina.</p><p>Como puedes ver, con Docker ya no hay problemas de dependencia o compilación. Todo lo que tienes que hacer es lanzar tu contenedor y tu aplización se lanzará inmediatamente. </p><h4 id="pero-es-docker-una-m-quina-virtual"><strong>Pero, ¿es Docker una máquina virtual?</strong></h4><p>Esta es una de las preguntas más frecuentes sobre Docker. La respuesta es: en realidad, no del todo.</p><p>Puede parecer una máquina virtual al principio, pero la funcionalidad no es la misma. </p><p>A diferencia de Docker, una máquina virtual incluye un sistema operativo completo. Funcionará de forma independiente y actuará como un ordenador.</p><p>Docker solo compartirá los recursos de la máquina anfitriona para ejecutar sus entornos.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/11/Blog.-Are-containers-..VM-Image-1-1024x435.png" class="kg-image" alt="Blog.-Are-containers-..VM-Image-1-1024x435" width="600" height="400" loading="lazy"><figcaption>Docker VS Virtual machines (Copyright to <a href="https://blog.docker.com/2018/08/containers-replacing-virtual-machines/" rel="noopener" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">Docker blog</a>)</figcaption></figure><h4 id="-por-qu-utilizar-docker-como-desarrollador"><strong>¿Por qué utilizar Docker como desarrollador?</strong></h4><p>Esta herramienta realmente puede cambiar la vida diaria del desarrollador. Para responder esta pregunta de la mejor manera, he redactado una lista no exhaustiva de los beneficios que encontrará:</p><ul><li>Docker es rápido. A diferencia de una máquina virtual, tu aplicación puede iniciarse en pocos segundos y detenerse igual de rápido.</li><li>Docker es multi-plataforma. Puedes lanzar tu contenedor en cualquier sistema.</li><li>Los contenedores pueden construirse y destruirse más rápido que en una máquina virtual. </li><li>Se acabaron las dificultades para configurar tu entorno de trabajo. Una vez configurado tu Docker, no tendrás que volver a instalar tus dependencias manualmente. Si cambias de ordenador o si un empleado se incorpora a tu empresa, solo tendrás que darle tu configuración.</li><li>Mantendrás tu espacio de trabajo limpio, ya que cada uno de tus entornos estará aislado y podrás eliminarlo en cualquier momento sin que afecte al resto.</li><li>Será más fácil desplegar tu proyecto en tu servidor para ponerlo en línea.</li></ul><h3 id="ahora-vamos-a-crear-tu-primera-aplicaci-n"><strong>Ahora vamos a crear tu primera aplicación</strong></h3><p>Ahora que sabes lo que es Docker, ¡es momento de crear tu primera aplicación!</p><p>El propósito de este corto tutorial es crear un programa de Python que muestre una oración. Este programa deberá ser lanzado a través de un <em>Dockerfile.</em> </p><p>Verás que no es tan complicado una vez que entiendas el proceso. </p><blockquote>Nota: No necesitarás instalar Python en tu ordenador. Será el entorno Docker el que contenga Python para poder ejecutar tu código.</blockquote><h4 id="1-instala-docker-en-tu-m-quina"><strong><strong>1. Instal</strong>a<strong> Docker </strong>en tu máquina</strong></h4><p><em>Para <em>Ubuntu:</em></em></p><p>Primero, actualiza tus paquetes:</p><pre><code>$ sudo apt update</code></pre><p>Siguiente, instala Docker con apt-get:</p><pre><code>$ sudo apt install docker.io</code></pre><p>Finalmente, verifica que Docker se ha instalado correctamente:</p><pre><code>$ sudo docker run hello-world</code></pre><ul><li><em>Para<em> MacOSX:</em></em> puedes seguir <a href="https://docs.docker.com/docker-for-mac/install/" rel="noopener">este enlace</a>.</li><li><em>Para<em> Windows:</em></em> puedes seguir <a href="https://docs.docker.com/docker-for-windows/install/" rel="noopener">este enlace</a>.</li></ul><h4 id="2-crea-tu-proyecto"><strong><strong>2. Crea</strong> tu proyecto</strong></h4><p>Para crear tu primera aplicación Docker, te invito a crear una carpeta en tu computadora. Debe contener los siguientes dos archivos:</p><ul><li>Un archivo ‘<em><em>main.py</em></em>’ (un archivo python que tendrá el código a ejecutar).</li><li>Un archivo ‘<em><em>Dockerfile</em></em>’ (un archivo Docker que tendrá las instrucciones necesarias para crear el entorno).</li></ul><p>Normalmente, tendrías esta arquitectura de carpeta: </p><pre><code>.
├── Dockerfile
└── main.py
0 directories, 2 files</code></pre><h4 id="3-edita-el-archivo-python"><strong><strong>3. Edit</strong>a el archivo Python</strong></h4><p>Puedes agregar el siguiente código a tu archivo ‘<em><em>main.py</em></em>’:</p><pre><code class="language-python">#!/usr/bin/env python3

print("¡Docker es mágico!")</code></pre><p>Nada excepcional, pero una vez que veas en tu terminal "¡Docker es mágico!", sabrás que tu Docker está funcionando. </p><h4 id="3-edita-el-archivo-docker"><strong><strong>3. Edit</strong>a<strong> </strong>el archivo Docker</strong></h4><p>Un poco de teoría: lo primero que hay que hacer cuando quieres crear tu Dockerfile es preguntarte qué quieres hacer. Nuestro objetivo aquí es lanzar código Python. </p><p>Para ello, nuestro Docker debe contener todas las dependencias necesarias para lanzar Python. Un Linux (Ubuntu) con Python instalado en él debería ser suficiente.</p><p>El primer paso para crear un archivo Docker es acceder al sitio web <a href="https://hub.docker.com/" rel="noopener">DockerHub</a>. Este sitio contiene muchas imágenes prediseñadas para ahorrarte tiempo (por ejemplo: todas las imágenes para Linux o lenguajes de código). </p><p>En nuestro caso, escribiremos ‘Python’ en la barra de búsqueda. El primer resultado es la imagen oficial creada para ejecutar Python. Perfecto, ¡lo usaremos!</p><pre><code class="language-python"># Un archivo docker (dockerfile) comienza siempre importanto la imagen base. 
# Utilizamos la palabra clave 'FROM' para hacerlo.
# En nuestro ejemplo, queremos importar la imagen de python.
# Así que escribimos 'python' para el nombre de la imagen y 'latest' para la versión.
FROM python:latest

# Para lanzar nuestro código python, debemos importarlo a nuestra imagen.
# Utilizamos la palabra clave 'COPY' para hacerlo.
# El primer parámetro 'main.py' es el nombre del archivo en el host.
# El segundo parámetro '/' es la ruta donde poner el archivo en la imagen.
# Aquí ponemos el archivo en la carpeta raíz de la imagen. 
COPY main.py /

# Necesitamos definir el comando a lanzar cuando vayamos a ejecutar la imagen.
# Utilizamos la palabra clave 'CMD' para hacerlo.
# El siguiente comando ejecutará "python ./main.py".
CMD [ "python", "./main.py" ]</code></pre><h4 id="4-crea-la-imagen-docker"><strong><strong>4. Crea</strong> la imagen Docker</strong></h4><p>Una vez que tu código esté listo y el <em>Dockerfile</em> está escrito, todo lo que tienes que hacer es crear tu imagen para contener tu aplicación.</p><pre><code>$ docker build -t python-test . </code></pre><p>La opción ’<em><em>-t</em></em>’ te permite definir el nombre de tu imagen. En nuestro caso hemos elegido ’<em><em>python-test</em></em>’ pero le puedes poner lo que quieras. </p><h4 id="5-corre-la-imagen-docker"><strong><strong>5. </strong>Corre la imagen Docker</strong></h4><p>Una vez la imagen esté creada, tu código está listo para lanzar.</p><pre><code>$ docker run python-test</code></pre><p>Tienes que poner el nombre de tu imagen después de un ‘<em><em>docker run</em></em>’.</p><p>Ya está, eso es todo. Normalmente, deberías ver "¡Docker es mágico!", en tu terminal.</p><h3 id="el-c-digo-est-disponible"><strong>El código está disponible</strong></h3><p>Si quieres el código completo para encontrarlo fácilmente o ejecutarlo, lo he puesto a tu disposición en mi GitHub.</p><p><strong><strong>-&gt;</strong></strong> <a href="https://github.com/gael-thomas/Docker-First-Application-example">GitHub: Ejemplo de primera aplicación en Docker</a> </p><h3 id="comandos-tiles-para-docker"><strong>Comandos útiles para Docker</strong></h3><p>Antes de dejarte, he preparado una lista de comandos que te pueden ser útiles en Docker:</p><ul><li>Lista de imágenes</li></ul><pre><code>$ docker image ls</code></pre><ul><li>Elimina una imagen específica</li></ul><pre><code>$ docker image rm [nombre de la imagen]</code></pre><ul><li>Elimina todas las imágenes existentes</li></ul><pre><code>$ docker image rm $(docker images -a -q)</code></pre><ul><li>Lista todos los contenedores existentes (en funcionamiento y no en funcionamiento)</li></ul><pre><code>$ docker ps -a</code></pre><ul><li>Detener un contenedor específico</li></ul><pre><code>$ docker stop [nombre del contenedor]</code></pre><ul><li>Detener todos los contenedores en funcionamiento</li></ul><pre><code>$ docker stop $(docker ps -a -q)</code></pre><ul><li>Elimina un contenedor específico (solo si está detenido)</li></ul><pre><code>$ docker rm [nombre del contenedor]</code></pre><ul><li>Elimina todos los contenedores (solo si están detenidos)</li></ul><pre><code>$ docker rm $(docker ps -a -q)</code></pre><ul><li>Mostrar los registros de un contenedor</li></ul><pre><code>$ docker logs [nombre del contenedor]</code></pre><h2 id="conclusi-n"><strong><strong>Conclusi</strong>ón</strong></h2><p>Puedes consultar este artículo cada vez que necesites un ejemplo sencillo y concreto sobre cómo crear tu primera aplicación Docker. Si tienes alguna pregunta o comentario, no dudes en preguntar. </p><p>Si quieres más contenido como este, puedes seguirme en Twitter, donde tuiteo sobre desarrollo web, superación personal y mi viaje como desarrollador full stack. </p><p>Puedes encontrar otros artículos como este en mi website: <a href="https://www.freecodecamp.org/news/a-beginners-guide-to-docker-how-to-create-your-first-docker-application-cc03de9b639f/herewecode.io">herewecode.io</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como remover imágenes y contenedores en Docker ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original: How to Remove Images and Containers in Docker [https://www.freecodecamp.org/news/how-to-remove-images-in-docker/] Traducido y adaptado por: Sil Zubikarai [/espanol/news/author/sil/] Docker rmi docker rmi remueve imágenes por su  ID. Para remover la imagen, primero necesitas una lista de todas las imágenes para obtener las IDs de imagen, nombre de la imagen, y ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-remover-imagenes-y-contenedores-en-docker/</link>
                <guid isPermaLink="false">6294d419d7f32e088af5e30f</guid>
                
                    <category>
                        <![CDATA[ docker ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sil Zubikarai ]]>
                </dc:creator>
                <pubDate>Sat, 11 Jun 2022 17:47:52 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/06/5f9c9e04740569d1a4ca3ae5.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Artículo original</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong>:</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong> <a href="https://www.freecodecamp.org/news/how-to-remove-images-in-docker/"><strong>How to Remove Images and Containers in Docker</strong> </a></strong><br><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong><strong>Traducido y adaptado por</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong>:</strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong> </strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong></strong><a href="https://www.freecodecamp.org/espanol/news/author/sil/">Sil Zubikarai</a></p><h2 id="docker-rmi"><strong><strong><strong><strong>Docker rmi</strong></strong></strong></strong></h2><p><code>docker rmi</code> remueve imágenes por su &nbsp;ID.</p><p>Para remover la imagen, primero necesitas una lista de todas las imágenes para obtener las IDs de imagen, nombre de la imagen, y otros detalles. Ejecutando un simple comando <code>docker imagenes -a</code> &nbsp;o &nbsp;<code>docker imagenes</code>.</p><p>Después de eso asegúrate que imagen quieres remover, para hacer eso ejecuta este simple comando <code>docker rmi &lt;tu-imagen-id&gt;</code>. Luego puedes confirmar que la imagen se ha eliminado o no, enumerando todas las imágenes y verificando.</p><h3 id="eliminar-m-ltiples-im-genes"><strong>Eliminar múltiples imágenes</strong></h3><p>Hay una forma para eliminar más de una imagen al mismo tiempo, cuando quieras eliminar varias imágenes específicas. Entonces para hacer esto primero obtén los IDs de la imagen simplemente enlistando las imágenes y luego ejecutando el simple comando a continuación.</p><p><code>docker rmi &lt;tu-imagen-id&gt; &lt;tu-imagen-id&gt; ...</code></p><p>Escribe los IDs de la imagen en el comando seguido de los espacios entre ellos.</p><h3 id="elimina-todas-las-im-genes-de-una-vez-"><strong>Elimina todas las imágenes de una vez.</strong></h3><p>Para eliminar todas las imágenes hay un comando simple para hacer eso. <code>docker rmi $(docker imagenes -q)</code></p><p>En el comando de arriba, solo hay dos comandos, el primero se ejecuta en la &nbsp;<code>$()</code> es la sintaxis de shell y devuelve los resultados independientemente de lo que se ejecute en la sintaxis. Entonces en este <code>-q- es una opción para proporcionar al retunr las unicas IDs,</code> $() regresa los resultados del IDs de la imagen y luego <code>docker rmi</code> remueve todas las imágenes.</p><h2 id="docker-rm"><strong><strong><strong><strong>Docker rm</strong></strong></strong></strong></h2><p> <code>docker rm</code> remueve contenedores por su nombre o ID.</p><p> Cuando tienes contenedores Docker ejecutándose, primero necesitas detenerlos antes de borrarlos.</p><ul><li>Detén todos los contenedores ejecutándose: <code>docker stop $(docker ps -a -q)</code> </li><li>Elimina todos los contenedores detenidos: <code>docker rm $(docker ps -a -q)</code></li></ul><h3 id="eliminar-m-ltiples-contenedores"><strong><strong>Eliminar múltiples contenedores</strong></strong></h3><p>Puedes detener y eliminar múltiples contenedores pasando los comando una lista de los contenedores que quieres eliminar. La sintaxis shell <code>$()</code> regresa los resultados de cualquiera que es ejecutado dentro de los corchetes. Entonces puedes crear tu lista de contenedores dentro de estos para pasar a los comandos <code>stop</code> y <code>rm</code>.</p><h3 id="aqu-hay-un-desglose-de-docker-ps-a-q"><strong> Aquí hay un desglose de docker ps -a -q</strong></h3><ul><li><code>docker ps</code> &nbsp;lista de contenedores</li><li><code>-a</code> &nbsp;la opción para enlistar todos los contenedores, inclusive los detenidos. Sin esto, de forma predeterminada solo se numeran los contenedores en ejecución.</li><li><code>-q</code> la opción silenciosa para proporcionar solo el Id del contenedor, en lugar de toda la tabla de información sobre los contenedores.</li></ul> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
