1 | ¿Pq. necesitamos docker? | ![]() |
---|---|---|
2 | ¿Qué es y que aporta? | ![]() ![]() |
3 | Terminología docker | ![]() ![]() |
4 | Herramientas básicas | ![]() ![]() ![]() |
5 | Vamos a jugar… | ![]() ![]() ![]() ![]() |
(Aviso para navegantes… voy a tener que ir rápido. Pero si me paso, me paran.)
Soy Marc Bria. En los últimos 20 años he participado en varias comunidades de software libre (moodle, drupal, PKP…) y en varios grupos de investigación sobre tecnologías y educación (DEHISI, FIC, MoodleUAB…).
Desde 2014 trabajo en el Servicio de Publicaciones de la UAB como tecnólogo, analista, desarrollador, administrador de sistemas, "pelacables"… "cangura para todo".
Desde 2013 soy miembro del comité técnico del Public Knowledge Project (PKP, aka. "los del OJS").
Múltiples pilas (stacks) | Múltiples destinos (targets) |
---|---|
Lenguajes | Entornos de desarrollo locales |
Versiones | Preproducción |
Frameworks | Control de calidad (QA) |
Librerías | Puesta en escena (staging) |
Bases de datos | Producción: hierro, nube, híbrido… |
… | … |
Fuente: https://www.plesk.com/blog/business-industry/infographic-brief-history-linux-containerization
1978 chroot > 2000 jails > 2007 cgroups > 2008 linuxContainers > 2013 docker
Docker es una herramienta para empaquetar una aplicación junto con sus dependencias (librerías, configuración, datos…).
Así garantiza la portabilidad y a su vez, tiene efectos secundarios muy positivos como: el aislamiento, réplica, adaptabilidad, integración, reciclado, agilidad, resiliencia, backup…
De desarrollo a producción (y viceversa)
Staging > Continuous Integration
Réplica, escalabilidad, testing, alta disponibilidad…
The History of Pets vs Cattle and How to Use the Analogy Properly
~ Posted on Sep 29, 2016 by Randy Bias
Por si solo, no garantiza la seguridad, pero mejora respecto al modelo clásico.
Como los contenedores se pueden crear y destruir fácilmente, el sistema puede responder según la demanda.
La modularidad que ofrecen los micro-servicios permite pensar desarrollos a muy alto nivel, mediante cajas negras intercomunicadas con distintas funciones.
Más info: https://mobyproject.org
Docker usa git para gestionar las distintas versiones de las imágenes.
Los contenedores son más ligeros, rápidos y consumen menos recursos (disco, memoria y CPU), pero no pueden ejecutar sistemas operativos distintos al del anfitrión.
Fuente: https://trends.google.es/trends/explore?date=today 5-y&q=docker,vmware
Google: https://www.youtube.com/watch?v=tsk0pWf4ipw
Netflix: https://www.youtube.com/watch?v=CZ3wIuvmHe*M
Fuente: https://stackshare.io/docker
Mas información: https://www.featuredcustomers.com/vendor/docker/customers
ANTES | > AHORA… |
---|---|
Aplicaciones monolito | > Servicios desacoplados |
Largos ciclos de desarrollo | > Mejoras rápidas e iterativas |
Escalado planificado | > Escalado dinámico |
Único entorno/servidor | > Múltiples entornos/servidores |
Fuente: https://collabnix.com/demystifying-the-relationship-between-moby-docker
Para empezar: Docker Comunity Edition
Diseñado primero para GNU/Linux, también funciona sobre MacOS y Windows.
### Fuente: https://docs.docker.com/install/linux/docker-ce/debian/ ### AVISO: Este script es para Debian. No usar para ubuntu. ### Garantizar que no hay instalaciones previas: $ sudo apt-get remove docker docker-engine docker.io containerd runc ### Añadir dependencias $ sudo apt update $ sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common ### Añadir el repositorio de docker-ce $ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - $ sudo apt-key fingerprint 0EBFCD88 $ sudo sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/debian \ $(lsb_release -cs) stable" ### Instalar docker-ce $ sudo apt update $ sudo apt-get install docker-ce docker-ce-cli containerd.io ### Confirmar que el servicio está corriendo: $ sudo systemctl status docker ### Provar creando contenedor "hola mundo" $ sudo docker run hello-world ### Opcional: Ahorrarse el sudo $ sudo usermod -aG docker ${USER} ### Y reiniciar la sesión o hacer "su - ${USER}". ### Para añadir nuevos usuarios al grupo docker: $ sudo usermod -aG docker <username>
Para el resto de sistemas operativos: https://docs.docker.com/install
(También para Windows)
URL: https://labs.play-with-docker.com
(Nota: La web embedida puede fallar. Si sucede, usa el enlace.)
Dockerfile: Las instrucciones para construir la imagen. ["La receta"]
Imagen: El modelo abstracto de contenedor. ["El molde"]
Contenedor: La concreción de una imagen abstracta. ["La galleta"]
Volumen: Los datos, que pueden ser persistentes o volátiles. ["¿El plato?"]
Los contenedores son volátiles
Mascota vs ganado: Si falla, se sacrifica y se vuelven a generar.
FROM php:apache # Omeka-S web publishing platform for digital heritage collections (https://omeka.org/s/) # Initial maintainer: Oldrich Vykydal (o1da) - Klokan Technologies GmbH MAINTAINER Eric Dodemont <eric.dodemont@skynet.be> RUN a2enmod rewrite ENV DEBIAN_FRONTEND noninteractive RUN apt-get -qq update && apt-get -qq -y upgrade RUN apt-get -qq update && apt-get -qq -y --no-install-recommends install \ unzip \ libfreetype6-dev \ libjpeg62-turbo-dev \ libmcrypt-dev \ libpng-dev \ libjpeg-dev \ libmemcached-dev \ zlib1g-dev \ imagemagick \ libmagickwand-dev # Install the PHP extensions we need RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ RUN docker-php-ext-install -j$(nproc) iconv pdo pdo_mysql mysqli gd RUN pecl install mcrypt-1.0.2 && docker-php-ext-enable mcrypt && pecl install imagick && docker-php-ext-enable imagick # Add the Omeka-S PHP code COPY ./omeka-s-1.4.0.zip /var/www/ RUN unzip -q /var/www/omeka-s-1.4.0.zip -d /var/www/ \ && rm /var/www/omeka-s-1.4.0.zip \ && rm -rf /var/www/html/ \ && mv /var/www/omeka-s/ /var/www/html/ COPY ./imagemagick-policy.xml /etc/ImageMagick/policy.xml COPY ./.htaccess /var/www/html/.htaccess # Add some Omeka modules COPY ./omeka-s-modules-v4.tar.gz /var/www/html/ RUN rm -rf /var/www/html/modules/ \ && tar -xzf /var/www/html/omeka-s-modules-v4.tar.gz -C /var/www/html/ \ && rm /var/www/html/omeka-s-modules-v4.tar.gz # Add some themes COPY ./centerrow-v1.4.0.zip ./cozy-v1.3.1.zip ./thedaily-v1.4.0.zip /var/www/html/themes/ RUN unzip -q /var/www/html/themes/centerrow-v1.4.0.zip -d /var/www/html/themes/ \ && unzip -q /var/www/html/themes/cozy-v1.3.1.zip -d /var/www/html/themes/ \ && unzip -q /var/www/html/themes/thedaily-v1.4.0.zip -d /var/www/html/themes/ \ && rm /var/www/html/themes/centerrow-v1.4.0.zip /var/www/html/themes/cozy-v1.3.1.zip /var/www/html/themes/thedaily-v1.4.0.zip # Create one volume for files and config RUN mkdir -p /var/www/html/volume/config/ && mkdir -p /var/www/html/volume/files/ COPY ./database.ini /var/www/html/volume/config/ RUN rm /var/www/html/config/database.ini \ && ln -s /var/www/html/volume/config/database.ini /var/www/html/config/database.ini \ && rm -Rf /var/www/html/files/ \ && ln -s /var/www/html/volume/files/ /var/www/html/files \ && chown -R www-data:www-data /var/www/html/ \ && chmod 600 /var/www/html/volume/config/database.ini \ && chmod 600 /var/www/html/.htaccess VOLUME /var/www/html/volume/ CMD ["apache2-foreground"]
Fuente: https://github.com/dodeeric/omeka-s-docker/blob/master/Dockerfile
Recuerda: Monolítico vs Micro-servicios
1) Dockerfile: El Dockerfile se construye ("build") para crear una "imagen":
$ docker build [options]
2) Imagen: La "imagen" se ejecuta ("run") para crear un "contendor":
$ docker run [options] image-name
1-2) Contenedor: En la definición (Dockerfile) o al iniciarlos, los "contendores" incluyen o se asocian a "volúmenes".
$ docker run [options] -v ./web:/var/www/html img-name
$ docker build
$ docker run [options] [containerIDoName]
$ docker ps $ docker ps -a
$ docker stop [containerIDoName]
$ docker start [containerIDoName]
$ docker logs [containerIDoName]
$ docker rm [containerIDoName]
version: "2" services: mariadb: image: mariadb:latest restart: always networks: - network1 volumes: - mariadb:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: blabla MYSQL_DATABASE: omeka MYSQL_USER: omeka MYSQL_PASSWORD: omeka pma: depends_on: - mariadb image: phpmyadmin/phpmyadmin:latest restart: always networks: - network1 ports: - "8080:80" links: - mariadb:db omeka: depends_on: - mariadb image: dodeeric/omeka-s:latest restart: always networks: - network1 ports: - "80:80" links: - mariadb:db volumes: - omeka:/var/www/html/volume volumes: mariadb: omeka: networks: network1:
Fuente: https://github.com/dodeeric/omeka-s-docker/blob/master/docker-compose.yml
En este ejercicio aprenderás a crear una imagen Docker que contenga un sitio web estático sobre un servidor web Nginx. Algunos comandos intimidan un poco, pero la idea es simple. Vamos a construir la siguiente "pila" (en inglés le llaman "stack"):
Si queremos desacoplar los servicios, debemos construir múltiples contenedores y comunicarlos entre si. Esto se puede hacer "a mano" pero es tedioso. Para coordinar distintos contenedores que funcionan conjuntamente, se ha creado Docker Compose (hay quien lo llama orquestrador).
En el siguiente ejercicio vamos a ver como crear un docker-compose.yml para iniciar y comunicar distintos distintos servicios.
Servei de publicacions de la UAB
PKP's technical committee (at large member)
AVISO: Ningún animal ha sido dañado durante esta presentación.