= docker (first contact) {{tag>docker}} == un poco de historia * docker monta un sistema de containerización que permite lanzar nuevas instancias de S.O. aprovechando los recursos (hard) de la máquina Y el kernel del SO ya corriendo, lo que hace más óptimo el aprovechamiendo de recursos que las máquinas virtuales (que recrean un ordenador al completo, con sus propios kernels y sistemas de ficheros) * Se basa en la tecnología LXC (LinuX Containers) presente en el kernel desde la versión 3.8 * Grandes beneficios: * portabilidad de aplicaciones * aislamiento de procesos * prevenir la fragilidad del exterior * manejo de recursos * Partes de funcionamiento de Docker: * docker daemon * docker CLI * docker image index * Elementos de Docker: * contenedores * imágenes * dockerfiles == enlaces de interés * docs docker: - [[https://docs.docker.com/engine/tutorials/dockerizing/]] - [[https://docs.docker.com/engine/tutorials/usingdocker/]] - [[https://docs.docker.com/engine/tutorials/dockerimages/]] - [[https://docs.docker.com/engine/tutorials/networkingcontainers/]] - [[https://docs.docker.com/engine/tutorials/dockervolumes/]] * otros enlaces de la red (básicos) * [[http://www.muylinux.com/2016/04/19/tutorial-docker]] * [[https://www.adictosaltrabajo.com/tutoriales/docker-for-dummies/]] * [[https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-getting-started]] * [[https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04]] * más enlaces (más avanzados) * [[https://www.digitalocean.com/community/tutorials/docker-explicado-como-crear-contenedores-de-docker-corriendo-en-memcached-es]] * [[https://github.com/wsargent/docker-cheat-sheet/#volumes]] == instalación - Asegurarse que disponemos de https y certificados en APT:$ sudo apt-get install apt-transport-https ca-certificates - Añadir clave GPG de los repositorios DOCKER: $ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D - Añadir un nuevo repositorio en ''/etc/apt/sources.list.d/docker.list'':deb https://apt.dockerproject.org/repo ubuntu-xenial main - Actualizar información respositorios, instalar: $ sudo apt-get update ; sudo apt-get install docker.io - Añadir nuestro usuario al grupo de DOCKER para poder trabajar sin SUDO:$ sudo usermod -a -G docker $USER - Refrescamos el grupo para poder trabajar sin cerrar sesión (este comando hace de docker nuestro grupo principal durante la sesión):$ newgrp docker == imágenes Las imágenes son las plantillas a partir de las cuales creamos los contenedores de trabajo (como instanciar el objeto de una clase en OOP) existe en [[https://www.docker.com/]] un repositorio de imágenes para descargar, tanto oficiales de distros como de usuarios. * para buscar imágenes disponibles en contenedores:$ docker search * para descargar una imagen: $ docker pull * para ver las imágenes descargadas: $ docker images * para borrar una imagen: $ docker rmi * añadir tag a imagen (crea copia de la imagen):$ docker tag /: Pendiente: * $ docker images --digest | head == contenedores El contenedor (en el principio de su existencia) coge la referencia de una imagen y se crea. Se pueden crear tantos contenedores de la misma imagen como se precisen === mantenimiento (de contenedores) * listar todos los contenedores existentes:$ docker ps -a * listar todos los contenedores activos:$ docker ps * listar los últimos contenedores creados:$ docker ps -l * parar un contenedor: $ docker stop * borrar un contenedor (no ha de estar en funcionamiento): $ docker rm * convertir un contenedor en imagen: $ docker commit -m "" -a "" : el nombre del contenedor puede ser su CONTAINER_ID o si NAME (según aparece en el listado generado con el comando correspondiente) === ejecución * crear (si no existe) y ejecutar en modo interactivo (i) con pseudoterminal (t):$ docker run -it * ejecutar en modo interactivo, borrar al salir:$ docker run -it --rm * poner en marcha un contenedor: $ docker start * poner en marcha contenedor como demonio (-d), mapeo de puerto y ejecución de comando:$ docker run -d -p : * poner en marcha contenedor con nombre propio:$ docker run -d --name * poner en marcha contenedor mapeando los puertos aleatoriamente (se consulta en ''$ docker ps'':$ docker run -d -P * acceder a un contenedor en marcha: $ docker attach * salir de un contenedor (detach), haciendo que continue funcionando: '' CONTROL+P + CONTROL+Q '' * abrir un terminal en un contenedor:$ docker exec -it bash === funcionamiento * mostrar la salida (STDOUT) de un contenedor, con watch (estilo ''tail -f'':$ docker -f logs * mostrar procesos de un contenedor:$ docker top * información del contenedor en formato JSON:$ docker inspect * recoger una clave del JSON:$ docker inspect -f '' === networking Por defecto, el motor de docker crea una serie de redes para trabajar con los contenedores: * host * bridge también existen los drivers ''overlay'' -> ??? Aunque permite crear propias y añadir contenedores a ellas para que se hablen de manera aislada * mostrar redes de docker:$ docker network ls * inspeccionar red:$ docker network inspect * desconectar contenedor de una red:$ docker network disconnect * mapear puerto del contenedor, devuelve puerto de máquina local:$ docker port * crear red propia (tipo bridge, flag -d): docker network create -d bridge * ejecutar contenedor con una red propia:$ docker run -d --network= * añadir contenedor en marcha a una red propia:$ docker network connect * averiguar IP de contenedor:$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' === Data Volumes es un directorio especificado trabajando en UFS((Union File System - [[https://docs.docker.com/engine/reference/glossary/#union-file-system]])) que: * los Volumenes se inicializan al crear el contenedor. Si existe información en el punto de montaje, esta se copiará al Volumen * los Volumenes se puede compartir y reusar entre contenedores * los cambios se aplican directamente en los Volumenes * los cambios en los Volumenes no se aplican cuando se actualiza una imagen * los Volumenes no son destruidos al destruir el contenedor que los usa * se puede acceder a los volúmenes creados en: ''/var/lib/docker/volumes'' * añadir un Volumen anónimo a un contenedor "al vuelo":$ docker run -d -P --name web -v /webapp training/webapp * añadir un Volumen anónimo a un contenedor "al vuelo" y borrar todo al salir:$ docker run -d -rm --name web -v /webapp training/webapp * crear un Volumen para su posterior uso:$ docker volume create -d -o size=20GB --name * "flocker" es un plugin de Volumen que provee de multi-hosts * [[https://docs.docker.com/engine/extend/legacy_plugins/#/volume-plugins|lista de plugins para la creación de Volumenes]] * añadir Volumen existente a contenedor:$ docker run -d -P -v :/ .... * añadir un directorio local en un contenedor, con opción de solo-lectura (ro):$ docker run -d -P --name web -v :[:ro] training/webapp python app.py * añadir fichero local en contenedor: $ docker run --rm -it -v ~/.bash_history:/root/.bash_history * crear Volumen usando contenedor y compartir entre varios contenedores. El directorio será ''/dbdata''. Se pueden añadir varios ''--volumes''. Permite contatenar entre los diferentes contenedores (db3):$ docker create -v /dbdata --name dbstore training/postgres /bin/true $ docker run -d --volumes-from dbstore --name db1 training/postgress $ docker run -d --volumes-from dbstore --name db2 training/postgress $ docker run -d --volumens-from db1 --name db3 training/postgress * backup de Volumenes (en host local). Crea un .tar del Volumen /dbdata en el directorio loca en curso. Destruye todo al finalizar:$ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata * restore de tar:$ docker run -v /dbdata --name dbstore2 ubuntu /bin/bash $ docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1" * mostrar Volumenes: $ docker volume ls * mostrar Volumenes clgados (huérfanos): $ docker volume ls -f dangling=true * borrar volúmenes:$ docker volume rm * borrar Volumenes con el borrado del contenedor:$ docker rm -v Pendiente: * Volume labels == otros comandos $ docker version $ docker info == dockerfiles los "dockerfiles" son ficheros de procesamiento que le dicen a docker como construir una nueva imagen de manera "desatendida" formato del dockerfile: FROM ubuntu MAINTAINER ENV http_proxy http://user:pass@proxy/ ENV https_proxy http://user:pass@proxy/ RUN apt-get update RUN apt-get install apache2 -y RUN echo "

Apache with Docker

" > /var/www/html/index.html EXPOSE 80 ENTRYPOINT apache2ctl -D FOREGROUND
- FROM: imagen base - MAINTAINER: autor de la imagen - ENV: variables de entorno en la imagen base - RUN: ejecuta una sentencia en la imagen base - EXPOSE: abrimos el puerto especificado en el contenedor para que se pueda mapear desde el anfitrion - ENTRYPOINT: que se debe ejecutar cada vez que se ejecute el contenedor $ docker build -t / == repositorio de imágenes para subir una imagen a los repositorios públicos (Docker Hub) * autentificación con docker.com:$ docker login -u * subir imagen a repositorio:$ docker push /