Docker Colombia Meetup - Segundo Encuentro
Mejores prácticas para escribir Dockerfiles
Hola ● Soy Johan Giraldo (@jsgiraldoh Redes sociales) ● DevOps Engineer ● Grupo Docker Community Leaders ● Me gusta compartir conocimientos ● Autor del Blog: Aprende Docker en Español
2
¿Qué es Docker?
05/04/2022
Mejores prácticas para escribir Dockerfiles
3
¿Qué es Docker?
05/04/2022
Mejores prácticas para escribir Dockerfiles
4
Feliz cumpleaños Docker! 🎂 #9
05/04/2022
Mejores prácticas para escribir Dockerfiles
5
¿Qué es un contenedor? En pocas palabras, un contenedor es un proceso de espacio aislado en su máquina que está aislado de todos los demás procesos en la máquina host. Ese aislamiento aprovecha los espacios de nombres del kernel y cgroups , características que han estado en Linux durante mucho tiempo. Docker ha trabajado para que estas capacidades sean accesibles y fáciles de usar. En resumen, un contenedor: ◼
Es una instancia ejecutable de una imagen. Puede crear, iniciar, detener, mover o eliminar un contenedor mediante DockerAPI o CLI.
◼
Se puede ejecutar en máquinas locales, máquinas virtuales o implementarse en la nube.
◼
Es portátil (se puede ejecutar en cualquier sistema operativo)
◼
Los contenedores están aislados entre sí y ejecutan su propio software, archivos binarios y configuraciones.
05/04/2022
Mejores prácticas para escribir Dockerfiles
6
¿Qué es Docker?
05/04/2022
Mejores prácticas para escribir Dockerfiles
7
¿Qué es Docker?
05/04/2022
Mejores prácticas para escribir Dockerfiles
8
¿Qué es Docker?
05/04/2022
Mejores prácticas para escribir Dockerfiles
9
¿Qué es un contenedor?
05/04/2022
Mejores prácticas para escribir Dockerfiles
10
Guía instalación Docker
1. En el siguiente enlace podrá encontrar la guía para la instalación de docker. https://jsgiraldoh.io/Blog/Instalar-Docker-Engine-en-Ubuntu/
05/04/2022
Mejores prácticas para escribir Dockerfiles
11
Dockerfile Docker puede crear imágenes automáticamente leyendo las instrucciones de un archivo Dockerfile. Dockerfile es un documento de texto que contiene todos los comandos que un usuario podría llamar en la línea de comando para ensamblar una imagen. Con el comando docker build usuarios pueden crear una compilación automatizada que ejecuta varias instrucciones de línea de comandos en sucesión.
05/04/2022
Mejores prácticas para escribir Dockerfiles
12
Dockerfile Oficial Distribución Nginx FROM nginx COPY static-html-directory /usr/share/nginx/html docker build -t some-content-nginx . docker run --name some-nginx -d -p 8080:80 some-content-nginx Luego puede presionar http://localhost:8080o http://host-ip:8080en su navegador.
05/04/2022
Mejores prácticas para escribir Dockerfiles
13
Ejemplo Dockerfile FROM ubuntu:20.04 LABEL maintainer="jsgiraldoh" LABEL version="0.1" LABEL description="This is custom Docker Image for the Apache Services." ENV CONTAINER_TIMEZONE="America/Bogota" ENV APACHE_RUN_USER www-data ENV APACHE_RUN_GROUP www-data ENV APACHE_LOG_DIR /var/log/apache2 ENV APACHE_RUN_DIR /var/www/html RUN ln -snf /usr/share/zoneinfo/$CONTAINER_TIMEZONE /etc/localtime && echo $CONTAINER_TIMEZONE > /etc/timezone RUN apt update RUN apt install -y apache2
COPY index.html /var/www/html/ CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"] EXPOSE 80 05/04/2022
Mejores prácticas para escribir Dockerfiles
14
Dockerfile instrucciones FROM Siempre que sea posible, utilice imágenes oficiales actuales como base para sus imágenes. Recomendamos la imagen de Alpine ya que está estrictamente controlada y es de tamaño pequeño (actualmente menos de 6 MB), sin dejar de ser una distribución completa de Linux. LABEL Puede agregar etiquetas a su imagen para ayudar a organizar imágenes por proyecto, registrar información de licencia, para ayudar en la automatización o por otras razones. RUN Divida RUN declaraciones largas o complejas en varias líneas separadas con barras invertidas para que sea Dockerfilemás legible, comprensible y fácil de mantener. 05/04/2022
Mejores prácticas para escribir Dockerfiles
15
Dockerfile instrucciones CMD La CMD instrucción debe usarse para ejecutar el software contenido en su imagen, junto con cualquier argumento. CMD casi siempre debe usarse en forma de CMD ["executable", "param1", "param2"…]. Por lo tanto, si la imagen es para un servicio, como Apache, ejecutaría algo como CMD ["apache2","DFOREGROUND"]. ENV La ENV instrucción también es útil para proporcionar las variables de entorno requeridas específicas para los servicios que desea incluir en contenedores EXPOSE La EXPOSE instrucción indica los puertos en los que un contenedor escucha las conexiones. En consecuencia, debe utilizar el puerto tradicional común para su aplicación. Por ejemplo, una imagen que contenga el servidor web Apache usaría EXPOSE 80 05/04/2022
Mejores prácticas para escribir Dockerfiles
16
Comprender el contexto de compilación Cuando emite un comando docker build, el directorio de trabajo actual se denomina contexto de compilación. De manera predeterminada, se supone que Dockerfile se encuentra aquí, pero puede especificar una ubicación diferente con el indicador de archivo (-f). Independientemente de dónde Dockerfile viva realmente, todo el contenido recursivo de los archivos y directorios en el directorio actual se envía al daemon de Docker como contexto de compilación. La inclusión accidental de archivos que no son necesarios para crear una imagen da como resultado un contexto de creación más grande y un tamaño de imagen más grande. Esto puede aumentar el tiempo para crear la imagen, el tiempo para extraerla y enviarla, y el tamaño del tiempo de ejecución del contenedor. Para ver qué tan grande es su contexto de construcción, busque un mensaje como este cuando construya su Dockerfile: Sending build context to Docker daemon
05/04/2022
187.8MB
Mejores prácticas para escribir Dockerfiles
17
Canaliza Dockerfile a través de stdin Usa esta sintaxis para construir una imagen usando un Dockerfile desde stdin, sin enviar archivos adicionales como contexto de construcción. El guión (-) toma la posición de PATH e indica a Docker que lea el contexto de compilación (que solo contiene un Dockerfile) en stdin lugar de un directorio. El siguiente ejemplo construye una imagen usando un Dockerfile que se pasa a través de stdin. No se envía ningún archivo como contexto de compilación al daemon.
docker build -t myimage:latest -<<EOF FROM busybox RUN echo "hello world" EOF 05/04/2022
Mejores prácticas para escribir Dockerfiles
18
Excluir con .dockerignore Antes de que la CLI de Docker envíe el contexto al demonio de Docker, busca un archivo con el nombre .dockerignore en el directorio raíz del contexto. Si este archivo existe, la CLI modifica el contexto para excluir archivos y directorios que coincidan con patrones en él. Esto ayuda a evitar enviar innecesariamente archivos y directorios grandes o confidenciales al daemon y potencialmente agregarlos a las imágenes usando ADD o COPY. La CLI interpreta el archivo .dockerignore como una lista de patrones separados por saltos de línea similar a los archivos globales de los shells de Unix. A los efectos de la coincidencia, se considera que la raíz del contexto es tanto el directorio raíz como el de trabajo. 05/04/2022
Mejores prácticas para escribir Dockerfiles
19
Excluir con .dockerignore
05/04/2022
Mejores prácticas para escribir Dockerfiles
20
No instales paquetes innecesarios Continuando con el Dockerfile de ejemplo … RUN apt update RUN apt install -y apache RUN apt install -y bzr RUN apt install -y cvs RUN apt install -y git RUN apt install -y mercurial RUN apt install -y subversion … RUN apt update && apt install -y apache2 --no-install-recommends \ && rm -rf /var/lib/apt/lists/*
05/04/2022
Mejores prácticas para escribir Dockerfiles
21
Minimiza el número de capas FROM ubuntu:20.04 LABEL maintainer="jsgiraldoh" \ version="0.1" \ description="This is custom Docker Image for the Apache Services." ENV CONTAINER_TIMEZONE="America/Bogota" ENV APACHE_RUN_USER www-data ENV APACHE_RUN_GROUP www-data ENV APACHE_LOG_DIR /var/log/apache2 ENV APACHE_RUN_DIR /var/www/html RUN ln -snf /usr/share/zoneinfo/$CONTAINER_TIMEZONE /etc/localtime && echo $CONTAINER_TIMEZONE > /etc/timezone RUN apt update && apt install -y apache2 --no-install-recommends \ && rm -rf /var/lib/apt/lists/* COPY index.html /var/www/html/ CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"] EXPOSE 80 05/04/2022
Mejores prácticas para escribir Dockerfiles
22
Ordenar argumentos de varias líneas RUN apt-get update && apt-get install apache2 -y \ bzr \ cvs \ git \ mercurial \ subversion \ && rm -rf /var/lib/apt/lists/*
05/04/2022
Mejores prácticas para escribir Dockerfiles
23
Que sigue Usa compilaciones de varias etapas # syntax=docker/dockerfile:1 FROM golang:1.16 WORKDIR /go/src/github.com/alexellis/href-counter/ RUN go get -d -v golang.org/x/net/html COPY app.go ./ RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . FROM alpine:latest RUN apk --no-cache add ca-certificates WORKDIR /root/ COPY --from=0 /go/src/github.com/alexellis/href-counter/app ./ CMD ["./app"]
05/04/2022
Mejores prácticas para escribir Dockerfiles
24
Puesta en escena... Obten 100 dólares de crédito
Digital Ocean https://m.do.co/c/922854746323
05/04/2022
Mejores prácticas para escribir Dockerfiles
25
Vista a futuro... Orquestación de contenedores con Kubernetes
Disponible en Leanpub y Amazon FTIhHDGp0Jx6
05/04/2022
Mejores prácticas para escribir Dockerfiles
26
🚀 Únete a la comunidad! 🐳 Docker Community Slack
05/04/2022
Mejores prácticas para escribir Dockerfiles
27
¡ GRACIAS !
05/04/2022
Mejores prácticas para escribir Dockerfiles
28
Referencias ◼ Resumen de docker. Disponible en: https://docs.docker.com/get-started/overview/ ◼ https://docs.docker.com/engine/reference/builder/ ◼ https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ ◼ https://docs.docker.com/develop/develop-images/multistage-build/ ◼ https://hub.docker.com/r/docker/whalesay ◼ https://www.slideshare.net/Docker/dcsf19-dockerfile-best-practices ◼ https://www.howtoforge.com/tutorial/how-to-create-docker-images-with-dockerfile/ ◼ https://medium.com/@vi1996ash/steps-to-build-apache-web-server-docker-image-1a2f21 504a8e ◼ https://jsgiraldoh.io/ 05/04/2022
Mejores prácticas para escribir Dockerfiles
29