1

Cómo desplegar contenedores en Docker

3287Puntos

hace 8 años

Al crear una imagen en Docker, podemos lanzar un contenedor a partir de ella. Esto requiere de un comando específico para el despliegue. Este se puede escribir de muchas formas y se pueden obtener diferentes resultados dependiendo de las necesidades del servicio. Por ejemplo, configurar correctamente un puerto entre el local host y el contenedor. Ahora les voy a explicar las partes esenciales de este comando para que tengan una idea del alcance que puede tener un contenedor de Docker. En el artículo anterior les expliqué cómo compilar una imagen a partir de un Dockerfile; ahora se supone que ya estamos listos;* el siguiente paso es lanzar el contenedor a partir de la imagen*. De la misma forma voy a tomar como ejemplo el repo de dockerfiles de GitHub para que lo usen como guía.

run

Docker identifica que se está a punto de lanzar un contenedor al encontrar el comando run en su sintaxis.

# docker run …

Todo lo que se encuentre a la derecha de run nos servirá para pasar una configuración específica y así manipular el comportamiento de nuestros contenedores.

- -rm

Nos permite eliminar el contenedor que se está corriendo al terminar su ejecución. Esto nos sirve, por ejemplo, para usar un programa que sólo está en el contenedor y ejecutar una acción dentro. En el caso de Node, podría instalar las dependencias de npm en mi aplicación y eliminar este contenedor.

- -name

Para identificar nuestro contenedor es bueno ponerle un nombre. Este flag es para esto; sin embargo, si no pones un nombre, Docker se encargará de hacerlo por ti. Otra forma de identificar un contenedor es por un ID único que asigna Docker.

-d

Le dice al contenedor que siga corriendo por debajo después de terminar la ejecución del comando en el lanzamiento. Si no lo usas, no seguirá corriendo y te tocará inicializarlo al terminar.

-it

Abre un canal interactivo con el contenedor, una terminal.

-p

Este comando nos sirve para asignar puertos entre el locar y el contenedor, o entre contenedores.

-p 8080:8080-p 8080

Si se fijan, hay dos formas de especificar esta parte del comando. En el primero, a la izquierda, se encuentra el puerto del localhost y a la derecha el del contenedor. Si no especifican el del localhost entonces Docker específica el que quiera y ustedes tendrán que ver cuál usan. Otra cosa es que si, por ejemplo, tienen un contenedor de Node que expone su puerto al contenedor de Nginx en el enlace, entonces no necesitan especificar el puerto al localhost al momento de lanzar nodejs. Estpo porque el contenedor que expone el puerto 80 al localhost es el de nginx. Para exponer el puerto de Nodejs al de Nginx por debajo, lo hacemos en Dockerfile, y entre contenedores se toman los puertos tal cual como si fuera el mismo host.

- -privileged

Por defecto, los contenedores no tienen privilegios de acceso al dispositivo y de escritura en cierto tipo de carpetas. En el caso de las carpetas del host, esto le da permisos al contenedor como si fuera el localhost.

-v

Un volumen es un directorio, puede ser de otro contenedor o puede ser del localhost. Esto nos permite compartir directorios en el contenedor, podemos tener la aplicación en el localhost y compartirla hacia el contenedor.

-v /opt/dockerfiles/nodejs/app/:/opt/nodejs/-v /var/lib/mysql

En el ejemplo, el primero comparte el directorio local /opt/dockerfiles/nodejs/app/ con el directorio del contenedor /opt/nodejs/, entonces lo que hay en app se verá igual en Node.js. En el segundo, lo que pasará es que todo lo que se guarde en mysql quedará en el contenedor volumen. Esto sirve mucho para separar los datos guardados del motor de base de datos en dos contenedores, uno de volumen y otro de motor.

- -link

Esto nos permite enlazar un contenedor con otro.

--link nodejs:nodejs

Para continuar con el ejemplo, vamos a enlazar el contenedor de Nginx con el de Node.js. Al contenedor en el local le ponemos como nombre nodejs y del lado derecho hacemos lo mismo. A la izquierda debe tener el nombre del contenedor de node para que lo encuentre; pero a a la derecha puede tener cualquier nombre. Un beneficio de ponerle nombre a la derecha, es que en Nginx reconocerá ese nombre como el nombre del host de Node.js. Algo así como en local es localhost en el contenedor será nodejs para hacer referencia a este contenedor.

Imagen base para crear el contenedor

Ya casi tenemos todo para correr nuestro comando, falta decirle qué imagen quiero usar como base para lanzar el contenedor. Voy a especificarle el que creamos en el artículo anterior.

/nginx

Recuerden que en el paso anterior en username ponemos nuestro nombre de usuario.

Comando de inicio

Para terminar, está el comando de inicio. Este nos permite ejecutar un comando al iniciar en el contenedor. Generalmente uso /bin/bash ya que lanza una terminal bash al iniciar docker. En el artículo anterior les explique que el comando CMD escribe el comando de inicio pero la forma de reescribirlo es esta: al final del comando escribes el comando de arranque.

Para terminal

Miren estos dos comandos que corren Nodejs y Nginx en modo producción. Primero es Node.js

# docker run --name nodejs -d --privileged=true -v /opt/dockerfiles/nodejs/app/:/opt/nodejs/ /nodejs

Luego es Nginx

#dockerrun-d--name=nginx-p80:80--linknodejs:nodejs/nginx

Sigan estos pasos y creen entornos increíbles usando Docker. Si quieres saber más acerca de cómo agilizar flujos de trabajo con Docker en tus proyectos, regístrate hoy mismo al curso en Platzi. ¡Pronto inician las clases! Entrar a Platzi Comunidad

Diego
Diego
DiegoUG

3287Puntos

hace 8 años

Todas sus entradas
Escribe tu comentario
+ 2