Docker Intro

Curso de Arquitectura de Aplicaciones con Docker 2018

Que es un contenedor ?

  • Es la pieza fundamental de docker.

  • Es una agrupación de varios procesos. También puede ser un solo proceso.

  • Los procesos que se definen para un contenedor, solo pueden vivir en el contexto de ese contenedor.

  • Los procesos usarán los recursos que el contenedor defina.

  • Los procesos corren de forma nativa en máquinas linux, lo único que se comparte es el kernel. por eso en ambientes productivos se usa linux con docker.

  • No son máquinas virtuales.

docker ps = lista los contenedores
docker ps -a = lista contenedores a detalles
docker ps -aq = lista solo los ID de los contenedores (la q significa quiet, tranquilo o silencioso)
docker inspect id_contenedor = detalles internos del contenedor
docker inspect nombre_contenedor = lo mismo que el anterior
docker inspect -f {{}} nombre_contenedor = filtra una variable especifico del contenedor
docker rm nombre_contenedor = elimina un contenedor
docker rm $(ps -aq) = borra TODOS los contenedores
docker run -it ubuntu —> Com esto le decimos que corra el comando pero que lo haga de forma interactiva con mi terminal. Así el estado del contenedor no será apagado sino prendido.

Ciclo de vida de un contenedor

El contenedor siempre estara corriendo o esperar correr un proceso de lo contrario se apagara

Para ejecutar un proceso o un comando en un contenedor existente

docker exec it nombre_contenedor bash
docker kill nombre_contenedor = mata el proceso completo
docker rm -f nombre_contenedor = forzar la eliminación del contenedor

Exponiendo contenedores al mundo exterior - BIND MOUNTS

Existen tres maneras de hacer permanencia de datos:

  • Bind mount

  • Volume

  • tmpfs mount

  • docker run --detach --name server nginx

  • -d o --detach —> Si el contenedor que voy a ejecutar tiene un proceso que tiene output y/o pretende correr en modo interactivo, lo va omitir, me va dar el control de la terminal.

Los contenedores están aislados del sistema y a nivel de red, cada contenedor tiene su propia stack de net y sus propios puertos.

Debemos redirigir los puertos del contenedor a los de la computadora y lo podemos hacer al utilizar este comando:

docker run -d --name server -p 8080:80 nginx

Enlazando directorio desde afuera

docker run --name db -d -v /Users/gvilarina/Dev/platzi/mongodata:/data/db mongo

Datos con Docker: Volumes

docker volume ls [
docker volume prune [ Para poder borrar los volúmenes que no están asociados a ningún contenedor en ejecución
docker volumecreate dbdata [ crea un volumen
docker run -d --name db --mount src=dbdata,dst=/data/db mongo [ asigna el volumen al contenedors\ 

imágenes

Las imágenes son un componente fundamental de Docker y sin ellas los contenedores no tendrían sentido. Estas imágenes son fundamentalmente plantillas o templates. Algo que debemos tener en cuenta es que las imágenes no van a cambiar, es decir, una vez este realizada no la podremos cambiar.

Ver imágenes descargadas en el host docker image ls

Descargar imágenes en el host imágenes descargadas en el host docker pull <nombre de la imagen> Ej: docker pull redis Ej: docker pull ubuntu:18.04 descargando una version en particular

Eliminar imágenes descargadas en el host

docker image ls // para obtener el id de la imagen REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 18.04 93fd78260bd1 8 days ago 86.2MB

docker rmi -f 93fd78260bd1

-f => forzar

Ej: docker rmi -f 93fd78260bd1

DockerFile que es la ““receta”” que utiliza Docker para crear imágenes.

**Es importante que el DockerFile siempre empiece con un ““FROM”” sino, no va a funcionar. **

El flujo para construir en Docker siempre es así: Dockerfile – **build **–> Imágen – run --> Contenedor

ejemplo

FROM ubuntu

RUN touch /usr/src/hola-platzi

Nota:

--docker push /ubuntu:platzi

docker push jcmrmelgar/ubuntu:platzi

--renombrar un tag de una imagen 
docker tag ubuntu:platzi jcmrmelgar/ubuntu:platzi

docker history <tag contenedor> Ej: docker history ubuntu:platzi

Herramienta para ver mejor el contenido de las imagenes dive

Docker en aplicaciones

FROM node:8

COPY [“.", "/usr/src/"]
# [<ubicacion de los archivos a copiar>, <destino donde van a quedar los archivos copiados>]
WORKDIR /usr/src
# es similar al comando cd, WORKDIR <entrar en la siguiente ruta> 
RUN npm install
# RUN ejecuta el comando npm install 
EXPOSE 3000
# le indica al contenedor el puerto por el cual va a salir o exponer el contenedor, es el mismo puerto por donde esta escuchando node
CMD ["node", "index.js"]
# ejecuta el comando node index.js el cual levanta el servidor de express

docker build -t platziapp .

docker run --rm -p 3000:3000 anturyapp

  • –rm : esta bandera indica que después de correr el contenedor se borre éste contenedor.

Docker networking: colaboración entre contenedores

Podemos conectar 2 contenedores de una manera fácil sencilla y rapida. Vamos a ver que con tan solo unos comandos tendremos la colaboración entre contenedore

Borrar una redes en docker docker network rm <nombre de la red> Ej: docker network rm platzinet

Crear una redes en docker docker network create --attachable <nombre de la red> —attachable es para que otros contenedores se puedan unir a esta red Ej: docker network create --attachable platzinet

Ver redes disponibles docker docker network ls bridge red por defecto y se conectan con un keyword link esta en desuso, compatibilidad (deprecated) host simula la red del computador que corre docker (no usar) none hacer que tenga el network desabilitado

Ver contenedores en un red docker network inspect <nombre de la red> Ej: docker network inspect platzinet Detallar la busqueda docker network inspect -f '{{.Containers}}' platzinet

Unir un contenedor a la red creada docker network connect <nombre de la red> <nombre del contenedor> Ej: docker network connect platzinet db docker run -d --name app -p 3000:3000 --env MONGO_URL=mongodb://db:27017/test platziapp

-env variable de entorno db es el nombre del contenedor sin necesidad de pasar la ip del contenedor para la conexión

docker-compose: la herramienta todo-en-uno

Docker compose es una herramienta que nos permite describir de forma declarativa la arquitectura de nuestra aplicación, utiliza composefile (docker-compose.yml).

crear el archivo docker-compose.yml Dockerfile = describer de manera imperativa (paso a paso) la arquitectura de nuestra aplicación docker-compose.yml = describir de forma declarativa la arquitectura de nuestra aplicación

version: "3"

services:
  app:
    image: platziapp
    environment:
      MONGO_URL: "mongodb://db:27017/test"
    depends_on:
      - db
    ports:
      - "3000:3000"

  db:
    image: mongo

docker-compose up para crear el build de la imagen

Detener contenedores en docker-compose docker-compose down Para los contenedores y los borra incluyendo el network

Entrar a un contenedor montado con docker-compose docker-compose exec <nombre del servicio> bash Ej: docker-compose exec app bash

Ver logs de los contenedores montados con docker-compose docker-compose logs Para filtrar: docker-compose logs <keyword> Ej: docker-compose logs app

Ver el status de docker-compose docker-compose ps

Ejecutar contenedores en segundo plano docker-compose docker-compose up -d No muestra el output -d = —detach Corre en segundo plano

se monta el volumen para apuntar el codgio afuera del contenerdor

version: "3"

services:
  app:
    build: .
    environment:
      MONGO_URL: "mongodb://db:27017/test"
    depends_on:
      - db
    ports:
      - "3000-3010:3000"
    volumes:
      - .:/usr/src
      - /usr/src/node_modules

  db:
    image: mongo

para escalar los contenedores para que hayan mas para atender las solicitudes se puede usar el comando: se debe de agregar un rango de puertos

docker-compose scale [nombre_contenedor]=[cantidad_contenedores]
docker-compose scale app=4

Montar un docker sobre docker, usar un conenedor con docker para hablarle a nuestro deamon

docker run -it --rm -v /var/run/docker.sock:/var/run/docker.sock docker

Última actualización