Hay dos páginas de ejercicios de Docker:
Los contenedores se distinguen de las máquinas virtuales en que las máquinas virtuales emulan un ordenador físico en el que se instala un sistema operativo completo, mientras que los contenedores usan el kernel del sistema operativo anfitrión pero contienen las capas superiores (sistema de ficheros, utilidades, aplicaciones).
Al ahorrarse la emulación del ordenador y el sistema operativo de la máquina virtual, los contenedores son más pequeños y rápidos que las máquinas virtuales. Pero al incluir el resto de capas de software, se consigue el aislamiento e independencia entre contenedores que se busca con las máquinas virtuales.
Los contenedores son útiles en los servidores, pero también para pruebas de software, ya que incluyen todos los elementos que necesitan las aplicaciones, lo que facilita la instalación y elimina los problemas de incompatibilidad de versiones en bibliotecas y aplicaciones auxiliares. También podría utilizarse para la distribución de software en general, pero en ese caso juega en contra la duplicidad que supone el que cada contenedor incluye todas las capas de software.
Docker es un sistema de virtualización de aplicaciones mediante contenedores, creado por Solomon Hykes y otros ingenieros. En 2013 se convirtió en un proyecto de software libre (licencia Apache) en el que participan cada vez más empresas. La versión 1.0 se publicó en junio de 2014 y ha tenido un desarrollo muy rápido.
En marzo de 2017, Docker anunció una desarrollo todavía más rápido, pasando a publicar una nueva versión cada mes. La numeración de las versiones adoptó al formato AA.MM (año y mes). Estas versiones mensuales se mantuvieron solamente durante un mes, aunque cada trimestre una de esas versiones se mantuvo durante cuatro meses (la primera fue Docker 17.03).
En julio de 2018, Docker anunció [archive.org] que volvían a un desarrollo más pausado. Por un lado, se dejaron de publicar las versiones mensuales (aunque se publica una versión diaria inestable) y que a partir de Docker 18.09, en vez de una versión "estable" cada tres meses habría una versión "estable" cada seis meses que se mantendrá durante siete meses. Aunque la denominación de cada versión sigue la regla mes-año, en la práctica las versiones se están publicando meses después de la fecha teórica.
Docker ofrecía una versión Enterprise (de pago) y una versión Community (gratuita). La diferencia radicaba en el nivel de soporte y certificación que proporcionaba Docker a la versión Enterprise.
Pero en noviembre de 2019, Docker anunció la venta de su división empresarial a Mirantis, una empresa de servicios en la nube especializada en Kubernetes y OpenStack. Docker pretende centrarse en las herramientas dirigidas a desarrolladores: Docker Desktop y Docker Hub.
Docker empezó estando disponible solamente para distribuciones GNU/Linux, pero desde junio de 2016 también está disponible como aplicación nativa en Windows Server 2016 y Windows 10.
Docker utiliza la virtualización ofrecida por el sistema operativo. En el caso de Windows 10, eso significa que para usar Docker de forma nativa hay que activar Hyper-V que, por desgracia, es incompatible con VirtualBox. Para poder utilizar Docker en Windows 7 o en Windows 10 sin Hyper-V, Docker ofrece desde agosto de 2015 Docker Toolbox, que realmente es una máquina virtual (que se ejecuta en VirtualBox) que contiene Docker.
El componente básico de Docker es el Docker Engine, pero Docker ofrece también una serie de herramientas para administrar, distribuir e instalar contenedores: Docker Compose, Docker Desktop, etc.
Aunque un contenedor puede incluir cualquier número de aplicaciones, lo habitual es que un contenedor contenga una sola aplicación (y los programas necesarios para ponerse en marcha). Por ejemplo, si una aplicación web guarda la información en una base de datos, en vez de incluir la aplicación y la base de datos en el mismo contenedor, se suelen crear dos contenedores: uno con la aplicación web y otro con la base de datos. Por supuesto, en el contenedor de la aplicación web sí que se incluiría un servidor web.
Para que varios contenedores puedan comunicarse entre sí, Docker permite la creación de redes virtuales privadas en la que se incluyen los contenedores.
Cuando varios contenedores contienen aplicaciones web, los servidores web de cada contenedor en principio entrarían en conflicto puesto que todos atienden al puerto 80. Ese problema se presenta siempre que contenedores distintos incluyen aplicaciones que atienden a través de los mismos puertos (base de datos, etc.). Para resolver este problema, Docker permite que los contenedores escuchen por un puerto cualquiera, aunque internamente el servidor sigue utilizando su puerto habitual. En estos casos se debe utilizar un proxy inverso que redirija las peticiones exteriores al puerto correspondiente.
El proceso de creación de un contenedor incluye varias fases.
No es necesario realizar todas estas fases para crear un contenedor, pues en Internet podemos encontrar imágenes ya preparadas por los creadores de las aplicaciones o por terceros (como Bitnami).
Los contenedores Docker de aplicaciones de Bitnami incluyen únicamente la aplicación, aunque también están disponibles contenedores de aplicaciones de infraestructura (lenguajes de programación, bases de datos, servidores web, etc.).
Actualmente (diciembre de 2019) el número de contenedores que ofrece Bitnami es menor que el que ofrece en forma de instaladores (unos 120 contenedores frente a unos 200 instaladores).
Los contenedores de Bitnami están creados con una herramienta que se llamaba Stacksmith y que desde 2019 se integra en la plataforma Tanzu, que vmware ofrece para crear contenedores personalizados.
sudo docker COMANDOS
sudo docker
sudo docker image
sudo docker network
...
sudo docker cp --help
sudo docker COMANDO --OPCIÓN=VALOR
sudo docker COMANDO --OPCIÓN VALOR
sudo docker COMANDO --OPCIÓN="VALOR CON ESPACIOS"
sudo docker COMANDO --OPCIÓN "VALOR CON ESPACIOS"
En los comandos siguientes REPOSITORIO es el nombre del repositorio en el que se encuentra la imagen (por ejemplo bitnami/phpmyadmin) e IMAGEN es el nombre de la imagen descargada. Realmente, las imágenes descargadas se llaman igual que los repositorios de donde se han descargado, pero he distinguido los nombres para dejar claro cuándo nos estamos haciendo referencia a la imagen del repositorio y cuándo a la imagen local.
sudo docker image OPCIONES
sudo docker image pull REPOSITORIO
sudo docker pull REPOSITORIO
sudo docker image ls
sudo docker image rm IMAGEN
En los comandos siguientes CONTENEDOR es el nombre del contenedor, que podemos elegir al crearlo, y RED es el nombre de una red ya existente.
sudo docker run --name=CONTENEDOR REPOSITORIO
El problema de este comando es que dejamos de tener acceso a la shell y sólo se puede parar el proceso desde otro terminal.
Lo habitual es poner en marcha el contenedor en modo separado (detached), es decir, en segundo plano, y así podemos seguir utilizando la shell:
sudo docker run -d --name=CONTENEDOR REPOSITORIO
Si queremos ver la secuencia de arranque del contenedor, podemos poner en marcha el contenedor en modo pseudo-tty, que trabaja en primer plano, pero del que podemos salir con Ctrl+C.
sudo docker run -t --name=CONTENEDOR REPOSITORIO
Al crear el contenedor se pueden añadir diversas opciones:
sudo docker run --name=CONTENEDOR --net=RED REPOSITORIO
sudo docker run --name=CONTENEDOR -p PUERTO_EXTERNO:PUERTO_INTERNO REPOSITORIO
sudo docker run --name=CONTENEDOR -e VARIABLE=VALOR REPOSITORIO
Las variables de configuración se pueden consultar en el repositorio del que obtenemos la imagen.
sudo docker ps
sudo docker ps -a
sudo docker stop CONTENEDOR
sudo docker stop $sudo docker ps -aq)
sudo docker rm CONTENEDOR
sudo docker start CONTENEDOR
sudo docker exec -it CONTENEDOR /bin/bash
sudo docker exec -u 0 -it CONTENEDOR /bin/bash
exit
sudo docker cp CONTENEDOR:ORIGEN DESTINO
sudo docker cp ORIGEN CONTENEDOR:DESTINO
En los comandos siguientes RED es el nombre de la red privada.
sudo docker network OPCIONES
sudo docker network create RED
sudo docker network ls
sudo docker network inspect RED
sudo docker network rm RED
sudo docker system df
sudo docker container prune
sudo docker image prune
sudo docker volume prune
sudo docker network prune
sudo docker system prune