Aquesta és una revisió antiga del document
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:
- otros enlaces de la red (básicos)
- más enlaces (más avanzados)
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 <cadena>
- para descargar una imagen:
$ docker pull <nombre_imagen>
- para ver las imágenes descargadas:
$ docker images
- para borrar una imagen:
$ docker rmi <nombre_imagen>
- añadir tag a imagen (crea copia de la imagen):
$ docker tag <nombre_imagen> <usuario>/<nombre_imagen>:<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 <nombre_contenedor>
- borrar un contenedor (no ha de estar en funcionamiento):
$ docker rm <nombre_contenedor>
- convertir un contenedor en imagen:
$ docker commit -m "<comentario>" -a "<autor>" <id_contenedor> <repositorio>:<nombre_imagen>
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 <nombre_contenedor>
- ejecutar en modo interactivo, borrar al salir:
$ docker run -it --rm <nombre_contenedor>
- poner en marcha un contenedor:
$ docker start <nombre_contenedor>
- poner en marcha contenedor como demonio (-d), mapeo de puerto y ejecución de comando:
$ docker run -d <nombre_imagen> -p <puerto_local>:<puerto_docker> <comando>
- poner en marcha contenedor con nombre propio:
$ docker run -d <nombre_imagen> --name <nombre_propio_contenedor>
- poner en marcha contenedor mapeando los puertos aleatoriamente (se consulta en
$ docker ps
:$ docker run -d -P <nombre_imagen>
- acceder a un contenedor en marcha:
$ docker attach <nombre_contenedor>
- salir de un contenedor (detach), haciendo que continue funcionando:
CONTROL+P + CONTROL+Q
- abrir un terminal en un contenedor:
$ docker exec -it <nombre_contenedor> bash
funcionamiento
- mostrar la salida (STDOUT) de un contenedor, con watch (estilo
tail -f
:$ docker -f logs <nombre_contenedor>
- mostrar procesos de un contenedor:
$ docker top <nombre_contenedor>
- información del contenedor en formato JSON:
$ docker inspect <nombre_contenedor>
- recoger una clave del JSON:
$ docker inspect -f '<clave JSON>' <nombre_contenedor>
networking
Por defecto, el motor de docker crea una serie de redes para trabajar con los contenedores:
- host
- bridge
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 <red>
- desconectar contenedor de una red:
$ docker network disconnect <red> <nombre_contenedor>
- mapear puerto del contenedor, devuelve puerto de máquina local:
$ docker port <nombre_contenedor> <puerto>
- crear red propia (tipo bridge, flag -d):
docker network create -d bridge <nombre_red>
- ejecutar contenedor con una red propia:
$ docker run -d --network=<nombre_red> <nombre_imagen>
- añadir contenedor en marcha a una red propia:
$ docker network connect <nombre_red> <nombre_contenedor>
- averiguar IP de contenedor:
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <nombre_contenedor>
Data Volumes
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 <autor> 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 "<h1>Apache with Docker</h1>" > /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 <autor>/<imagen> <path_fichero_docker>
repositorio de imágenes
para subir una imagen a los repositorios públicos (Docker Hub)
- autentificación con docker.com:
$ docker login -u <usuario>
- subir imagen a repositorio:
$ docker push <usuario>/<nombre_imagen>