- Una manera de empaquetar las aplicaciones con todas las dependencias y configuraciones necesarias.
- Artefacto portable, fácil de compartir y mover.
- Hace el desarrollo y lanzamiento más eficiente.
Los contenedores se alojan en “Repositorios de contenedores” que pueden ser públicos o privados. Ver Docker Hub.
- Ambiente encapsulado.
- Empaquetados con la configuración necesaria.
- Un solo comando para instalar la aplicación.
- Imagen: El paquete actual, no en ejecución
- Contenedor: La aplicación lanzada, en ejecución
Un contenedor es el ambiente ejecutado por una imagen Los contenedores tienen:
- Sistema de archivos virtual
- Puertos enlazados
- Ejecutar un contenedor
docker run postgres:9.6 #Si la imagen no se encuentra localmente la descarga #El comando descargara todas las capas necesitarias
- Ver los contenedores que están corriendo.
docker ps
- Podemos correr una versión más actual de postgres
docker run postgres:10.10 #Tarda menos porque tiene que descargar menos capas.
A nivel de sistema operativo se tienen las siguientes capas.
En cambio, docker y una máquina virtual, virtualizan lo siguiente:
Por lo tanto, las diferencias son:
- Docker es muchísimo más ligero.
- Docker es más rápido.
- Compatibilidad, con las VMs se pueden correr todas las aplicaciones, sin embargo, no es lo mismo con docker.
Los más importante a considerar es que si se esta usando para Windows o Mac se debe checar la compatibilidad en la documentación oficial de docker.
Para windows, se deben tener en cuenta que:
- Docker solo corre nativamente con windows 10
- Si nuestra máquina con windows no es compatible, podemos usar Docker toolbox
- Es importante que la computadora soporte virtualización
# Descargar una imagen
docker pull redis
# Ver las imagenes existentes
docker images
# Crearemos un contenedor de redis para iniciar redis
docker run redis
# Podemos ver los contenedores ejecutandose
docker ps
# Podemos ejecutar los contendores en forma "detach"
docker -d redis
# Detener un contendor
docker stop <id>
# Mostrar los contenedores que esten o NO corriendo
docker ps -a
# Iniciar un contenedor previamente detenido
docker start <id>
# Combina docker pull y docker start
docker run redis:4.0
# Para no tener conflictos debemos enlazar los contenedores
# a puertos diferentes en nuestra máquina host.
docker run -p <host-port>:<container-port> redis
docker run -p 6000:6379 redis
docker run -p 6001:6379 redis
# Ver los logs
docker logs <id>
docker logs <name>
# Crear contenedor con nombre
docker run -d -p6000:6379 --name redis-latest redis
docker run -d -p6001:6379 --name redis-older redis:4.0
# Obtener la terminal del contenedor.
# -it := interactive
docker exec -it <id|name> /bin/bash
docker run
crea el contenedor, docker start
vuelve a empezar un contenedor previamente creado con run
Docker crear su propia red aislada. Los contenedores se pueden comunicar entre ellos.
# Mostrar las redes disponibles en docker
docker network ls
# Crear una nueva red para nuestra aplicación
docker network create mongo-network
docker pull mongo
docker pull mongo-express
No olvidar crear la red.
# Creación del contenedor para mongodb
docker run -p27017:27017 -d \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=password \
--name mongodb \
--network mongo-network \
mongo
docker logs <id>
# Creación del contenedor para mongo-express
docker run -d \
-p 8081:8081 \
-e ME_CONFIG_MONGODB_ADMINUSERNAME=admin \
-e ME_CONFIG_MONGODB_ADMINPASSWORD=password \
--net mongo-network \
--name mongo-express
-e ME_CONFIG_MONGODB_SERVER=mongodb \
mongo-express
docker logs <id> -f
Docker compose crea una red común de forma automática.
Se crea a tráves de un archivo yaml
, se debe tener cuidado con la implementación
# Iniciamos los contenedores del archivo de docker compose
docker-compose -f mongo.yaml up
docker network ls
No hay persistencia de datos en los contenedores
Estamos listo para desplagar nuestra aplicación. Ahora podemos crear nuestra propia imagen.
Dockerfile
es un blueprint (plano o template) que nos permitirá crear nuestra imagen con sus configuraciones.
#Dockerfile
FROM node
ENV MONGO_DB_USERNAME=admin\
MONGO_INITDB_ROOT_PWD=password
RUN mkdir -p /home/app #Cualquier comando de linux (se ejecuta en el contendor)
COPY ./app /home/app #Se ejecuta en el host
CMD ["node","/home/app/server,js"] #Entry point
- CMD es el punto de entrada de nuestra aplicación
- RUN permite ejecutar varios comandos, múltiples veces.
# Construyendo nuestra imagen
docker build -t my-app:1.0 .
docker run my-app:1.0
# Borramos el contenedor
docker stop <id>
docker rm <id>
# Borramos la imagen
docker rmi <id>
#Corregir Dockerfile y después ...
docker build -t my-app:1.0 .
docker run my-app:1.0
docker exec -it <id> /bin/sh
Nombrado de imagenes
registryDomain/imageName:tag
En DockerHub:
docker pull mongo:4.2
docker pull docker.io/library/mongo:4.2
docker login
docker tag my-app:latest <remote-repo:version>
docker push <id:version>
Docker volumes nos permiten persistir nuestros datos.
Recordemos que cuando los contendores se detienen o reinician su estado se reinicia también.
Un directorio del sistema de archivos del host se monda en el sistema de archivos virtual de Docker.
Nosotros decidimos en donde se hace la referencia del sistema de archivos
docker run \
-v /home/mount/data:/var/lib/mysql/data
Docker crea el directorio
docker run -v /var/lib/mysql/data
Es una mejor de los volúmenes anonimos.
docker run -v name:/var/lib/mysql/data