(Para crear aplicaciones multicontenedor) Docker compose sirve para que varios contenedores funcionen entre sí (por ejemplo un servidor con una base de datos) de una manera simplificada en un único archivo de texto, sin necesidad de hacer todo el proceso largo.
Para crear todo esto se hace con Docker compose app.
Para su instalación:
sudo apt install docker-compose
Y comprobamos que se haya instalado correctamente:
Lo primero será crear una carpeta para tener organizado todo lo del docker compose:
Dentro de la carpeta, el archivo que debemos de crear para utilizar Docker compose tiene extensión yml:
Y esta sería la estructura básica de un docker compose:
Para empezar a ejecutar contenedores en compose, debemos primero especificar la imagen de docker compose. Para ello vamos al navegador y ponemos docker compose versión para conocerla, en este caso estamos en la versión 3:
Después, ponemos esta versión en el archivo yml que creamos antes:
IMPORTANTE: Aquí no se puede usar el tabulador, sólo espacios, sino dará error.
Vamos a crear con docker-compose un contenedor de Jenkins por ejemplo:
Y una vez guardado este archivo, si lo queremos ejecutar para que se creen los contenedores, podemos usar el comando docker-compose up -d:
Ahora como podremos ver, ya tenemos el contenedor creado:
Y ahora si accedemos al puerto 8080 del localhost veremos como funciona correctamente:
Si queremos eliminar este docker compose debemos utilizar el comando docker-compose down, de esta manera se eliminará todo a la vez, el contenedor y el servicio:
Básicamente se elimina todo lo relacionado con el contenedor, por ejemplo si hacemos un docker ps -a vemos como el contenedor fue eliminado:
Lo primero será crear por ejemplo un contenedor de mysql introduciendo una variable de entorno dentro del contenedor que será MYSQL_ROOT_PASSWORD=123123, la cual servirá para autenticarnos después para acceder a la base de datos:
Ahora guardamos el archivo y levantamos el contenedor con el comando docker-compose up -d:
Y ahora si entramos dentro de la base de datos con la terminal bash podremos ver que dentro de las variables de entorno que tiene este contenedor, entre ellas está la que acabamos de introducir:
Ahora ya podemos acceder a la base de datos, aunque primero debemos conocer la IP de este contenedor, para ello hacemos un docker inspect a este contenedor y sacamos la IP:
Y ahora ya podremos acceder a la base de datos creada con docker-compose:
Otra opción que también tenemos para introducir variables de entorno es creando un archivo con extensión .env donde se recojan todas las variables de entorno que queramos introducir, lo cual es útil si queremos introducir muchas variables a la vez:
Por ejemplo voy a introducir dos variables dentro del archivo texto.env creado anteriormente, primero la variable de MySQL y luego otra hecha por mí muy simple:
Ahora debemos indicar en el archivo yml que lea directamente las variables del archivo que hemos creado(el archivo texto.yml), para ello lo hago con env_file.
Después de guardar lo anterior y levantar el contenedor con docker-compose up, ya podremos acceder a las variables de entorno de este contenedor y veremos como se leyeron ambas variables dentro del archivo texto.env:
Para crear un contenedor en docker compose, primero debo escribir el nombre del volumen y después en otra línea especificarlo con el directorio donde se va a configurar dicho volumen dentro del contenedor:
Y ahora montamos el contenedor con docker compose:
Y ahora si entramos dentro de las configuraciones de docker, podemos acceder a la parte de los volúmenes, donde veremos que está creado el volumen:
Ahora entramos dentro de la carpeta docker-compose-vol2 y luego dentro de data:
En este punto puedo crear archivos y luego en el contenedor volverán a estar dentro del directorio /home que configuramos antes con docker-compose:
Y ahora entramos en el contenedor al directorio home y veremos como existe el documento que acabamos de crear:
Ahora si queremos eliminar el volumen, hay que tener en cuenta que con el comando docker-compose down no será suficiente, por tanto, si volvemos a levantar el contenedor, se volverá a coger el mismo volumen.
Otra forma de compartir archivos es especificando en docker-compose que se haga un reflejo de una carpeta de nuestro equipo anfitrión con el ordenador, por ejemplo todo lo que esté dentro del directorio donde estoy trabajando se replique en el directorio /home dentro del contenedor. Este tipo de volumen se conoce como volumen de host.
Lo haríamos de esta manera, en la parte de volumes indicamos que lo que esté dentro de la carpeta docker-compose se replique en el directorio home de dentro del contenedor:
Y ahora si accedemos dentro del contenedor veremos como están dentro estos archivos:
En primer lugar, vamos a crear una red con docker compose:
Después montamos el contenedor:
Y si hacemos un docker inspect podemos ver como este contenedor ya tiene asignada una red:
Para eso lo hacemos dentro del archivo docker-compose.yml duplicando la parte donde creamos y configuramos los contenedores:
Y ahora al montarlo con docker-compose podremos ver cómo se crean los dos contenedores dentro de la misma red:
Y ahora si inspeccionamos los dos contenedores, veremos como los dos se encuentran dentro de la misma red:
Por ejemplo, creamos la base de datos postgres con un contenedor adminer que será lo que gestione la base de datos.
Ahora ejecutamos con docker-compose up y ya tendremos levantado dos contenedores de la base de datos con su administrador:
Si iniciamos sesión con las credenciales que configuramos en Docker-compose podremos acceder a la base de datos:
Debemos crear un Dockerfile dentro de nuestro directorio, para hacerlo más simple voy a crear una carpeta llamada build y lo haré todo desde dicha carpeta:
Ahora si quiero crear una imagen con docker compose debo crear el fichero .yml dando la orden build y un punto, para que encuentre un Dockerfile y construya la imagen:
Y después creamos el Dockerfile, que lo haré con una imagen de centos y con una carpeta llamada prueba creada dentro del directorio /home:
Ejecutamos con docker-compose build:
Y ahora si comprobamos nuestras imágenes, veremos como tenemos una que se llama compose_prueba:
Por ejemplo para limitar el uso de memoria y cpu lo hago de la siguiente manera: