Introducción a Docker

https://docs.docker.com/desktop/windows/install/

Objetivo

Automatizar el despliegue de aplicaciones en contenedores de forma rápida y portable

Arquitectura de Docker

Docker Server
Servidor donde se aloja Docker. El servicio mismo de Docker, es un servicio mas del sistema.
Docker Daemon/Docker Server

Docker CLI
Interfaz para el usuario. Podemos manejar contenedores, imágenes, volúmenes y redes.

API
Canal de comunicación entre Docker Server y Docker CLI

Conceptos importantes

Imágen

Colección de todas los archivos que componen nuestra aplicación de software. Estático

Capas de una imágen

Son de solo lectura
Se crean con un Docker File

Creación de capas en la práctica

Ejemplo:

#bajamos un SO/ imagen inicial desde la que partimos FROM centos:7
# es un paso de creación de imagen RUN yum –y install httpd
# es el comando que el contenedor ejecuta de forma predeterminada cuando inicia la imagen creada CMD [“apachectl”,”-DFOREGROUND”]

Contenedor

Instancia de nuestra aplicación en tiempo de ejecución. Dinámico

Contenedor como capa de una imágen

Ejecuta en tiempo real las tres capas anteriores
Es de Lectura/Escritura

Y... ¿Qué contiene?

Imágenes

Volúmenes

Redes

Contenedores vs máquina virtual

Construyendo imágenes

Dockerfile

Archivo de texto que describe cómo debe construirse una imagen docker. Brinda una forma clara de automatizar la construcción de contenedores.

Ejemplo

            # Dockerfile
            FROM node:16

            # Create app directory
            WORKDIR /usr/src/app

            # Install app dependencies
            # A wildcard is used to ensure both package.json AND package-lock.json are copied
            # where available (npm@5+)
            COPY package*.json ./
            RUN npm install

            # Bundle app source
            COPY . .

            EXPOSE 3030

            CMD [ "node", "app.js" ]
            

build

Construye una imagen utilizando el Dockerfile

docker build .

tag

Permite asignar un nombre amigable a una imagen

docker tag ccd4f144c764 busyboxplus

Utilizando docker

run

Ejecuta un comando en un contenedor

docker run busybox echo "Hello World!"

Ejecutar un comando interactivo

Ejecuta un comando interactivo en el contenedor

docker run -ti busybox

Compartir carpetas y archivos

docker run -v "C:\ingsw:/etc" busybox

Exponer puertos

docker run -p 80:80 httpd

pull

Descargar imágenes desde repositorio (Por defecto DockerHub)

docker pull busybox

search

Buscar imágenes en repositorios

docker search jenkins

ps

Ver contenedores en ejecución

docker ps

diff

Ver cambios en contenedores

docker diff 6f8cdfb6976c

stop

Detiene un contenedor en ejecución. Utiliza la señar SIGTERM(15), si el contenedor no se detiene utiliza SIGKILL(9)

docker stop 6f8cdfb6976c

start

Vuelve a ejecutar un contenedor detenido

docker start 6f8cdfb6976c

restart

Reinicia el contenedor

docker restart 6f8cdfb6976c

pause

Suspende la ejecución del contenedor

docker pause 6f8cdfb6976c
docker unpause 6f8cdfb6976c

commit

Guarda los cambios efectuados en una nueva imagen

docker commit 6f8cdfb6976c someuser/example

images

Ver las imágenes descargadas en el sistema

docker images

rm

Eliminar contenedores detenidos

docker rm 6f8cdfb6976c

rmi

Eliminar imágenes que no estén siendo utilizadas

docker rmi someuser/example

Dockerfile

ADD

Copia archivos desde el host a la imagen

ADD proyecto.war /app

ENV

Establece una variable de entorno. Puede ser accedida desde la aplicación

ENV DEBUG_LVL 3
ENV APACHE_LOG_DIR /var/log/apache

USER

Permite establecer el usuario con el que se ejecutará el contenedor. Por defecto se utiliza el usuario root

USER 73

WORKDIR

Cambia el directorio de trabajo

WORKDIR /app/

VOLUME

Crea un volumen que será conpartido entre el host y el contenedor o entre otros contenedores

VOLUME /var/www/

EXPOSE

Abre un puerto TCP o UDP para la comunicación entre el contenedor y el mundo exterior

EXPOSE 80 443
EXPOSE 53/udp

RUN

Ejecuta un comando en el contenedor (en tiempo de construcción)

RUN echo Soy un ejemplo
RUN ["echo", "Soy un ejemplo"]

CMD

Ejecuta un comando en el contenedor (en tiempo de ejecución). Puede ser sobreescrito con docker run

CMD ["echo", "CMD demo"]

.dockerignore

Cuando se construye una imagen, se envía el contexto de construcción completo al demonio docker. Con este archivo se marcan los archivos que no serán enviados al demonio docker al construir.

          # .dockerignore
          .git
          *.tmp
          

Buenas prácticas

Dockerfiles bien escritos mejoran la calidad de nuestra aplicación

Containers efímeros

Los contenedores pueden ser detenidos, destruídos y recreados con el mínimo de esfuerzo y configuración

Usar .dockerignore

Evitar instalar paquetes innecesarios

Cada contenedor debe tener un único propósito

Minimizar el número de capas

Orquestación

Orquestación

DEMO

Laboratorio para aprender jugando

  • play-with-docker.com
  • Crecimiento Docker

    Referencias