class: center, middle, light # Una guía rápida de Docker ### Mauricio Collazos .footnote.left[] --- class: center [Repositorio en github](https://github.com/contraslash/una-guia-rapida-de-docker) ![https://contraslash.github.io/una-guia-rapida-de-docker/](img/qr.png) --- class: center # ¿Qué es un contenedor? ![https://pixabay.com/photos/hamburg-port-of-hamburg-3021820/](img/hamburg-3021820_1280.jpg) --- # ¿Qué es un contenedor? > Is a lightweight, stand-alone, executable package of a piece of software that includes everything needed to run it: code, runtime, system tools, system libraries, settings https://www.docker.com/what-container --- class: center # ¿Y las máquinas virtuales ya no solucionaban eso? ![https://techglimpse.com/docker-installation-tutorial-centos/](https://techglimpse.com/wp-content/uploads/2016/03/Container-vs-VMs.jpg) --- # TAR + Git ![De donde nacen los contenedores](img/tar+git.png) --- # ¿Y porqué son tan populares? - Inician y terminan mucho mas rápido que una máquina virtual - Son portables - Escalan rápidamente - Se integran rápidamente a arquitecturas orientadas a microservicios - Aceleran el proceso de DevOps [Why docker is so popular](http://www.channelfutures.com/open-source/why-docker-so-popular-explaining-rise-containers-and-docker) --- class: center # Historia de Docker ![Historia de Docker](img/docker-timeline.png) --- # Alternativas a Docker - [rkt](https://coreos.com/rkt/) - [runC](https://github.com/opencontainers/runc) - [lxC](https://linuxcontainers.org/) - [Singularity](https://singularity.lbl.gov/) - [podman](https://podman.io/) - [katacontainers](https://katacontainers.io/) - [Firecracker](https://firecracker-microvm.github.io/) [Más opciones](https://coreos.com/rkt/docs/latest/rkt-vs-other-projects.html) --- # Una aplicacion sencilla ```bash mkdir django_starter cd django_starter python -m venv django_starter_env source django_starter_env/bin/activate echo "django_starter_env" > .gitignore echo "*.pyc" >> .gitignore pip install django pip freeze > requirements.txt django-admin startproject django_starter . ./manage.py runserver ``` --- # TL;DR ```bash cat > Dockerfile << EOF FROM ubuntu:latest RUN apt update RUN apt install python3-pip -y RUN mkdir /code WORKDIR /code ADD requirements.txt /code RUN pip3 install -r requirements.txt ADD . /code/ EXPOSE 8000 CMD ["python3", "manage.py", "runserver", "0.0.0.0:8000"] EOF docker build -t ma0collazos/django_starter . docker run -p 9000:8000 ma0collazos/django_starter ``` --- class: center # Comandos de Docker ![Comandos de Docker](img/docker-commands.png) --- # Comandos `docker build`: Este comando toma un archivo Dockerfile y lo transforma en una imágen, creando las capas necesarias y almacenándolas en el equipo local con la etiqueta definida con el parámetro -t ```bash docker build -t ma0collazos/django_starter . ``` --- # Comandos `docker tag`: A partir de una imagen base, se crea una nueva con la etiqueta definida ```bash docker tag ma0collazos/django_starter registy.contraslash.com:5000/ma0collazos/django_starter ``` --- # Comandos `docker images`: Lista las imágenes construidas y disponibles en el sistema ```bash docker images ``` --- # Comandos `docker run`: Crea un contenedor a partir de una imagen existente en el sistema, existe se buscará la imagen en el registro por defecto de docker Docker Hub. Este comando suele venir con directivas importantes de ejecución como configuraciones por variables de ambiente con el argumento --env , directivas para ejecutar el contenedor en segundo plano con --detach, el nombre con el que se identificará este contenedor con--name puertos que se van a mapear al equipo anfitrión con --publish , carpetas compartidas con el anfitrión con --volume y muchos otros argumentos para definir por ejemplo límites en procesadores y memoria RAM, redes a la que se conectará, servidores DNS, direcciones IP todos disponibles en la documentación oficial del comando run. ```bash docker run \ --env DEBUG=True \ --name django_starter \ --publish 9000:8000 \ --volume ${PWD}/media:/code/media \ --detach \ ma0collazos/django_starter ``` --- # Comandos `docker ps`: Muestra los contenedores ejecutándose o detenidos en el sistema ```bash docker ps ``` --- # Comandos `docker stop`: Detiene un contenedor en ejecución ```bash docker stop django_starter ``` --- # Comandos `docker start`: Re inicia la ejecución de un contenedor deteindo ```bash docker start django_starter ``` --- # Comandos `docker inspect`: Inspecciona un contenedor mostrando toda su configuración ```bash docker inspect django_starter ``` --- # Comandos `docker logs`: Muestra los registros emitidos por el contenedor especificado ```bash docker logs django_starter ``` --- # Comandos `docker rm`: Elimina un contenedor detenido ```bash docker stop django_starter && docker rm django_starter ``` --- # Comandos `docker login`: Inicia sesión con un registro de docker. Si no se especifica un nombre de registro, se toma por defecto Docker Hub. ```bash # docker login registry.contraslash.com:5000 docker login ``` --- # Comandos `docker push`: Sube una imagen al registro determinado ```bash # docker push registry.contraslash.com:5000/ma0collazos/django_starter docker push ma0collazos/django_starter ``` --- # Comandos `docker pull`: Descarga una imagen desde un registro ```bash docker pull ma0collazos/django_starter ``` --- # Comandos `docker rmi`: Elimina una imagen ```bash docker rmi ma0collazos/django_starter ``` --- # Optimizacion Ubuntu es una distribucion completa, reducir por una minima ```bash FROM python:3.7-alpine RUN apt update RUN apt install python3-pip -y RUN mkdir /code WORKDIR /code ADD requirements.txt /code RUN pip3 install -r requirements.txt ADD . /code/ EXPOSE 8000 CMD ["python3", "manage.py", "runserver", "0.0.0.0:8000"] ``` --- # Optimizacion Hacer los cambios para que el Dockerfile funcione ```bash FROM python:3.7-alpine RUN apk update RUN mkdir /code WORKDIR /code ADD requirements.txt /code RUN pip3 install -r requirements.txt ADD . /code/ EXPOSE 8000 CMD ["python3", "manage.py", "runserver", "0.0.0.0:8000"] ``` --- # Optimizacion Olvidarnos de los caches ```bash FROM python:3.7-alpine RUN mkdir /code WORKDIR /code ADD requirements.txt /code RUN pip3 --no-cache-dir install -r requirements.txt ADD . /code/ EXPOSE 8000 CMD ["python3", "manage.py", "runserver", "0.0.0.0:8000"] ``` --- # Optimizacion Eliminar los archivos innecesarios ```bash echo "django_starter_env" > .dockerignore ``` --- # Optimizacion Reduzca en lo posible las operaciones que creen capas extras ```bash RUN apk update && \ apk add --no-cache --virtual .build-deps linux-headers binutils gcc musl-dev build-base zlib-dev pcre-dev && \ apk add --no-cache mariadb-dev mariadb-client jpeg-dev uwsgi uwsgi-python3 && \ LIBRARY_PATH=/lib:/usr/lib pip install --no-cache-dir uwsgi==2.0.18 mysqlclient==1.4.2 && \ apk del .build-deps ``` --- # Optimizacion Etiquete su imagen ```bash LABEL maintainer="ma0c
" \ org.label-schema.name="Alpine Django Deploy Common" \ org.label-schema.description="A base image to build Django images on top of Alpine Linux" \ org.label-schema.url="https://contraslash.com" \ org.label-schema.vcs-url="https://github.com/contraslash/docker-images/tree/master/alpine-django-deploy-common" ``` --- # Optimizacion - [Multi-Stage Build](https://docs.docker.com/develop/develop-images/multistage-build/) - [Mejores practicas](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/) - [Algunas de mis imagenes](https://github.com/contraslash/docker-images) --- # Huir antes de las preguntas ![huir](https://media.giphy.com/media/3o7ZePMv221orZKz84/giphy.gif)