Docker 101
- Los contenedores comparten el kernel del host
- Los contenedores usan la capacidad del kernel para agrupar procesos para el control de recursos
- Los contenedores garantizan aislamento a través de namespaces
- Los contendores se sienten ligeros como una VM ligera, pero no son VM
- Image management
- Resource Isolation
- File System Isolation
- Network Isolation
- Change Management
- Sharing
- Process Management
- Service Discovery (DNS since 1.10)
- Process trees (PID Namespace)
- Mounts (MNT namespace) wc -l /proc/mounts
- Network (Net namespace) ip addr
- Users / UIDs (User Namespace)
- Hostnames (UTS Namespace) hostname
- Inter Process Communication (IPC Namespace) ipcs
Desde su sitio web oficial seguimos la guía de instalación
- https://docs.docker.com/engine/install/ubuntu/
- Corroborar para qué sistema operativo se instala
Una vez instalado probamos que tengamos docker con:
docker --version
- Si no se puede visualizar probar con
sudo docker --version
usermod -aG docker ${USUARIO}
- Requiere reiniciar la máquina o abrir y cerrar sesión para obtener los nuevos privilegios
sudo su - ${USER}
- Realiza una nueva sesión de tu usuario vía sudo y te da un shell interactivo
Repositorio
# Descarga la imagen
docker pull hello-world
# Ejecuta Hello world
docker run hello-world
- Plantillas utilizadas para crear contenedores; comando build
- Están compuestas por capas de otras imágenes
- Se almacenan en un registro docker
- Si una imagen la relacionamos a una clase, entonces una instancia sería un contenedor
- Los contenedores solamente almacenan los binarios y dependencias que se necesitan para la ejeución.
- Lugar donde se almacenan las imagenes
- Puede ser público o privado (DockerHub o Propio)
- El registro contiene repositorios donde vive cada imágen
+ El **registro** Docker de Apache
+ Tiene un **repositorio**
+ https://hub.docker.com/_/httpd
+ Donde vive cada **imágen** de Docker
+ Para que tú crees tus propios **contenedores**
- Salen por salida estándar
- Inician en modo detached y salen cuando el proceso raiz utilizado para ejecutar el contenedor termina
Al igual que en github, docker tiene imagenes que puedes usar como base en:
- Primero se busca localmente la imágen
- Si no se tiene se busca en línea
- docker run crea nuevos contenedores, no hay persistencia. Tal cual una instancia de una clase.
De esta manera
# Iniciamos una imagen de debian
docker run -it --name debian-git3 debian
# Dentro del docker descargamos git
apt update
apt install -y git
git --version
exit
# Docker Commit
# Obtenemos id
docker ps -a
# Hacer commit de una imagen de docker
docker commit debian-git3 elcaza/debian-git3:1.0
# Consultar imagen creada
docker images
A través de un documento Dockerfile
es posible automatizar ciertas acciones.
Muy parecido a un Makefile
- Consultar sección de Dockerfile
Hay que recordar que las imágenes de Docker se componen por capas, cada instrucción genera una nueva capa.
Dado lo anterior, en medida de lo posible es preferible concatenar comandos para evitar hacer lo siguiente:
Dockerfile
(Ejemplo a evitarse)
FROM debian
RUN apt-get update
RUN apt install -y git
RUN apt install -y curl
- Cada
RUN
añade una nueva capa a la imagen
Dockerfile
(Ejemplo a utilizar en su lugar)
FROM debian
RUN apt-get update && apt-get install -y \
curl \
git
- Nota: Se hace uso de
apt-get
para evitar el warning que Docker envia conapt
.
Aunque no hay diferencia entre minusculas y mayusculas, se recomienda el uso de mayusculas para las instrucciones.
- Imágen base
FROM ubuntu
- Acción a ejecutar
RUN apt-get update && apt-get install -y git
- Comando a ejecutar tras inicializar el contenedor
CMD ["echo", "Inicializado"]
- COPY copia archivos o directorios del contexto de compilación al sistema de archivos del contenedor
COPY files /app/files
- Puede manejar URLs remotas
- Puede extraer automaticamente archivos tar
- Se recomienda usar COPY
ADD <src> <dest>
- Informa que el contenedor va a estar a la escucha en un puerto especifico
EXPOSE <port>
- USER elecciona con que usuario va a correr la aplicación
USER admin
- Selecciona el directorio de trabajo que vamos a utilizar
WORKDIR /app
FROM python:3.7
RUN pip install Flask==0.11.1
RUN useradd -ms /bin/bash admin
USER admin
WORKDIR /app
COPY app /app
CMD ["python", "app.py"]
- useradd -ms
- -m, --create-home
- -s, --shell SHELL
Es utilizado para crear microservicios Docker crea un túnel seguro entre contenedores para que estos no expongan puertos externamente
# Se crea un contenedor especificando un nombre
docker run -d --name redis redis:3.2.0
# Comprobar que esté corriendo bajo el nombre correcto
docker ps
# Construye la app en que se encuentre la app
docker build -t dockerapp:1.0 .
# Ejecuta el contenedor
docker run -d -p 5000:5000 --link nombre_contenedor dockerapp:2.0
cat /etc/hosts
# IP id_contendor nombre_contenedor
docker network ls
# 0b38e00cff30 bridge bridge local
# 713b2164fa61 host host local
# f0a5ab3ecf2a none null local
docker network inspect bridge
docker run -d --net none ubuntu sleep 60
Parecido a red NAT
docker run -d --name nombre ubuntu sleep 60
- se omite el
--net
porque se asigna esta red por defecto
# Creamos la red
docker network create --driver bridge mi_nueva_bridge
# Inspeccionamos las redes
docker network ls
# Inspeccionamos la que queremos
docker network inpect mi_nueva_bridge
# Asociación
docker run -d --net mi_nueva_bridge ubuntu sleep 60
# Conectar a red existente
docker network connect bridge contenedor_nombre
# Desconectar
docker network disconnect bridge contenedor_nombre
# Corroborar (ping o ifconfig)
docker exec -it contenedor_nombre ifconfig
Parecida a bridge de vmware
- En teoría no es necesario, porque para eso existe la opción -p (?)
- No está aislado
# Crear contenedor abierto
docker run -d --name contenedor_abierto --net host busybox sleep 100
Soporta múltiples maquinas host Requiere condiciones preexistentes
- Docker engine en modo Swarm
# Crear un nuevo volumen
docker volume create ejemplo
# Eliminar volumen
docker volume rm ejemplo
# Ver volumenes creados
docker volume ls
# docker volume inspect ejemplo
docker volume inspect ejemplo
# Asignar un volumen a una imagen
docker run -p 8000:8000 -v ejemplo:/app -d --name name user/imagen:1.0