En este ejemplo vamos a instalar un contenedor con una imagen de Nginx. Es importante conceptualizar que un contenedor es una instancia de una imagen corriendo como un proceso, de forma que lo que tendremos es un proceso en nuestro sistema operativo ejecutado por Docker que nos proveerá todas las funcionalidades de Nginx. Esto quiere decir que podemos tener un numero indefinido de contenedores corriendo la misma imagen. Por ejemplo, podemos tener tres contenedores corriendo simultáneamente una imagen de Nginx en puertos distintos e independientes entre si. Como símil podemos entender las imagenes como .isos de una máquina virtual (elementos estáticos) y los contenedores como una instancia concreta de esa imagen corriendo como un proceso independiente de nuestro Sistema Operativo.
Vamos a gestionar poco a poco un contendor para ver las opciones básicas que tenemos y levantar un servicio nginx en medio minuto.
Vamos a ver qué implican las acciones marcadas con los numeros.
- Decimos a docker que cree un contenedor con la imagen llamada nginx y que sea accesible a traves del puerto 80 del host (veremos más adelante esto ultimo).
- Docker nos dice que el puerto 80 está ya ocupado en el host.
- Paramos el servicio que ocupa el puerto 80 previamente en nuestro host.
- Listamos las imágenes en el registro local (la descargamos en un inicio del registro en internet o docker hub).
- En las siguientes ordenes experimentamos con el modo attached. El modo attached es resumidamente, un modo mediante el cual la consola está vinculada al proceso, y podemos ver en tiempo real sus logs. Una vez salimos del modo attached mediante Ctrl+C, el proceso/contenedor se destruye.
- Si queremos llevar a un segundo plano la ejecucion del proceso, tenemos que añadir el argumento detach al comando.
Si recuerdas, al comando docker container run le hemos añadido un argumento publish. Este argumento es esencial para comunicarnos con el contenedor desde el host. Comunica el puerto 80 del container con el puerto 80 del host de forma que cualquier peticion al puerto 80 del host se derivará al puerto 80 del contenedor. La sintaxis del argumento es publish hostport:containerport. Nota: Puedes ver más en detalle como funciona la publicación de puertos entendiendo Docker Network.
Además podemos modificar el nombre del contenedor que se va a ejecutar. Por defecto Docker nos pone nombres aleatorios graciosos, pero podemos forzar un nombre con el argumento name. Otra funcionalidad con la que podemos experimentar es la de las versiones de las imagenes que descargamos. Por defecto Docker si no tenemos una imagen concreta, nos descargará la ultima versión, pero podemos variar esto haciendo explicita esta característica. Veamos todos estos comandos juntos para ver como trabajan.
Podemos ver como en el primer comando seteamos unos determinados argumentos, tales como el nombre del contenedor, la versión de la imagen de nginx, el y el modo detach.
En este caso concreto, las peticiones al puerto 81 del host irían al puerto 80 del container que es donde escucha nginx por defecto. Cuando listamos tanto las imágenes como los contenedores en ejecución podemos ver todos los atributos y cómo cambian rgacias al seteo de los argumentos.
Hasta ahora solo hemos puesto un contenedor en marcha, pero como ya hemos dicho anteiriormente, desde una imagen podemos instanciar varios contenedores. Veamos tres contenedores de nginx corriendo comunicandose con el host a traves de los puertos 80, 81 y 82.
Ahora si quisiéramos borrar los contenedores de prueba solo tendríamos que usar un sencillo comando: docker container rm -f