docker-compose existe para evitar que tengas que escribir una tonelada de comandos que tendrías que hacer con docker-cli.
docker-compose también facilita el inicio de varios contenedores al mismo tiempo y los conecta automáticamente con alguna forma de red.
El propósito de docker-compose es funcionar como docker cli pero emitir múltiples comandos mucho más rápido.
Para utilizar Docker-compose, debe codificar los comandos que estaba ejecutando antes en un docker-compose.yml
archivo.
No solo va a copiar pegarlos en el archivo yaml, hay una sintaxis especial.
Una vez creado, debe alimentarlo al cli docker-compose y dependerá del cli analizar el archivo y crear todos los diferentes contenedores con la configuración correcta que especifiquemos.
Por lo tanto, tendrá contenedores separados, digamos, por ejemplo, uno es redis-server
y el segundo es node-app
y desea que se cree usando el Dockerfile
en su directorio actual.
Además, después de hacer ese contenedor, debería asignar algún puerto desde el contenedor a la máquina local para acceder a todo lo que se ejecuta dentro de él.
Entonces, para su docker-compose.yml
archivo, querrá comenzar la primera línea de esta manera:
version: '3'
Eso le dice a Docker la versión docker-compose
que quieres usar. Después de eso tienes que agregar:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
Tenga en cuenta la sangría, muy importante. Además, observe que para un servicio estoy tomando una imagen, pero para otro servicio le digo docker-compose
que mire dentro del directorio actual para construir la imagen que se usará para el segundo contenedor.
Luego, desea especificar todos los puertos diferentes que desea abrir en este contenedor.
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
-
Tenga en cuenta el guión, un guión en un archivo yaml es cómo especificamos una matriz. En este ejemplo, estoy mapeando 8081
en mi máquina local 8081
en el contenedor de esta manera:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "8081:8081"
Entonces, el primer puerto es su máquina local, y el otro es el puerto en el contenedor, también puede distinguir entre los dos para evitar confusión de la siguiente manera:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "4001:8081"
Al desarrollar un docker-compose.yml
archivo como este, creará estos contenedores esencialmente en la misma red y tendrán acceso gratuito para comunicarse entre ellos de la forma que deseen e intercambiar la información que deseen.
Cuando los dos contenedores se crean usando docker-compose
no necesitamos ninguna declaración de puerto.
Ahora, en mi ejemplo, necesitamos hacer una configuración de código en la aplicación Nodejs que se vea así:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server'
});
Utilizo este ejemplo anterior para hacerle saber que puede haber alguna configuración específica que tendría que hacer además del docker-compose.yml
archivo que puede ser específico para su proyecto.
Ahora, si alguna vez te encuentras trabajando con una aplicación Nodejs y redis, quieres asegurarte de que conoces el puerto predeterminado que Nodejs usa, así que agregaré esto:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server',
port: 6379
});
Entonces, Docker verá que la aplicación Node está buscando redis-server
y redirigirá esa conexión a este contenedor en ejecución.
Todo el tiempo, el Dockerfile
único contiene esto:
FROM node:alpine
WORKDIR '/app'
COPY /package.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
Entonces, mientras que antes tendría que ejecutar docker run myimage
para crear una instancia de todos los contenedores o servicios dentro del archivo, puede ejecutar, docker-compose up
y no tiene que especificar una imagen porque Docker buscará en el directorio de trabajo actual y buscará un docker-compose.yml
archivo dentro de allí.
Antes docker-compose.yml
, teníamos que lidiar con dos comandos separados de docker build .
y docker run myimage
, pero en el docker-compose
mundo si quieres reconstruir tus imágenes, escribes docker-compose up --build
. Eso le dice a Docker que vuelva a iniciar los contenedores pero que lo reconstruya para obtener los últimos cambios.
Por docker-compose
lo tanto, es más fácil trabajar con múltiples contenedores. La próxima vez que necesite iniciar este grupo de contenedores en segundo plano puede hacerlo docker-compose up -d
y detenerlos puede hacerlo docker-compose down
.