Docker - RAW

Docker 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)