Skip to content

Files

Latest commit

6210d24 · Nov 14, 2021

History

History
286 lines (206 loc) · 6.9 KB

docker.org

File metadata and controls

286 lines (206 loc) · 6.9 KB

Docker

¿Qué es docker?

¿Qué es un container?

  • 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.

Antes de los contenedores

./DOCKER.assets/before-containers.png

Después de los contenedores

  • Ambiente encapsulado.
  • Empaquetados con la configuración necesaria.
  • Un solo comando para instalar la aplicación.

./DOCKER.assets/after-containers.png

Imagen vs contenedor

  • 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

Empezando con los comandos

  • 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.
        

Docker vs Máquinas virtuales

A nivel de sistema operativo se tienen las siguientes capas. ./DOCKER.assets/os.png

En cambio, docker y una máquina virtual, virtualizan lo siguiente: ./DOCKER.assets/docker-vms.png

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.

Instalación de 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

Principales comandos

# 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

Container debbuing

# 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

Workflow con Docker

./DOCKER.assets/workflow.png

Docker network

Docker crear su propia red aislada. Los contenedores se pueden comunicar entre ellos. ./DOCKER.assets/workflow.png

# Mostrar las redes disponibles en docker
docker network ls

# Crear una nueva red para nuestra aplicación
docker network create mongo-network

Real case use scenario

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

./DOCKER.assets/dcompose-01.png

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

Dockerfile

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

Docker volumes

Repositorios de docker

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

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.

./DOCKER.assets/docker-volume.png

Host volumes

Nosotros decidimos en donde se hace la referencia del sistema de archivos

docker run \
    -v /home/mount/data:/var/lib/mysql/data

Anonymous volumes

Docker crea el directorio

docker run  -v /var/lib/mysql/data

Named volumes

Es una mejor de los volúmenes anonimos.

docker run  -v name:/var/lib/mysql/data

Volumes en Docker compose

./DOCKER.assets/compose-volumes.png