En nuestro tutorial de Docker, ex­pli­ca­mos la pla­ta­fo­r­ma de vi­r­tua­li­za­ción Docker y te brindamos in­s­tru­c­cio­nes fáciles de seguir sobre cómo uti­li­zar­la en tu sistema Ubuntu 22.04.

VPS gratis
Prueba un servidor virtual de forma gratuita durante 30 días

¡Prueba tu servidor virtual durante 30 días! Si lo solicitas, te re­em­bo­l­sa­re­mos todos los gastos in­cu­rri­dos.

Docker: es­tru­c­tu­ra y funciones

Con el eslogan “Build, Ship and Run Any App, Anywhere” la pla­ta­fo­r­ma de co­n­te­ne­do­res de código abierto Docker pro­mo­cio­na una al­te­r­na­ti­va flexible y eficiente a la emulación de co­m­po­ne­n­tes de hardware basada en máquinas virtuales (VM).

A di­fe­re­n­cia de la vi­r­tua­li­za­ción tra­di­cio­nal de hardware, que implica iniciar di­fe­re­n­tes sistemas huésped en un mismo sistema anfitrión (host), Docker permite que las apli­ca­cio­nes se ejecuten como procesos aislados dentro del mismo sistema gracias a los co­n­te­ne­do­res. Por lo tanto, en la vi­r­tua­li­za­ción de se­r­vi­do­res basada en co­n­te­ne­do­res, se logra una vi­r­tua­li­za­ción a nivel del sistema operativo.

Imagen: Comparación entre máquinas virtuales y contenedores de Docker
Mientras que cada máquina virtual inicia su propio sistema operativo, los co­n­te­ne­do­res de Docker comparten el núcleo (kernel

La principal ventaja de la vi­r­tua­li­za­ción basada en co­n­te­ne­do­res radica en que las apli­ca­cio­nes con di­fe­re­n­tes re­qui­si­tos pueden eje­cu­tar­se de forma aislada sin la so­bre­ca­r­ga de sistemas huésped separados. Además, las apli­ca­cio­nes en co­n­te­ne­do­res se pueden utilizar de manera mu­l­ti­pla­ta­fo­r­ma y en diversas in­frae­s­tru­c­tu­ras, sin necesidad de ada­p­tar­las a las co­n­fi­gu­ra­cio­nes de hardware o software del sistema host.

Docker es el proyecto de software más conocido de los que ofrecen te­c­no­lo­gía de vi­r­tua­li­za­ción basada en co­n­te­ne­do­res. La pla­ta­fo­r­ma de código abierto consta de tres co­m­po­ne­n­tes pri­n­ci­pa­les: el motor Docker (Docker engine), las imágenes Docker y el re­po­si­to­rio Docker Hub.

Consejo

Los co­n­te­ne­do­res e imágenes Docker suelen ser genéricos, pero también pueden pe­r­so­na­li­zar­se si es necesario. Puedes obtener más in­fo­r­ma­ción al respecto en nuestro artículo sobre co­n­te­ne­do­res Docker.

Docker Images

De forma similar a las máquinas virtuales, los co­n­te­ne­do­res de Docker se basan en imágenes Docker, que son pla­n­ti­llas de solo lectura con todas las in­s­tru­c­cio­nes ne­ce­sa­rias para que el motor Docker cree un co­n­te­ne­dor. Una imagen Docker es una re­pre­se­n­ta­ción portátil de un co­n­te­ne­dor, pre­se­n­ta­da en forma de archivo de texto, es decir, un Do­c­ke­r­fi­le. Antes de iniciar un co­n­te­ne­dor en un sistema, se carga un paquete con la imagen co­rre­s­po­n­die­n­te, a menos que ya esté al­ma­ce­na­da lo­ca­l­me­n­te. La imagen cargada contiene todos los sistemas de archivos con los pa­rá­me­tros ne­ce­sa­rios para la ejecución. Un co­n­te­ne­dor es ese­n­cia­l­me­n­te un proceso en ejecución de una imagen.

Docker Hub

El Docker Hub es un registro para re­po­si­to­rios de software en la nube, es decir, actúa como una especie de bi­blio­te­ca para las imágenes Docker. Es un servicio en línea que contiene re­po­si­to­rios públicos y privados. Los re­po­si­to­rios públicos permiten a los usuarios subir sus propias imágenes y co­m­pa­r­ti­r­las con la comunidad. Aquí se en­cue­n­tran numerosas imágenes Docker oficiales rea­li­za­das por el equipo de de­sa­rro­lla­do­res, así como proyectos de código abierto co­n­so­li­da­dos. Por el contrario, no todo el mundo tiene acceso a las imágenes de los re­po­si­to­rios privados, aunque sí se pueden compartir dentro de la misma empresa o en un de­te­r­mi­na­do grupo. Al re­po­si­to­rio de Docker Hub se accede a través de hub.docker.com.

Motor Docker

El corazón de cualquier proyecto Docker es su motor, una apli­ca­ción cliente-servidor de código abierto di­s­po­ni­ble en todas las pla­ta­fo­r­mas es­ta­ble­ci­das en la versión actual.

La ar­qui­te­c­tu­ra básica del motor Docker consta de tres co­m­po­ne­n­tes pri­n­ci­pa­les: un Docker daemon, que funciona como servidor, una interfaz de pro­gra­ma­ción (API) basada en REST (Re­pre­se­n­ta­tio­nal State Transfer) y la terminal del sistema operativo (Command-Line Interface, CLI) como interfaz de usuario (client).

  • Docker daemon: el motor Docker utiliza un proceso daemon como servidor, que se ejecuta en segundo plano en el sistema host y permite el control central del motor. Además, se encarga de crear y ad­mi­ni­s­trar imágenes, co­n­te­ne­do­res o redes.
  • La API REST: es­pe­ci­fi­ca un conjunto de in­te­r­fa­ces que permite a otros programas in­ter­ac­tuar y dar in­s­tru­c­cio­nes al daemon . Uno de los cuales es la terminal del sistema operativo.
  • La terminal: Docker utiliza la terminal del sistema operativo como programa cliente, la cual in­ter­ac­cio­na con el daemon a través de la API REST y permite a los usuarios controlar el daemon a través de scripts o comandos.
Consejo

En 2017, el motor Docker fue re­no­m­bra­do como Docker Community Edition (abreviado como Docker CE), aunque la do­cu­me­n­ta­ción oficial y los re­po­si­to­rios de Docker siguen usando en su mayoría el nombre antiguo. Además de Docker CE, también existe el Docker En­te­r­pri­se Edition (Docker EE), que ofrece algunas ca­ra­c­te­rí­s­ti­cas premium. Sin embargo, Docker EE no es gratuito y se orienta más hacia las empresas.

Con los comandos de Docker, los usuarios pueden ejecutar, detener o gestionar los co­n­te­ne­do­res de software di­re­c­ta­me­n­te desde la terminal. Uti­li­za­n­do el comando docker junto con in­s­tru­c­cio­nes como build (crear), pull (descargar) o run (ejecutar), es posible co­mu­ni­car­se con el daemon, pe­r­mi­tie­n­do que el cliente y el servidor estén en el mismo sistema. Además, también es posible co­mu­ni­car­se con el daemon desde otro sistema. La co­mu­ni­ca­ción entre el cliente y el servidor puede rea­li­zar­se a través de la API REST, sockets UNIX o una interfaz de red, según el tipo de conexión requerida.

La siguiente imagen muestra cómo se combinan los co­m­po­ne­n­tes in­di­vi­dua­les de Docker, uti­li­za­n­do los comandos docker build, docker pull y docker run como ejemplos:

Imagen: Presentación esquemática de la arquitectura Docker
La ar­qui­te­c­tu­ra Docker se basa en la co­m­bi­na­ción de cliente (terminal

El comando docker build da in­s­tru­c­cio­nes al daemon para crear una imagen (línea punteada), uti­li­za­n­do el Do­c­ke­r­fi­le co­rre­s­po­n­die­n­te. El comando docker pull (línea di­s­co­n­ti­nua) se ejecuta cuando el usuario no ha creado la imagen, sino que la obtiene de un re­po­si­to­rio en Docker Hub. Si se ordena al daemon iniciar un co­n­te­ne­dor con el comando docker run, primero verifica si la imagen que se necesita está al­ma­ce­na­da de forma local. Si es así, el co­n­te­ne­dor se inicia (línea continua). En caso contrario, el daemon obtiene la imagen di­re­c­ta­me­n­te del re­po­si­to­rio.

Se­r­vi­do­res dedicados
Re­n­di­mie­n­to e in­no­va­ción
  • Pro­ce­sa­do­res de última ge­ne­ra­ción
  • Hardware dedicado de alto re­n­di­mie­n­to
  • Seguridad de primer nivel

Trabajar con Docker

Ha llegado el momento de fa­mi­lia­ri­zar­se con las po­si­bi­li­da­des de apli­ca­ción de la pla­ta­fo­r­ma de co­n­te­ne­do­res. Si aún no has instalado el motor Docker, puedes hacerlo a través de la terminal de Linux. Puedes encontrar in­s­tru­c­cio­nes sobre cómo hacerlo en nuestro artículo “instalar Docker en Ubuntu 22.04”. A co­n­ti­nua­ción, apre­n­de­rás a manejar el motor Docker desde la consola, conocerás las ca­pa­ci­da­des de Docker Hub y co­m­pre­n­de­rás por qué los co­n­te­n­do­res re­pre­se­n­tan una re­vo­lu­ción en la gestión de apli­ca­cio­nes.

Consejo

Si quieres instalar Docker en otra di­s­tri­bu­ción de Linux o en Windows, las si­guie­n­tes guías te serán de gran ayuda:

Cómo manejar el motor Docker

Desde la versión 16.04, Ubuntu utiliza el programa systemd(abre­via­tu­ra de “system aemon”) para gestionar procesos.systemdes un proceso init que también puede uti­li­zar­se en otras di­s­tri­bu­cio­nes de Linux como RHEL, CentOS o Fedora, y ge­ne­ra­l­me­n­te se ide­n­ti­fi­ca con el ID de proceso 1. Como primer proceso del sistema, el daemon es re­s­po­n­sa­ble de iniciar, detener y hacer el se­gui­mie­n­to del resto de procesos. En versiones previas de Ubuntu (14.10 y an­te­rio­res), el programaupstart se encargaba de dichas funciones.

También se puede controlar al Docker daemon a través de systemd. En la in­s­ta­la­ción estándar, la pla­ta­fo­r­ma de co­n­te­ne­do­res está co­n­fi­gu­ra­da para que el daemon se inicie au­to­má­ti­ca­me­n­te al arrancar el sistema. No obstante, el ajuste pre­de­te­r­mi­na­do se puede cambiar uti­li­za­n­do la he­rra­mie­n­ta systemctl de línea de comandos.

Con el objetivo de controlar un proceso o conocer su estado, puedes mandar órdenes a systemd mediante systemctl. La sintaxis de dicho comando es la siguiente:

systemctl [OPCIÓN] [COMANDO]
bash

Algunos comandos hacen re­fe­re­n­cia a de­te­r­mi­na­dos recursos, como Docker. La te­r­mi­no­lo­gía de systemd se refiere a los recursos como units (unidades). En cuyo caso, el comando deriva de las in­s­tru­c­cio­nes co­rre­s­po­n­die­n­tes y del nombre de la unidad a la que se dirige.

Si quieres activar (enable) o des­ac­ti­var (disable) el inicio au­to­má­ti­co del Docker daemon, utiliza la he­rra­mie­n­ta systemctl con los si­guie­n­tes comandos:

sudo systemctl enable docker
sudo systemctl disable docker
bash

systemctl también permite consultar el estado de una unidad:

sudo systemctl status docker
bash

Si el motor Docker está activo en el sistema Ubuntu, la salida en la terminal debería ser la siguiente:

Imagen: La consulta de estado con systemctl muestra que el motor Docker está activo (running)
Consulta de estado con systemctl: el motor Docker está activo (running)

Si el motor Docker se encuentra des­ac­ti­va­do, te aparecerá el estado como inactivo (dead) por lo que será necesario iniciar Docker daemon de forma manual para ejecutar los co­n­te­ne­do­res.

Imagen: La consulta de estado con systemctl muestra: el motor Docker está inactivo (dead)
Consulta de estado con systemctl: el motor Docker está inactivo (dead)

Si quieres iniciar, detener o reiniciar el motor Docker de forma manual, dirígete a systemd con uno de los si­guie­n­tes comandos:

Para iniciar el daemon des­ac­ti­va­do utiliza systemctl junto con el comando start:

sudo systemctl start docker
bash

Si lo que quieres es detener el Docker daemon, utiliza el comando stop:

sudo systemctl stop docker
bash

Para reiniciar el motor, utiliza restart:

sudo systemctl restart docker
bash

Cómo usar Docker Hub

Si el motor Docker re­pre­se­n­ta el corazón de la pla­ta­fo­r­ma de co­n­te­ne­do­res, Docker Hub es el alma del proyecto de código abierto, ya que aquí es donde la comunidad se reúne. Los usuarios en­cue­n­tran en el registro en la nube todo lo que necesitan para dar vida a la in­s­ta­la­ción de Docker.

El servicio en línea ofrece diversos re­po­si­to­rios oficiales con más de 100 000 apli­ca­cio­nes gratuitas. Los usuarios también tienen la po­si­bi­li­dad de crear sus propias imágenes y co­m­pa­r­ti­r­las con grupos de trabajo. Además del soporte pro­fe­sio­nal que ofrece el equipo de de­sa­rro­lla­do­res, aquí también es posible co­ne­c­tar­se con la comunidad de usuarios. En GitHub, los usuarios tienen acceso a un foro de soporte.

Imagen: Docker Hub: apartado de registro
El Docker ID personal se crea de forma gratuita en el apartado del registro / Fuente: hub.docker.com

Re­gi­s­trar­se en Docker Hub

Re­gi­s­trar­se en Docker Hub es gratis y solo requiere una dirección de correo ele­c­tró­ni­co y un Docker ID propio, que luego se utilizará como nombre de espacio personal para el re­po­si­to­rio y permite acceder a todos los servicios de Docker. La oferta incluye Docker Hub, Docker Cloud, Docker Store y algunos programas Beta. Además, con el Docker ID, se obtiene acceso al centro de asi­s­te­n­cia de Docker, así como al Docker Success Portal y a los foros de Docker.

Puedes re­gi­s­trar­te siguiendo estos cinco pasos:

  1. Elige un Docker ID: en el registro debes elegir un nombre de usuario que más tarde va a co­n­ve­r­ti­r­se en tu ID.
  2. Escribe tu dirección de correo ele­c­tró­ni­co: introduce una dirección de correo ele­c­tró­ni­co activa, ya que servirá para confirmar la in­s­cri­p­ción en Docker Hub.
  3. Crea una co­n­tra­se­ña: elige una co­n­tra­se­ña.
  4. Envía la in­s­cri­p­ción: haz clic sobre “Sign up” para confirmar tu in­s­cri­p­ción. Si todos los datos se han co­m­ple­ta­do co­rre­c­ta­me­n­te, se envía un enlace de ve­ri­fi­ca­ción a la dirección pro­po­r­cio­na­da.
  5. Confirma tu dirección de correo ele­c­tró­ni­co: confirma tu cuenta de correo haciendo clic en el enlace de ve­ri­fi­ca­ción.

Después de re­gi­s­trar­te, podrás acceder di­re­c­ta­me­n­te a los servicios en línea del proyecto de Docker desde el navegador. Aquí puedes crear re­po­si­to­rios y grupos de trabajo, así como buscar recursos de acceso público a través de la función “Explore”.

Imagen: Panel de control de Docker Hub
En el panel de control de Docker Hub puedes ad­mi­ni­s­trar los re­po­si­to­rios y grupos de trabajo / Fuente: hub.docker.com

También puedes re­gi­s­trar­te di­re­c­ta­me­n­te desde la consola del sistema operativo uti­li­za­n­do el comando docker login. Puedes encontrar una ex­pli­ca­ción detallada del comando en la do­cu­me­n­ta­ción de Docker.

En principio, los usuarios sin una cuenta ni Docker ID también pueden acceder a Docker Hub, aunque solo podrán descargar imágenes de los re­po­si­to­rios de acceso público y tienen vetado cargar (push) sus imágenes propias.

Crear re­po­si­to­rios en Docker Hub

La cuenta gratuita en Docker Hub incluye un re­po­si­to­rio de acceso privado y permite crear tantos re­po­si­to­rios de acceso público como quieras. No obstante, puedes de­s­blo­quear más re­po­si­to­rios de acceso privado con una ac­tua­li­za­ción de pago.

Para crear un re­po­si­to­rio, sigue los si­guie­n­tes pasos:

  1. Elige un espacio de nombres: cuando creas un re­po­si­to­rio, se le asigna au­to­má­ti­ca­me­n­te el espacio de nombres de tu Docker ID, aunque también se le puede asignar el de una or­ga­ni­za­ción a la que pe­r­te­ne­z­cas.
  2. Dale un nombre al re­po­si­to­rio: asigna un nombre al re­po­si­to­rio que estás creando.
  3. Añade una de­s­cri­p­ción: añade una de­s­cri­p­ción al re­po­si­to­rio.
  4. Configura la seguridad: decide si quieres crear un re­po­si­to­rio de acceso público (public) o uno al que solo puedas acceder tú o tu or­ga­ni­za­ción (private).

Haz clic en “Create” para confirmar la creación.

Imagen: Docker Hub: formulario para crear un repositorio
Tu re­po­si­to­rio se creará di­re­c­ta­me­n­te en el espacio de nombres de tu Docker ID / Fuente: hub.docker.com

Crear equipos y or­ga­ni­za­cio­nes

A través de Docker Hub, Docker ofrece una pla­ta­fo­r­ma en la nube donde se puede gestionar la creación de imágenes de manera ce­n­tra­li­za­da y co­m­pa­r­ti­r­las fá­ci­l­me­n­te con grupos de trabajo, a los que Docker denomina or­ga­ni­za­cio­nes. Al igual que con las cuentas de usuario, las or­ga­ni­za­cio­nes también reciben un ID in­di­vi­dual con los que descargar imágenes o co­m­pa­r­ti­r­las con otros usuarios. Los roles y permisos de cada miembro se organizan en equipos. De esta forma, por ejemplo, solo los usuarios que pe­r­te­ne­cen al grupo “Owners” pueden crear re­po­si­to­rios privados o públicos y asignar permisos de acceso.

También puedes crear y gestionar los grupos de trabajo a través del panel de control. Para obtener más in­fo­r­ma­ción sobre la gestión de equipos y or­ga­ni­za­cio­nes, consulta la do­cu­me­n­ta­ción de Docker.

Cómo trabajar con imágenes y co­n­te­ne­do­res

Docker Hub es el punto de acceso primario para los recursos oficiales de Docker, y se convierte en el punto de partida para nuestra in­tro­du­c­ción a la gestión de imágenes y co­n­te­ne­do­res. Aquí, el equipo de de­sa­rro­lla­do­res presenta, entre otras, la imagen demo whalesay, que se utilizará como base en el tutorial de Docker que hay a co­n­ti­nua­ción.

Descargar imágenes Docker

Para encontrar la imagen whalesay, accede a la página de inicio de Docker Hub e introduce el término whalesay en la barra de búsqueda que se encuentra a la derecha del logotipo de Docker.

Imagen: Función de búsqueda en Docker Hub
Busca en la barra de búsqueda de Docker Hub o con la pestaña “Explore” / Fuente: hub.docker.com

En los re­su­l­ta­dos de la búsqueda, haz clic en el recurso eti­que­ta­do docker/whalesay, para acceder al re­po­si­to­rio público de esta imagen. Los re­po­si­to­rios Docker siempre tienen la misma es­tru­c­tu­ra: en la parte superior, se muestra el título de la imagen, la categoría del re­po­si­to­rio y la fecha de última ac­tua­li­za­ción (last pushed).

Imagen: Interfaz web de un repositorio Docker
En los re­po­si­to­rios, los usuarios en­cue­n­tran no­r­ma­l­me­n­te toda la in­fo­r­ma­ción necesaria para la creación de imágenes / Fuente: hub.docker.com

Cada re­po­si­to­rio Docker incluye también los si­guie­n­tes apartados:

  • De­s­cri­p­tion: de­s­cri­p­ción detallada e in­s­tru­c­cio­nes de uso.
  • Docker Pull Command: consola de línea de comandos para descargar imágenes del re­po­si­to­rio (pull).
  • Owner: in­fo­r­ma­ción sobre el creador del re­po­si­to­rio.
  • Comments: zona de co­me­n­ta­rios al final de la página.

En las ventanas de in­fo­r­ma­ción del re­po­si­to­rio aparece que whalesay es una mo­di­fi­ca­ción del script Perl de código abierto cowsay. El programa, de­sa­rro­lla­do por Rony Monroe en el año 1999, genera una re­pre­se­n­ta­ción gráfica ASCII de una vaca que aparece en la terminal del usuario junto con un mensaje.

Para descargar la imagen docker/whalesay, utiliza el comando docker pull con la siguiente es­tru­c­tu­ra:

docker pull [OPTIONS] NAME [:TAG|@DIGEST]
bash

El comando docker pull ordena al daemon descargar una imagen del re­po­si­to­rio. Para que pueda ide­n­ti­fi­car la imagen, debes pro­po­r­cio­nar su nombre (NAME). También puedes indicar a Docker cómo debe ejecutar el comando deseado mediante opciones (OPTIONS) y, de forma opcional, in­tro­du­cir tags (:TAG) o números de ide­n­ti­fi­ca­ción únicos (@DIGEST) que permiten descargar una versión es­pe­cí­fi­ca de una imagen.

Para crear una copia local de la imagen docker/whalesay, utiliza el siguiente comando:

docker pull docker/whalesay
bash

Por lo general, no suele ser necesario, ya que cuando quieres iniciar un co­n­te­ne­dor, Docker daemon de­s­ca­r­ga­rá las imágenes au­to­má­ti­ca­me­n­te del re­po­si­to­rio si no las encuentra en el sistema local.

Iniciar imágenes de Docker como co­n­te­ne­do­res

Para iniciar una imagen de Docker, utiliza el comando docker run con la siguiente es­tru­c­tu­ra base:

docker run [OPTIONS] IMAGE [:TAG|@DIGEST] [CMD] [ARG…]
bash

La única parte obli­ga­to­ria del comando docker run es el nombre de la imagen de Docker que quieres iniciar. Sin embargo, al iniciar un co­n­te­ne­dor, también puedes es­pe­ci­fi­car otras opciones, TAGs y DIGEST. Además, puedes combinar el comando docker run con otros comandos que se ejecutan al iniciar el co­n­te­ne­dor. En este caso, se so­bre­s­cri­be el comando CMD (COMMAND) es­ta­ble­ci­do por el creador, que se ejecuta au­to­má­ti­ca­me­n­te al iniciar el co­n­te­ne­dor. Con ar­gu­me­n­tos adi­cio­na­les (ARG…), puedes definir otras co­n­fi­gu­ra­cio­nes op­cio­na­les, como agregar usuarios o tra­n­s­fe­rir variables de entorno (en­vi­ro­n­me­nt variables).

Utiliza el siguiente comando:

docker run docker/whalesay cowsay boo
bash

para descargar el script co­rre­s­po­n­die­n­te de Perl como imagen y eje­cu­tar­lo en un contendor. Verás que whalesay se di­fe­re­n­cia mucho del script original.

Imagen: Salida en la terminal del contenedor docker/whalesay: la ballena dice “boo”
Si se ejecuta “docker/whalesay” con el comando estándar, la ballena de Docker se limita a un breve “boo”

Al ejecutar la imagen docker/whalesay, el script muestra en la consola una gráfica ASCII en forma de ballena, así como el mensaje “boo” que genera el comando cowsay.

Similar a la prueba anterior, el daemon buscará primero la imagen en el di­re­c­to­rio local de archivos. Si no encuentra un paquete con el mismo nombre, inicia una descarga desde el re­po­si­to­rio de Docker mediante un comando pull. Fi­na­l­me­n­te, el daemon iniciará el programa mo­di­fi­ca­do de cowsay. Una vez fi­na­li­za­do, el co­n­te­ne­dor se cerrará au­to­má­ti­ca­me­n­te.

Al igual que con cowsay, whalesay de Docker también permite in­te­r­ve­nir en la salida de texto en la terminal. Prueba la función su­s­ti­tu­ye­n­do el mensaje “boo” en el comando de salida con otra cadena de ca­ra­c­te­res, como un chiste de ballenas.

sudo docker run docker/whalesay cowsay What did the shark say to the whale? What are you blubbering about?
bash
Imagen: Salida en la terminal del contenedor docker/whalesay: la ballena muestra un mensaje de texto personalizado
La ballena puede mostrar mensajes de texto pe­r­so­na­li­za­dos

Vi­sua­li­zar todas las imágenes Docker en el sistema local

Para comprobar si has de­s­ca­r­ga­do una imagen es­pe­cí­fi­ca, puedes acceder a una vista general de todas las imágenes en tu sistema local uti­li­za­n­do el siguiente comando:

sudo docker images
bash

El comando docker images (o al­te­r­na­ti­va­me­n­te docker image ls) te muestra todas las imágenes locales junto con in­fo­r­ma­ción sobre el tamaño del archivo, el tag y el ID de cada imagen.

Imagen: Listado de todas las imágenes en el sistema local
La lista de imágenes de­s­ca­r­ga­das muestra “hello-world” y “docker/whalesay”

Al iniciar un co­n­te­ne­dor, la imagen su­b­ya­ce­n­te se descarga del re­po­si­to­rio como una copia y se guarda pe­r­ma­ne­n­te­me­n­te en tu ordenador, lo que te permite ahorrar tiempo en futuros accesos. Solo ne­ce­si­ta­rás una nueva descarga si cambia la fuente de la imagen, como ocurre cuando hay una versión ac­tua­li­za­da di­s­po­ni­ble en el re­po­si­to­rio.

Vi­sua­li­zar todos los co­n­te­ne­do­res en el sistema local

Si quieres vi­sua­li­zar todos los co­n­te­ne­do­res que se están eje­cu­ta­n­do o han sido eje­cu­ta­dos en el sistema, debes usar el comando ocker ps junto con la opción --all (abreviado como: -a):

sudo docker ps -a
bash
Imagen: Vista general de todos los contenedores en el sistema local
La vista general muestra todos los co­n­te­ne­do­res iniciados en el motor Docker

La in­fo­r­ma­ción obtenida en la terminal incluye el ID del contendor co­rre­s­po­n­die­n­te, la imagen su­b­ya­ce­n­te, el comando ejecutado para su inicio, la hora de inicio y su estado actual.

Si quieres ver solo los co­n­te­n­do­res que están ac­tua­l­me­n­te en ejecución, utiliza el comando docker ps sin ninguna opción:

sudo docker ps
bash

No obstante, ahora no deberías tener ningún co­n­te­ne­dor eje­cu­tá­n­do­se en tu sistema.

Crear imágenes Docker

Ya sabes cómo encontrar imágenes en Docker Hub, de­s­ca­r­gar­las y eje­cu­tar­las en cua­l­quie­ra de los sistemas en los que esté instalado el motor Docker. Sin embargo, Docker no se limita úni­ca­me­n­te a pro­po­r­cio­nar­te una amplia gama de apli­ca­cio­nes en su re­po­si­to­rio; también te brinda un gran abanico de recursos para crear tus propias imágenes y co­m­pa­r­ti­r­las con otros de­sa­rro­lla­do­res.

En los capítulos in­tro­du­c­to­rios de este artículo, hemos visto que cada imagen de Docker se construye sobre un Do­c­ke­r­fi­le, el cual funciona como un conjunto de in­s­tru­c­cio­nes de montaje para imágenes. Do­c­ke­r­fi­le es un archivo de texto sencillo que contiene todas las in­s­tru­c­cio­nes que Docker necesita para crear una imagen. En los si­guie­n­tes apartados te ex­pli­ca­re­mos cómo escribir un Do­c­ke­r­fi­le y cómo indicar a Docker que lo utilice como punto de partida para crear tu propia imagen.

  1. Crea un nuevo di­re­c­to­rio: el equipo de de­sa­rro­lla­do­res de Docker re­co­mie­n­da crear un di­re­c­to­rio propio para cada Do­c­ke­r­fi­le, un proceso sencillo de realizar en la terminal de Linux. Utiliza el siguiente comando para crear un nuevo di­re­c­to­rio con el nombre my­do­c­ke­r­bui­ld:
mkdir mydockerbuild
bash
Imagen: Terminal Ubuntu: el comando mkdir
Crear nuevos di­re­c­to­rios con el comando “mkdir”
  1. Accede al nuevo di­re­c­to­rio: para ello usa el comando cd.
cd mydockerbuild
bash
Imagen: Terminal Ubuntu: el comando cd
El comando “cd” te permite acceder a otro di­re­c­to­rio de trabajo
  1. Crea un nuevo archivo de texto: los editores de texto como Nano y Vim te permiten crear archivos de texto desde la terminal de Ubuntu. Crea un archivo de texto con el nombre Do­c­ke­r­fi­le en tu di­re­c­to­rio my­do­c­ke­r­bui­ld.
nano Dockerfile
bash
Imagen: Terminal Ubuntu: crear archivos de texto con Nano
Nano es un editor de texto que viene prei­n­s­ta­la­do en todas las versiones de Ubuntu
  1. Escribe el Do­c­ke­r­fi­le: el archivo de texto que acabas de crear va a contener las in­s­tru­c­cio­nes ne­ce­sa­rias para crear tu nueva imagen. En vez de programar la imagen desde cero, en este tutorial de Docker vamos a utilizar el comando FROM para utilizar la imagen docker/whalesay como plantilla para tu nueva imagen. Utiliza :latest como tag para indicar que debe coger la versión más ac­tua­li­za­da de la imagen.
FROM docker/whalesay:latest

Hasta este momento, la fu­n­cio­na­li­dad de docker/whalesay se centra en permitir que el usuario elija las palabras que salen de la boca de la ballena, de modo que en la terminal aparezca exac­ta­me­n­te ese texto junto al comando de inicio del co­n­te­ne­dor. Sería mucho más in­te­re­sa­n­te si el script generase au­to­má­ti­ca­me­n­te nuevas salidas de texto, lo cual es posible, gracias a programas como fortunes, que está di­s­po­ni­ble para el sistema Linux, y cuya función principal consiste en generar pro­ve­r­bios y aforismos en­tre­te­ni­dos. Puedes ac­tua­li­zar el índice de paquetes locales e instalar fortunes con el siguiente comando:

RUN apt-get -y update && apt-get install -y fortunes

Fi­na­l­me­n­te, define una sentencia CMD que se ejecutará después del comando RUN, siempre y cuando no se haya reescrito con (docker run image CMD). Utiliza el siguiente comando para ejecutar el programa fortunes con la opción -a (“Elegir entre todas las bases de datos”) y mostrar la salida a través del programa cowsay en el terminal:

CMD /usr/games/fortune -a | cowsay

En este momento, el do­c­ke­r­fi­le debería tener el siguiente contenido:

FROM docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay

Ten en cuenta lo siguiente: los comandos de un Do­c­ke­r­fi­le están limitados a una sola línea y siempre empiezan con una palabra clave. La sintaxis no distingue entre ma­yú­s­cu­las o mi­nú­s­cu­las, aunque se ha es­ta­ble­ci­do que las palabras clave deben ir escritas en ma­yú­s­cu­las.

Imagen: El editor de texto Nano en la terminal de Ubuntu
Puedes controlar el editor de texto Nano con la co­m­bi­na­ción de teclas que aparecen en la zona inferior de la ventana
  1. Guarda y cierra el archivo de texto: guarda tus entradas. Si utilizas el editor Nano, presiona la co­m­bi­na­ción de teclas [Ctrl] + [O] y confirma con [Enter] para guardar. Nano te co­mu­ni­ca­rá que se han escrito tres líneas en el archivo se­le­c­cio­na­do. Cierra el editor de texto con la co­m­bi­na­ción de teclas [Ctrl] + [X].
  2. Crea imágenes a partir del Do­c­ke­r­fi­le: para crear una imagen a partir de un Do­c­ke­r­fi­le, dirígete primero al di­re­c­to­rio en el que se en­cue­n­tran los archivos de texto. La imagen se crea con el comando docker build. Si quieres asignar un nombre es­pe­cí­fi­co a la imagen de forma in­di­vi­dual o pro­po­r­cio­nar­le un tag, utiliza la opción -t junto con la co­m­bi­na­ción del nombre elegido y el tag. El formato estándar es name:tag.

En el siguiente ejemplo se crea una imagen con el nombre docker-whale:

docker build -t docker-whale .
bash

El signo or­to­grá­fi­co del punto indica que el Do­c­ke­r­fi­le se encuentra en el di­re­c­to­rio actual, aunque también tienes la po­si­bi­li­dad de añadir una ruta de archivos o un URL a los archivos original.

El proceso build comienza tan pronto como se haya co­n­fi­r­ma­do el comando con [Enter]. Primero el Docker daemon comprueba si dispones de todos los archivos ne­ce­sa­rios para crear una imagen, a los que se conoce como “Context” de acuerdo con la te­r­mi­no­lo­gía de Docker. Luego, se ubica la imagen docker/whalesay con el Tag :latest. Si el Context necesario para la imagen está completo, el Docker daemon iniciará la plantilla in­co­r­po­ra­da de la imagen uti­li­za­n­do la in­s­tru­c­ción FROM en un co­n­te­ne­dor temporal y luego procederá con los si­guie­n­tes comandos del Do­c­ke­r­fi­le. En este caso, el siguiente comando es un RUN que instala el programa fortunes.

Al finalizar cada paso en el proceso de creación de la imagen, Docker asigna un ID a la capa (layer) creada en ese paso. Es im­po­r­ta­n­te tener en cuenta que cada línea del Do­c­ke­r­fi­le se traduce en una capa de la imagen co­n­s­trui­da.

Cuando finaliza el comando RUN, el Docker daemon detiene el co­n­te­ne­dor temporal que se utilizó para este propósito, lo elimina e inicia un nuevo co­n­te­ne­dor temporal para la capa de la sentencia CMD. Una vez fi­na­li­za­do el proceso de co­n­s­tru­c­ción, el co­n­te­ne­dor temporal se cerrará y eliminará. Docker mostrará el ID de la nueva imagen, tal que así:

Successfully built a8f2048c9ab8
Imagen: Terminal Ubuntu: notificaciones de estado durante la creación de la imagen
Las imágenes Docker se crean en varias capas (layers

La imagen recién creada aparecerá en la lista de imágenes al­ma­ce­na­das lo­ca­l­me­n­te con el nombre de docker-whale.

sudo docker images
bash
Imagen: Terminal Ubuntu: vista general de todas las imágenes
La imagen recién creada en el listado con todas las imágenes

Para iniciar un co­n­te­ne­dor basado en la imagen que acabas de crear, utiliza el comando sudo docker run seguido del nombre de tu imagen, tal que así:

sudo docker run docker-whale
bash

Si la imagen se ha creado co­rre­c­ta­me­n­te a partir del do­c­ke­r­fi­le, la ballena debería hablar elo­cue­n­te­me­n­te y demostrar su sabiduría. Ten en cuenta que cada vez que inicies el co­n­te­ne­dor, verás una frase diferente.

Imagen: Contenedor basado en docker-whale: salida del texto en la terminal
Con fortunes la ballena ASCII generará aforismos

Hacer tagging a tus imágenes de Docker y subirlas a Docker Hub

Antes de poder subir a Docker Hub la imagen docker-whale que has creado y, de este modo, co­m­pa­r­ti­r­la con la comunidad o con un grupo de­te­r­mi­na­do, debes vi­n­cu­lar­la a un re­po­si­to­rio homónimo en tu espacio de nombres personal. El proceso de vincular se conoce como tagging en la te­r­mi­no­lo­gía de Docker.

Sigue los si­guie­n­tes pasos para publicar una imagen en Docker Hub:

  1. Crear un re­po­si­to­rio: re­gí­s­tra­te en Docker Hub con tu Docker ID y tu co­n­tra­se­ña personal. Luego, crea un re­po­si­to­rio público y llámalo docker-whale.
Imagen: Docker Hub: formulario para la creación de un repositorio
Crea un re­po­si­to­rio para la imagen que has creado / Fuente: hub.docker.com
  1. Obtener el ID de la imagen: utiliza el comando docker images para obtener el ide­n­ti­fi­ca­dor de la imagen docker-whale que has creado.
Imagen: Vista general de todas las imágenes en la terminal de Ubuntu
El comando “docker images” muestra una lista de todas las imágenes guardadas en el sistema

En nuestro caso, el ID de la imagen es a8f2048c9ab8. Ne­ce­si­ta­mos el ID para taggear (etiquetar) la imagen en el siguiente paso.

  1. Taggear la imagen: para taggear la imagen docker-whale, utiliza el comando docker tag con el siguiente esquema:
sudo docker tag [Image-ID][Docker-ID]/[Image-Name]:[TAG]
bash

En el ejemplo actual, el comando que debes in­tro­du­cir en la terminal para taggear es el siguiente:

sudo docker tag a8f2048c9ab8 [Namespace]/docker-whale:latest
bash

Para comprobar si se ha taggeado la imagen co­rre­c­ta­me­n­te, accede a la vista general con docker images. En la lista, el nombre del re­po­si­to­rio debería de mostrar tu Docker ID.

Imagen: Terminal Ubuntu: vista general de las imágenes antes y después de taggear
Con “docker tag” vinculas las imágenes con tu Docker ID
  1. Subir la imagen: primero inicia sesión en Docker Hub con el comando docker login:
sudo docker login
bash

La terminal te pedirá tu nombre de usuario (Docker ID) y co­n­tra­se­ña.

Imagen: Accede a Docker Hub a través de la terminal Ubuntu
Debes re­gi­s­trar­te para poder subir una imagen a Docker Hub

Una vez dentro, introduce el comando docker push para cargar la imagen en el re­po­si­to­rio que creaste:

sudo docker push [Namespace]/docker-whale
bash

El proceso de carga no debe de tardar más de unos segundos. La terminal te muestra el estado actual.

Imagen: Terminal Ubuntu: notificación de estado tras subir la imagen
Una vez se ha subido la imagen, se encuentra di­s­po­ni­ble en Docker Hub con el tag “latest”.

Podrás ver tu imagen si entras en Docker Hub desde el navegador.

Imagen: Docker-Hub: repositorio [Namespace]/docker-whale en la vista detallada
En la vista detallada puedes ver la última ac­tua­li­za­ción de tu re­po­si­to­rio / Fuente: hub.docker.com

Si quieres cargar múltiples imágenes en un mismo re­po­si­to­rio, utiliza tags di­fe­re­n­tes para re­pre­se­n­tar las distintas versiones de las imágenes. Por ejemplo:

[Namespace]/docker-whale:latest
[Namespace]/docker-whale:version1
[Namespace]/docker-whale:version2

En la pestaña “Tags” puedes acceder a una vista general de todas las versiones de imágenes di­s­po­ni­bles en un re­po­si­to­rio.

Imagen: Docker Hub: pestaña “Tags”
En la pestaña “Tags” en­cue­n­tras todas las versiones de una misma imagen / Fuente: hub.docker.com

Por el contrario, las imágenes de proyectos di­fe­re­n­tes deben estar ubicadas en re­po­si­to­rios separados.

Una vez hayas subido la imagen con éxito, estará di­s­po­ni­ble en el re­po­si­to­rio público para todos los usuarios del mundo.

  1. Co­m­pro­ba­ción: verifica que la imagen se ha subido co­rre­c­ta­me­n­te in­te­n­ta­n­do de­s­ca­r­gar­la.

Primero, elimina la versión local de la imagen para poder descargar una copia con el mismo tag, de lo contrario, Docker podría no­ti­fi­car­te que la imagen que quieres ya se encuentra en su versión más actual.

Imagen: Estado: “Image is up to date” (“la copia local está actualizada”)
El comando Pull se in­te­rru­m­pe si la imagen ya existe en local

Borra las imágenes locales de Docker uti­li­za­n­do el comando docker rmi junto con el ID de la imagen, que se obtiene con docker images. Si se produce algún conflicto, es decir, Docker te dice que el ID de la imagen se está uti­li­za­n­do en más re­po­si­to­rios o en un co­n­te­ne­dor, puedes forzar la eli­mi­na­ción con la opción --force (abreviado: -f).

sudo docker rmi -f a8f2048c9ab8
bash
Imagen: El comando docker rmi con la opción -f (force)
Utiliza el comando “docker rmi” con la opción “-f” para forzar una eli­mi­na­ción

Vuelve a acceder a la vista general de todas las imágenes:

sudo docker Images
bash

Los elementos eli­mi­na­dos no deberían aparecer en la salida de la terminal. Utiliza el comando Pull e indica el re­po­si­to­rio para descargar una copia nueva de la imagen desde Docker Hub:

sudo docker pull [Namespace]/€
bash
Imagen: Terminal Ubuntu: descarga desde Docker Hub
La imagen que has creado pre­via­me­n­te se ha de­s­ca­r­ga­do con éxito

Más temas y tu­to­ria­les sobre Docker

El universo Docker es amplio y variado. Con el tiempo, se ha de­sa­rro­lla­do un eco­si­s­te­ma activo de he­rra­mie­n­tas re­la­cio­na­das con Docker. Docker es pa­r­ti­cu­la­r­me­n­te in­te­re­sa­n­te para los ad­mi­ni­s­tra­do­res, es­pe­cia­l­me­n­te cuando se utilizan apli­ca­cio­nes complejas que in­vo­lu­cran varios co­n­te­ne­do­res en di­fe­re­n­tes sistemas paralelos. Docker ofrece varias funciones para orquestar un clúster de semejante na­tu­ra­le­za. Puedes encontrar más detalles al respecto en nuestro artículo sobre [or­que­s­ta­ción de co­n­te­ne­do­res Docker con Swarm y Compose Si quieres trabajar con Docker, puedes encontrar más tu­to­ria­les en la Digital Guide:

Docker ofrece una ve­r­sa­ti­li­dad ex­ce­p­cio­nal en diversos es­ce­na­rios de apli­ca­ción. En nuestra Digital Guide en­co­n­tra­rás los si­guie­n­tes tu­to­ria­les:

Es im­po­r­ta­n­te reconocer que Docker no siempre es la opción más adecuada. En nuestro análisis de al­te­r­na­ti­vas de Docker, ex­plo­ra­mos al­te­r­na­ti­vas clave. Adi­cio­na­l­me­n­te, tenemos co­m­pa­ra­cio­nes directas entre algunas al­te­r­na­ti­vas y Docker:

Ir al menú principal