Docker - RAW
Cheatsheet de todo lo aprendido en Docker
¿Qué es Docker?
Permite automatizar despliegue de aplicaciones dentro de espacios virtualizados
Imagen -> plantilla para la creación de contenedores
Contenedores -> Espacio auto-contenido incluye necesario para la ejecución de aplicacioens
Es similar a máquina virtual
Imagen plano o maqueta del edificio y el contenedor es el edificio en sí
La gestión de imágenes y contenedores las hace dockerd. Un servicio
Usamos el cliente para conectarnos con el servicio
Se pueden gestionar distintas redes y clusters de contenedores y volúmenes.
Introducción
Salomón Hykes en dotCloud ->integración continúa. Lo sacó a software libre en el 2013
**Proyecto insignia en Red Hub. **
Propone seguir un modelo fijo -> la forma en la que se define
Integración continua -> CI, entrega continua -> CD
Diferencia entre VM y Contenedores
Los contenedores no tienen Hypervisor ni guest OS. El motor de docker usa los servicios del SO fuente independizando los contenedores.
Instalación
Versión comunitaria Versión empresarial
Documentación muy bien hecha
En cuanto se termine tenemos el servicio y el cliente de docker en la máquina
systemctl status docker.service -> comando gestionar servicios
Docker -v vemos el cliente
Docker -h muestra los comandos disponibles
Servicio dockerd
systemctl -> interfaz de system.d (mecanismo reciente que gestiona muchas cosas del so) argumentos. STATUS, START, STOP,RESTART
comandos client -> inspect, kill, load
Docker ps -> para ver los contenedores que se encuentran en ejecución
El cliente se conecta con el servicio de docker
Primer contenedor
Docker run # lanza comando sobre un nuevo contenedor que se crea al instante
Todos los comandos tienen el –h
docker run hello-world -> primero lo busca localmente y después si no lo encuentra lo busca y lo descarga desde docker-hub
si no ponemos nada descargar el latest
nifty_mclaren loving_diffie <3 lovid
docker ps # muestra los contenedores pero este no sale porque no es interactivo sino que se ejecuta y ya y docker ps -a si que lo muestra
docker run busybox # (otro)
docker run ubuntu
Estos comandos no hacen mucho
Comandos listado Contenedores
docker ps -a -q # (Solo muestra los identificadores)
docker ps -a -s # (tamaño)
Con la opción -f # podemos hacer un filtro por lo que queramos casi
docker ps -f name=_lov
Comandos listado Imágenes
docker images -a # para verlas todas
docker images -q # para vert los indentificadores
docker images ubuntu - > filtra por ubuntu
docker images --no-trunk # para ver el hash completo
docker image # PARA GESTIONAR IMÁGENES NO PARA LISTAR
Contenedores interactivos
docker run -it # (interactivo y con terminal tipo tty)
# Se ve que lo último es el comando que queremos ejecutar
docker run -it fedora bash
docker start -i # y con los primeros numeros del contenedor podemos interactuar con el
docker stop # para detener un contenedor
docker run -it -d(BACKGROUND) --name # para asignarle un nombre
docker run -it -d --name fedoracoretest fedora bash
Borrar contenedores
docker rm <identificador>
docker create # lo creamos pero no lo arrancamos
docker create -it ngnix # lo crea pero no lo arranca
docker container # varios comandos, hay algunos que tienen alias
docker start identificador # lo lanza (SI PONE UP ESTÁ LEVANTADO)
docker image save ubuntu -o /home/ubuntuimage.tar # la guarda
docker image rm hello-world:latest
Comandos útiles
docker run -d --name testing nginx
docker logs testing
docker exec # (LANZA COMANDO)
docker exec -it testing bash # (Si entramos y ejecutamos cosas nos aparecen en logs)
docker top testing # (nos muestra los procesos)
docker stats # para ver las estadisticas
docker kill # más similar al stop pero más bruto -> da un código más raro es mejor hacerlo con stop
Redes
Introducción
docker run -d --name nginxtest1 nginx # LO CREA PERO EN LOCALHOST
docker run -d --name nginxtest2 -P nginx # (LE MAPEA UN PUERTO DE MAQUINA)
docker run -d --name nginxtest2 -p nginx # (Se lo asignamos nosotros)
docker run -d --name nginxtest3 -p 80:80 nginx
# así asigna todas las interfaces de red a ese puerto
docker run -d --name nginxtest3 -p 127.0.0.1:80:80 nginx # (ASIGNAR UNA INTERFAZ)
Extraer y analizar información de adap red
docker network inspect bridge # (Información sobre una red)
docker network prune # eliminar redes que no se estén utilizando si las quitamos y después arrancamos contenedor que se encontraba parado podemos tener problemas
docker network instpect <numero identificador>
Redes personalizadas
docker network create net1 #(Crea nueva red con driver bridge crea la interfaz)
docker network ls
ip addr
docker inspect net1 # (ver detalles)
Vincular contenedores a redes
Docker asigna DHCP y DNS por lo que podemos hacer ping mediante el nombre.
docker run -d -p 27017:27017 --network net1 --name mongotest2 mongo #(asignandole una red)
# NOS MUESTRA DETALLES E IP
docker network inspect net1
docker exec -it mongotest2 bash
# Pruebas instalar net-tools y iputils-ping
Administración completa de redes
docker network inspect net1
# Queremos vincular otro contenedor a la misma red
docker run -it -d --name nginxred1 --network net1 nginx
docker exec -it nginxred1 bash
apt-get update && apt-get install iputils-ping net-tools
# SI VOLVEMOS A HACER EL INSPECT AHORA SALEN LOS DOS
docker network create net2 --subnet=192.50.0.0/16 --ip-range=192.50.10.0/24
docker network inspect net2
docker run -it -d --name nginxred2 --network net2 nginx
docker inspect nginxred2
Eliminación de redes
# Conectar red2 a red1
docker network connect net1 nginxred2
docker inspect nginxred2 # TIENE LAS DOS
# Para desconectar con disconnect
docker network disconnect net2 nginxred2
docker network create net3
docker network rm net3
SE ELIMINA SIN PROBLEMA PERO SI INTENTAMOS ELIMINAR UNA QUE TENGA UN CONTENEDOR ACTIVO TENEMOS QUE DETENER CONTENEDOR
SI PARAMOS CONTENEDOR, ELIMINAMOS RED Y VOLVEMOS A LEVANTAR NOS DA ERROR. TENER CUIDADO CON PRUNE
Volumenes
Introducción
Los volúmenes nos permiten almacenar información de forma persistente y después la podemos compartir entre varios contenedores
Los volúmenes son gestionados por el servicio de docker. Tenemos comandos con el servicio para gestionar esto
/var/lib/docker -> recursos interesantes
Aquí hay un directorio que es volumes. Cada directorio tiene otro llamada _data y en este se encuentra la información almacenada
si escribimos un fichero dentro del volumen y después hacemos un ls en los volumenes vemos nuestro voltest y la info dentro
ls -l /var/lib/docker/volumes | wc -l |
docker run -it --name volumentest -v /voltest ubuntu bash # (CREANDO VOLUMEN)
Compartición de volumenes
mkdir /root/sharevolumen
# LO QUE ESTÁ A LA IZQUIERDA VOLUMEN EN HOST Y DERECHA VOLUMEN EN CONTENEDOR
docker run -it --name testvol2 -v /root/sharevolumen/:/sharevol ubuntu bash
# ESTO ES UN DIRECTORIO COMPARTIDO MUY UTILL. SI EL DIRECTORIO NO EXISTE EL SERVICIO LO CREA
docker inspect testvol2
BINDS -> LOS VOLUMENES QUE ESTÁN ENGANCHADOS
Compartición de volumenes cont - cont
docker run -it --name t1 -v /vol1 ubuntu bash
docker run -it --name t2 --volumes-from t1 ubuntu bash
# ASÍ TENEMOS CARPETA COMPARTIDA ENTRE DIRECTORIOS
# SI NO HAY NINGÚN CONTENEDOR ENGANCHANDO A UN VOLUMEN NO SE PUEDE USAR NUNCA MAIS PERO LA INFORMACIÓN SIGUE ESTANDO
Creación volumenes independientes
Para evitar la situación anterior de volumen vinculado a contenedor podemos crear volumenes independientes
docker volume create {OPCIONES}
docker volume create voltest # -> lo crea sin hash con el nombre
docker volume ls
docker run it --name t3 -v voltest:/sharedata/ busybox
docker run -it --name t3 -v voltest:/sharedata busybox
docker run -it --name t3 -v voltest:/sharedata:ro busybox (READ ONLY)
# NO PERMITE MODIFICACIÓN
# TAMBIÉN TIENE UN PRUNE. PERO SI UN CONTENEDOR ESTÁ DETENIDO VA A ELIMINAR VOLUMEN
docker volume inspect voltest
CAMBIO DE SECCIÓN.DevOps
Introducción COMMIT
COMMIT ES GUARDAR CONFIGURACIÓN EXISTENTE EN UNA IMAGEN
PUEDE SER PROPENSA A ERROR -> TODO HEREDA LA CONF POR SI HAY ALGÚN FICHERO INNECESARIO O LIBRERÍAS Y DEPENDENCIAS INNECESARIAS
DOCKERFILE -> SON INSTRUCCIONES QUE SE VAN EJECUTANDO A MEDIDA QUE SE VA CREANDO UN CONTENEDOR
PRIMERO CONSTRUIMOS LA IMAGEN CON DOCKER BUILD Y CUANDO SE CREA CONTENEDOR SE EJECUTA DOCKERFILE
docker run -d --name docker_container nginx
docker exec -it docker_container bash
apt-get update
apt-get install python3
docker commit docker_container cursodocker
# SI HACEMOS DOCKER IMAGES LA VEMOS
docker container create --name t5 cursodocker
docker exec -it t5 bash (TIENE PYTHON)
Instrucciones Dockerfile
Alternativa es partir de un contenedor existente ahora vemos la segunda opción DockerFile
docker rm -f $(docker ps -qa) # -> BORRA TODO
# Las imágenes están compuestas por capas
La primera instrucción es la FROM -> desde donde se extiende(El padre)
FROM SCRATCH(VACÍA)
FROM ALPINE(linux 5mb)
LABEL -> METADATOS
RUN (COMANDOS)
ENV -> VARIABLES DE ENTORNO (ENV variable=valor)
ADD -> copiar ficheros desde ubicación host a contenedor
ADD /home/docker/fichero /var/www/html
COPY -> no permite algunas acciones(cargar desde urls ni descomprimir) es + seguro
copy /home/docker/webdirectory /var/www/html
EXPOSE -> EXPONER PUERTO
CMD y ENTRYPOINT -> CMD (UNA INSTRUCCIÓN) ENTRYPOINT(PRIMER COMANDO AL EJECUTAR)
DOCKER BUILD
DOCKER BUILD RECIBE EL FICHERO DOCKERFILE Y LO MANDA A SERVICIO DE DOCKER
SE CREAN CAPAS INTERMEDIAS PARA DETECTAR FALLOS. DOCKER VA CACHEANDO CAPAS
CUANDO SE VUELVE A LANZAR EMPIEZA DESDE LA ÚLTIMA CAPA CACHEADA TAMBIÉN DETECTA CAMBIOS
CUANDO TERMINA ELIMINA CAPAS INTERMEDIAS
# Use the official image as a parent image.
FROM node:current-slim
# Set the working directory.
WORKDIR /usr/src/app
# Copy the file from your host to your current location.
COPY package.json .
# Run the command inside your image filesystem.
RUN npm install
# Inform Docker that the container is listening on the specified port at runtime.
EXPOSE 8080
# Run the specified command within the container.
CMD [ "npm", "start" ]
# Copy the rest of your app's source code from your host to your image filesystem.
COPY . . (COPIA TODO LO DEL DIRECTORIO ACTUAL AL WORKDIR)
EJEMPLO CON NODEJS
DOCKERFILE
----
FROM node:8
WORKDIR /usr/src/app
RUN npm install express
COPY . .
EXPOSE 3000
CMD ["node","index.js"]
-----
/home/admin/pruebas# docker build -t cursodocker:v1 .
Con docker images podemos ver nuestra versión
.dockerignore (PARA IGNORAR ARCHIVOS)
*.log
docker-compose.yml
docker run -d --name cursodockercontenedor2 -p 7890:3000 cursodocker:v2
PARA SUBIRLA A DOCKERHUB HAY QUE HACER DOCKER LOGIN Y DOCKER PUSH
EJEMPLO CON DJANGO
docker build -t testdjango
docker run -d --name test1 testdjango
docker ps
DOCKER COMPOSE
Orquestación de varios servicios a la vez para despliegue de infraestructura
Quiero levantar todos estos contenedores con estas redes y con estos volúmenes. Esto va en un yaml. Cada uno tienen unas características como en el docker run
docs.docker.com/compose/compose-file
Depends on -> dependencia entre contenedores
DOCKER COMPOSE Wordpress y Mysql
https://docs.docker.com/compose/install/
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)
-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose version
LOS COMANDOS DE DOCKER COMPOSE ESTÁN PENSADOS PARA EJECUTARSE EN UNO O VARIOS CONTENEDORES
DOCKER COMPOSE UP -> LEVANTA TODOS LOS DEL FICHERO
docker version -> ver versión de docker
docker-compose-wordpress.yml version: '3.7'
services:
wordpress:
image: wordpress
environment:
WORDPRESS_DB_HOST: dbserver:3306
WORDPRESS_DB_PASSWORD: mysqlpw
ports:
- 80:80
depends_on:
- dbserver
dbserver:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: mysqlpw
ports:
- 3306:3306
DOCKER COMPOSE Wordpress y Mysql
docker-compose build
docker-compose up -d # -> CREA LOS DOS
docker-compose ps
# SE PUEDE ESCALAR -> HACER REPLICAS DE UNO
COMANDOS DOCKER COMPOSE
-f #-> especificamos ruta donde buscar si no hay nada es el .
down #-> se detienen y se eliminan
docker-compose pause
docker-compose unpause
docker-compose stop # (estado exit)
docker-compose start
docker-compose down # -> detiene y elimina
docker-compose up --scale wordpress=3 -d # (FALLO EN PUERTO YA PILLADO)
#PARA SOLUCIONARLO QUIITAMOS EL 80:80 Y PONEMOS SOLO 80
docker-compose logs
docker-compose up # (SIN -D TE PONE TODO POR TERMINAL)
devhints.io/docker-compose # (PRINCIPALES COMANDOS)