¿Qué hace Docker y cuándo debería utilizarlo?

Contenidos

Docker es una herramienta para ejecutar sus aplicaciones dentro de contenedores. Los contenedores empaquetan todas las dependencias y el código que su aplicación necesita para ejecutarse en un solo archivo, que se ejecutará de la misma manera en cualquier máquina.

¿Qué es Docker?

Docker es semejante en concepto a las máquinas virtuales, excepto que es mucho más liviano. En lugar de ejecutar un sistema operativo totalmente separado (que es una sobrecarga masiva), Docker ejecuta contenedores, que usan el mismo sistema operativo host y solo virtualizan a nivel de software.

Docker Engine se ejecuta en Linux, Windows y macOS, y es compatible con Linux y Windows para contenedores de Docker. El sabor exacto de Linux en realidad no importa; la mayoría de las versiones de Linux ejecutarán el mismo kernel y solo se diferenciarán en el software del usuario. Docker puede instalar este software de usuario en el contenedor, lo que le posibilita ejecutar un contenedor CentOS en Ubuntu. A pesar de esto, no podría, a modo de ejemplo, ejecutar FreeBSD en Ubuntu, puesto que los núcleos son diferentes.

La imagen del contenedor de Docker incluye solo lo que su aplicación necesita para ejecutarse. Si su aplicación hace uso de nginx y Node.js, la imagen del contenedor los incluirá, pero no tendrá la carga de todas las demás aplicaciones de usuario que de forma general encontrará en Linux.

RELACIONADO: Cómo instalar Docker y Docker Compose en Linux

¿Por qué es tan útil Docker?

Docker toma el mismo tipo de control de versiones y empaquetado que proporcionan herramientas como Git y NPM y le posibilita usarlo para el software de su servidor. Dado que su contenedor es una sola imagen, hace que sea muy fácil realizar un seguimiento de las diferentes versiones de su contenedor. Y como todo está contenido, la administración de todas sus dependencias es mucho más sencilla.

Con Docker, su entorno de desarrollo será exactamente el mismo que su entorno de producción, y exactamente el mismo que el entorno de desarrollo de todos los demás, aliviando el problema de «¡está roto en mi máquina!»

Si quisiera agregar otro servidor a su clúster, no tendría que preocuparse por reconfigurar ese servidor y reinstalar todas las dependencias que necesita. Una vez que crea un contenedor, puede compartir el archivo del contenedor con cualquier persona, y ellos podrían tener su aplicación en funcionamiento fácilmente con unos pocos comandos. Docker facilita la ejecución de varios servidores, especialmente con motores de orquestación como Kubernetes y Enjambre de Docker.

Docker además le posibilita organizar su código para implementarlo en nuevos servicios. Supongamos que tiene un servidor web que está usando para su aplicación. Es probable que tenga muchas cosas instaladas en ese servidor, tenga un servidor web nginx para alojar contenido estático, probablemente tenga una base de datos para guardar algunas cosas en el backend, tal vez tenga un servidor API ejecutándose en Express. js además. Idealmente, los dividiría en aplicaciones separadas para ejecutarlas en servidores separados, pero el desarrollo puede ser complicado.

Docker ayuda a limpiar esto; puede empaquetar su servidor web y ejecutarlo con un contenedor nginx, puede empaquetar su servidor API y ejecutarlo con un contenedor Node.js, y puede empaquetar su base de datos y ejecutarla en su propio contenedor (aún cuando eso es tal vez no es la mejor idea, pero es factible). Puede tomar estos tres contenedores Docker y ejecutarlos todos en la misma máquina. Si necesita cambiar de servidor, es tan simple como migrar esos contenedores a un nuevo servidor. Si necesita escalar, puede mover uno de esos contenedores a un nuevo servidor o implementarlo en un clúster de servidores.

Docker además puede ahorrarle dinero si desea ejecutar varias aplicaciones en un solo VPS. Si cada aplicación tiene dependencias diferentes, es muy fácil que su servidor se desordene, como un plato de cena de Acción de Gracias con todo mezclado. Con Docker, puede ejecutar varios contenedores separados con, a modo de ejemplo, versiones separadas de PHP, como una bandeja de almuerzo de la escuela secundaria con todo separado.

¿Cómo se utiliza Docker?

En producción, hay muchos servicios para alojar contenedores Docker, que incluyen AWS ECS, Instancias de contenedor de Azure, Gotitas de DigitalOcean Docker, y muchos otros. Si su proveedor no ofrece hosting Docker administrado, siempre puede instalarlo usted mismo en su VPS.

En desarrollo, los contenedores de Docker son sencillas de ejecutar y solo requieren unos pocos comandos. Para comenzar, deberá instalar el motor Docker en su sistema operativo host. Para Windows y macOS, puede utilizar Escritorio Docker, pero para Linux, deberá instalar la edición de la comunidad Docker desde su administrador de paquetes. Para distribuciones sustentadas en Debian como Ubuntu, eso sería:

sudo apt-get install docker

Con cualquiera de los métodos de instalación, ahora debería tener acceso a Docker desde la línea de comandos. Para verificar que funciona, puede ejecutar:

docker run hello-world

Docker debería extraer esta imagen del tutorial del Docker Hub, un repositorio en línea de muchas imágenes de contenedores útiles. Puede utilizar muchas de estas imágenes como base para instalar sus aplicaciones.

Creemos un servidor web simple basado en nginx. Nginx proporciona una construcción sobre Docker Hub que podemos usar como punto de partida. Cree un nuevo directorio para guardar los archivos y ábralo:

mkdir ~/dockertest && cd ~/dockertest

Cualquier cambio realizado en la imagen base de nginx lo haremos con un Dockerfile. Los Dockerfiles son como archivos MAKE para contenedores, definen qué comandos ejecutar cuando Docker crea la nueva imagen con sus cambios. El Dockerfile simplemente se llama Dockerfile, sin extensión. Crea este archivo con touch Dockerfiley ábralo en un editor de texto. Pega esto en:

FROM nginx
COPY html /usr/share/nginx/html

La primera línea es un comando de Docker que le dice a Docker que base esta imagen en la imagen nginx del Hub. La segunda línea es otro comando que copia un directorio de esta carpeta local (~/dockertest/html) en la imagen de Docker, en esta circunstancia reemplazando la carpeta HTML por nginx.

Puede ejecutar muchos comandos en Dockerfiles. A modo de ejemplo, si su aplicación necesita instalar dependencias, puede hacer algo como RUN cd src/ && npm install. Todo lo que su aplicación necesita para iniciar su instalación y comenzar a funcionar se establece en el Dockerfile.

En realidad, no hemos hecho el ./html directorio aún, por lo tanto adelante y ejecute:

mkdir html && touch html/index.html

Crear el directorio y la entrada HTML. Abierto index.html y pegue un poco de HTML ficticio:

<!DOCTYPE html>
<html>
<body>
Hello From nginx, inside Docker! Inside, your computer?
</body>
</html>

Ahora estamos listos para cocinar nuestra imagen. Asegúrese de estar en la raíz del proyecto (en ~/dockertest, no en el html carpeta) y ejecutar:

docker build -t dockertest .

El punto al final significa que usaremos el directorio actual como punto de partida. Docker debería hallar el Dockerfile y ponerse a trabajar. A pesar de esto, solo debería tomar unos segundos, y cuando esté listo, puede ejecutarlo con:

docker run --name DockerTest -p 8080:80 -d dockertest

Esto iniciará un nuevo contenedor llamado DockerTest, usando la imagen «dockertest» que creamos. los -p flag vincula un puerto local a un puerto dentro del contenedor, en esta circunstancia vincula el puerto HTTP predeterminado de nginx (puerto 80) al puerto 8080 en su máquina local. Abrir localhost:8080 en su navegador web, y debería ver nginx ejecutándose.

Si desea una configuración adicional, puede editar los archivos de configuración de nginx incluyendo COPY nginx.conf /etc/nginx/nginx.conf y escribiendo su propio archivo de configuración. Esto es más difícil de configurar que editar el archivo de configuración de forma directa, puesto que tendrá que reconstruir la imagen en cada edición. Pero para el beneficio adicional de poder tomar el mismo contenedor que utiliza en desarrollo e implementarlo en producción, es una compensación bastante justa.

Si desea un tutorial más detallado sobre redes, implementación y contenedorización de aplicaciones existentes, le sugerimos leyendo esta guía.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.