Solución:
Dockerfile
Un Dockerfile es un archivo de texto simple que contiene los comandos que un usuario puede llamar para ensamblar una imagen.
Ejemplo, Dockerfile
FROM ubuntu:latest
MAINTAINER john doe
RUN apt-get update
RUN apt-get install -y python python-pip wget
RUN pip install Flask
ADD hello.py /home/hello.py
WORKDIR /home
Docker Compose
Docker Compose
-
es una herramienta para definir y ejecutar aplicaciones Docker de varios contenedores.
-
definir los servicios que componen su aplicación en
docker-compose.yml
para que puedan ejecutarse juntos en un entorno aislado. -
hacer que una aplicación se ejecute en un comando con solo ejecutar
docker-compose up
Ejemplo, docker-compose.yml
version: "3"
services:
web:
build: .
ports:
- '5000:5000'
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
La respuesta es ninguna.
Docker Compose (en lo sucesivo, compose) utilizará el Dockerfile si agrega el comando de compilación al docker-compose.yml
.
Su flujo de trabajo de Docker debe ser construir un Dockerfile
para cada imagen que desee crear, luego use componer para ensamblar las imágenes usando el build
mando.
Puede especificar la ruta a sus Dockerfiles individuales usando build /path/to/dockerfiles/blah
dónde /path/to/dockerfiles/blah
es donde está bla Dockerfile
vidas.
docker-compose existe para 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 algún tipo de red.
El propósito de docker-compose es funcionar como docker cli pero emitir múltiples comandos mucho más rápidamente.
Para hacer uso de docker-compose, debe codificar los comandos que estaba ejecutando antes en un docker-compose.yml
expediente.
No solo los copiará y los pegará en el archivo yaml, hay una sintaxis especial.
Una vez creado, debe alimentarlo al docker-compose cli y dependerá del cli analizar el archivo y crear todos los contenedores diferentes con la configuración correcta que especifiquemos.
Entonces tendrá contenedores separados, digamos, uno es redis-server
y el segundo es node-app
y desea que se cree con el Dockerfile
en su directorio actual.
Además, después de crear ese contenedor, mapearía algún puerto del contenedor a la máquina local para acceder a todo lo que se ejecuta dentro de él.
Entonces para tu docker-compose.yml
file, querría comenzar la primera línea así:
version: '3'
Eso le dice a Docker la versión de docker-compose
desea utilizar. Después de eso, debes agregar:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
Tenga en cuenta la sangría, muy importante. Además, notifique que para un servicio estoy tomando una imagen, pero para otro servicio estoy diciendo docker-compose
para mirar 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 que el guión, un guión en un archivo yaml es la forma en que especificamos una matriz. En este ejemplo, estoy mapeando 8081
en mi máquina local para 8081
en el contenedor así:
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 confusiones como esta:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "4001:8081"
Desarrollando tu docker-compose.yml
archivo como este, creará estos contenedores esencialmente en la misma red y tendrán acceso libre para comunicarse entre sí de la forma que deseen e intercambiar tanta información como deseen.
Cuando los dos contenedores se crean usando docker-compose
, no necesitamos ninguna declaración de puerto.
Ahora, en mi ejemplo, necesitamos realizar una configuración de código en la aplicación Nodejs que se parece a esto:
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server'
});
Utilizo este ejemplo anterior para que sepa que puede haber alguna configuración específica que tendría que hacer además de la 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, debes asegurarte de conocer el puerto predeterminado que usa Nodejs, 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
solo contiene esto:
FROM node:alpine
WORKDIR '/app'
COPY /package.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
Entonces, mientras que antes tendrías que correr 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.
Antes docker-compose.yml
, tuvimos 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, escribe docker-compose up --build
. Eso le dice a Docker que vuelva a iniciar los contenedores, pero que los reconstruya para obtener los últimos cambios.
Entonces docker-compose
facilita el trabajo con varios contenedores. La próxima vez que necesite iniciar este grupo de contenedores en segundo plano, puede hacer docker-compose up -d
; y para detenerlos, puedes hacer docker-compose down
.