El software de código abierto Docker se ha co­n­ve­r­ti­do en el estándar para vi­r­tua­li­zar co­n­te­ne­do­res de apli­ca­cio­nes. La vi­r­tua­li­za­ción de co­n­te­ne­do­res continuó el de­sa­rro­llo de las máquinas virtuales con una im­po­r­ta­n­te di­fe­re­n­cia: en lugar de simular un sistema operativo completo, se vi­r­tua­li­za una sola apli­ca­ción en un co­n­te­ne­dor.

Docker se controla en el sistema local mediante una interfaz de línea de comandos, son ese­n­cia­les para trabajar con este software de código abierto. A co­n­ti­nua­ción, ex­pli­ca­mos cómo funcionan los comandos de Docker y te pre­se­n­ta­mos los más im­po­r­ta­n­tes.

¿Qué son los comandos de Docker?

Para entender mejor qué son los comandos de Docker y cómo funcionan, vamos a explicar bre­ve­me­n­te la es­tru­c­tu­ra de Docker. La in­s­ta­la­ción de Docker en un host local contiene el Docker Engine como núcleo, que consta de tres co­m­po­ne­n­tes pri­n­ci­pa­les:

  1. El daemon de Docker, que se ejecuta como “dockerd” en el host.
  2. La API de Docker, pro­po­r­cio­na­da por el daemon de Docker. Este se dirige y se deja controlar a través de la API.
  3. La interfaz de línea de comandos (“command line interface”, CLI), que se utiliza como un comando de Docker para co­mu­ni­car­se con la API de Docker.

Para controlar Docker, el usuario introduce los comandos de Docker en la línea de comandos, que son recibidos y pro­ce­sa­dos por la CLI de Docker. A partir de los comandos, se generan las co­rre­s­po­n­die­n­tes llamadas a la API para el daemon de Docker, que es el que realiza el trabajo real.

Consejo

Si quieres entender los comandos de Docker, la mejor opción es que pruebas di­re­c­ta­me­n­te con el software. Para ello, utiliza nuestro tutorial de Docker para aprender los conceptos más im­po­r­ta­n­tes.

¿Cómo se es­tru­c­tu­ran los comandos de Docker?

Debido a su de­sa­rro­llo histórico, se han es­ta­ble­ci­do dos tipos de comandos de Docker.

En primer lugar, hay un grupo de comandos in­de­pe­n­die­n­tes, también conocidos como comandos Docker Sta­n­da­lo­ne. Suelen ser verbos como, por ejemplo, “docker pull” o “docker build”. En general, este tipo de comando realiza una acción es­pe­cí­fi­ca cuando se in­tro­du­cen en la pla­ta­fo­r­ma. Sin embargo, a medida que la pla­ta­fo­r­ma crecía, aparecían nuevas fu­n­cio­na­li­da­des y, por tanto, resultaba cada vez más difícil encontrar verbos adecuados.

Después, se in­tro­du­je­ron los llamados “comandos de gestión de Dockero comandos Docker Ma­na­ge­me­nt. Su función es agrupar los comandos para volver a poner orden en la de­s­bo­r­da­n­te di­ve­r­si­dad de comandos. Estos suelen ser su­s­ta­n­ti­vos como, por ejemplo, los comandos “docker image” y “docker container”. Asimismo, los comandos de gestión de Docker se agrupan en su­b­co­ma­n­dos, que a su vez son verbos.

De este modo, los mismos verbos pueden uti­li­zar­se en di­fe­re­n­tes contextos sin que los nombres se solapen. Por ejemplo, existe el comando “docker image rm” para eliminar una imagen y “docker container rm” para eliminar un co­n­te­ne­dor.

In­de­pe­n­die­n­te­me­n­te de si se utilizan los comandos de Docker Sta­n­da­lo­ne o los comandos de Docker Ma­na­ge­me­nt, los comandos de Docker se in­tro­du­cen en la línea de comandos. Como es habitual, se introduce el nombre del comando seguido de los pa­rá­me­tros op­cio­na­les. En caso de que sea necesario, se introduce el nombre de uno o más objetos, que pueden ser co­n­te­ne­do­res, imágenes, volúmenes o similares.

Veamos la es­tru­c­tu­ra general de un comando Docker en la línea de comandos. En el caso más sencillo, solo se accede a la CLI de Docker con una opción adjunta:

docker [--options]

Ejemplos conocidos son la salida de la versión de Docker o la in­fo­r­ma­ción de ayuda de Docker:

# mostrar la versión de Docker
docker –version
# mostrar la ayuda de Docker
docker --help
Consejo

Aplica la opción “--help” a un su­b­co­ma­n­do de Docker para mostrar la in­fo­r­ma­ción de ayuda del comando.

En la mayoría de los casos, no nos limitamos a abrir la CLI de Docker, sino que además enviamos el nombre de un comando es­pe­cí­fi­co. Este puede ser un comando in­de­pe­n­die­n­te o un comando de gestión seguido de un su­b­co­ma­n­do. Para ello, veamos primero el patrón general de un comando in­de­pe­n­die­n­te de Docker. El nombre “docker” es seguido por el nombre del comando, pa­rá­me­tros op­cio­na­les y el nombre de un objeto Docker si es aplicable:

docker <command> [--options] <object>

Dos conocidos comandos in­de­pe­n­die­n­tes de Docker de uso pro­du­c­ti­vo se utilizan para mostrar diversa in­fo­r­ma­ción de estado:

# mostrar información de Docker
docker info
# mostrar imágenes de Docker en el host
docker images

A co­n­ti­nua­ción, vamos a fa­mi­lia­ri­zar­nos con los comandos de gestión de Docker. Como ya se ha dicho, sirven para poner orden en el caos de comandos que ha crecido or­gá­ni­ca­me­n­te. Ori­gi­na­l­me­n­te, existía el comando “docker Is” para listar los co­n­te­ne­do­res en un host y, aná­lo­ga­me­n­te, el comando “docker images” para listar imágenes. Como podrás ver, no era muy intuitivo. Aunque ambos comandos pueden seguir uti­li­zá­n­do­se, hoy en día existen al­te­r­na­ti­vas co­n­si­s­te­n­tes uti­li­za­n­do “docker container Is” y “docker image Is”.

El esquema general de los comandos de gestión de Docker se basa en la es­tru­c­tu­ra de los comandos in­de­pe­n­die­n­tes de Docker: el nombre “docker” va seguido del nombre del comando de gestión y su su­b­co­ma­n­do. Al finalizar el paso anterior, se concluye con pa­rá­me­tros op­cio­na­les, así como el nombre de un objeto Docker, si es el caso:

docker <management-command> <subcommand> [--options] <object>

Ilu­s­tre­mos el patrón con un ejemplo concreto. Aquí está el comando Docker para iniciar un nuevo co­n­te­ne­dor desde la imagen “httpd” en modo in­ter­ac­ti­vo:

docker container run -it httpd

Co­m­pa­re­mos la es­tru­c­tu­ra general de los comandos de gestión de Docker con los co­m­po­ne­n­tes in­di­vi­dua­les del ejemplo anterior:

Docker-CLI Comando Docker Opciones Objeto
Es­tru­c­tu­ra docker <command> <su­b­co­m­ma­nd> [--options] <object>
Ejemplo docker container run -it httpd
Detalles Abre Docker y envía más comandos y opciones. Los nombres de los comandos deben es­cri­bi­r­se exac­ta­me­n­te como se indica en la do­cu­me­n­ta­ción. Las opciones se envían al comando y controlan su co­m­po­r­ta­mie­n­to. Hay dos ano­ta­cio­nes para las opciones, véase más abajo. Marcador de posición para un objeto como objetivo de la operación. En el caso de objetos Docker, como co­n­te­ne­do­res e imágenes, se utiliza el nombre o el hash del objeto como ID.

¿Qué opciones admiten los comandos de Docker?

Como la mayoría de los comandos de la línea de comandos, los comandos de Docker también se gestionan con pa­rá­me­tros op­cio­na­les, llamados “opciones”. Las opciones siguen al nombre del comando y se di­s­ti­n­guen entre ma­yú­s­cu­las y mi­nú­s­cu­las. No­r­ma­l­me­n­te, hay dos ano­ta­cio­nes para la mayoría de las opciones:

  1. Forma corta: -, por ejemplo “docker -v”

La forma corta tiene poco valor in­fo­r­ma­ti­vo. No obstante, se pueden combinar varias opciones en una sola como, por ejemplo, “docker run -it” en lugar de “docker -i -t”. El orden es ar­bi­tra­rio a la hora de combinar; también se puede escribir “docker run -ti” sin problemas. La forma corta es muy útil para trabajar rá­pi­da­me­n­te con comandos conocidos en la línea de comandos.

  1. Forma larga: --<Nombre de la opción>, por ejemplo “docker --version”

La forma larga es fácil de entender, pero lleva más tiempo es­cri­bi­r­la y ocupa más espacio. Sin embargo, es adecuada para crear scripts, pues los nombres de las opciones sirven de do­cu­me­n­ta­ción.

¿Cómo se re­la­cio­nan Do­c­ke­r­fi­le, Docker Image y Docker Container?

Una gran parte de los comandos de Docker exi­s­te­n­tes se utilizan para gestionar Docker Container, Docker Images y Docker Volumes. Antes de entrar en detalles sobre los comandos es­pe­cí­fi­cos de Docker, vamos a dar una breve visión general de cómo se re­la­cio­nan Container y Image, dos conceptos muy im­po­r­ta­n­tes en Docker.

Un co­n­te­ne­dor Docker se crea a partir de una plantilla inmutable llamada imagen, que contiene las de­pe­n­de­n­cias y los ajustes de co­n­fi­gu­ra­ción ne­ce­sa­rios para crear un co­n­te­ne­dor. No solo podemos crear un co­n­te­ne­dor a partir de una imagen, sino también guardar un co­n­te­ne­dor existente en una nueva imagen. Co­n­te­ne­dor e imagen se re­la­cio­nan entre sí como un huevo y una gallina:

Comando Docker Función Analogía gallina-huevo
docker build Crear una imagen de Docker desde Do­c­ke­r­fi­le Huevo provisto de in­fo­r­ma­ción genética
docker run <image> Abrir un co­n­te­ne­dor de Docker desde la imagen El pollito sale del huevo
docker commit <container> Crear una imagen de Docker a partir de un co­n­te­ne­dor La gallina pone otro huevo

Pre­se­n­ta­ción de los comandos de Docker más im­po­r­ta­n­tes

Docker ha ex­pe­ri­me­n­ta­do un rápido de­sa­rro­llo en los últimos diez años. Además de la vi­r­tua­li­za­ción de co­n­te­ne­do­res original, Docker incluye hoy en día funciones que van mucho más allá. Por ejemplo, Docker-Compose y Docker-Swarm pueden uti­li­zar­se para orquestar uniones de co­n­te­ne­do­res, lo que tra­di­cio­na­l­me­n­te solo podían llevar a cabo otras al­te­r­na­ti­vas a los co­n­te­ne­do­res en Docker. A co­n­ti­nua­ción, abordamos un su­b­co­n­ju­n­to de los comandos ori­gi­na­les, ya que una lista completa sería demasiado extensa para este artículo.

Un co­n­te­ne­dor Docker consta de los si­guie­n­tes co­m­po­ne­n­tes. Estos comandos co­rre­s­po­n­die­n­tes están di­s­po­ni­bles para su gestión:

  1. Sistema operativo de co­n­te­ne­do­res y sistema de archivos de unión
  2. Co­m­po­ne­n­tes de software y co­n­fi­gu­ra­ción
  3. Variables de entorno y co­n­fi­gu­ra­ción en tiempo de ejecución
  4. Puertos y volúmenes
  5. Procesos y registros

¿Qué comandos de Docker Sta­n­da­lo­ne existen?

Para empezar, hoy en día la mayoría de las funciones de Docker se pueden controlar con los comandos de gestión de Docker. Aunque los comandos ori­gi­na­les siguen fu­n­cio­na­n­do, hay equi­va­le­n­tes más es­pe­cí­fi­cos:

Comando in­de­pe­n­die­n­te de Docker Comando equi­va­le­n­te de gestión de Docker Ex­pli­ca­ción
docker ps docker container ls Muestra los co­n­te­ne­do­res que se ejecutan en el host
docker images docker image ls Muestra las imágenes di­s­po­ni­bles en el host
docker inspect <object> docker <object-type> inspect <object>, z.B. docker image inspect <image> Muestra in­fo­r­ma­ción sobre objetos Docker como imágenes, co­n­te­ne­do­res, volúmenes, etc.

Sin embargo, todavía hay un grupo de comandos in­de­pe­n­die­n­tes de Docker. Estos no pueden ser su­s­ti­tui­dos por los comandos de gestión de Docker, ya que se refieren a la in­s­ta­la­ción de Docker en su conjunto:

Comando in­de­pe­n­die­n­te de Docker Ex­pli­ca­ción
docker --help Muestra la ayuda para la CLI de Docker
docker --version Muestra la versión de la in­s­ta­la­ción de Docker
docker info Muestra in­fo­r­ma­ción de todo el sistema sobre la in­s­ta­la­ción de Docker
docker login Accede a un registro de co­n­te­ne­do­res o a un backend de la nube
docker logout Sale del registro de co­n­te­ne­do­res o del backend de la nube

¿Qué comandos de Docker Container existen?

A di­fe­re­n­cia de la vi­r­tua­li­za­ción con máquinas virtuales, un co­n­te­ne­dor Docker no contiene su propio sistema operativo. En cambio, todos los co­n­te­ne­do­res que se ejecutan en un host Docker acceden al mismo núcleo del sistema operativo. A cada co­n­te­ne­dor se le asigna una de­te­r­mi­na­da cantidad de recursos del sistema por comando cuando se ejecuta. Se trata de la memoria, los núcleos de la CPU, el al­ma­ce­na­mie­n­to masivo y los di­s­po­si­ti­vos de red (virtuales). Aquí, te mostramos dos ejemplos:

Al principio, asignar un núcleo de CPU y 10 megabytes de memoria a los co­n­te­ne­do­res de Docker:

docker container run --cpus="1" --memory="10m" <image>

De­te­r­mi­nar el puerto TPC 80 del host Docker al puerto 80 del co­n­te­ne­dor Docker:

docker container run -p 80:80/tcp <image>

Los co­n­te­ne­do­res pueden iniciarse, detenerse y eli­mi­nar­se en un host. Además, se pueden controlar los procesos que se ejecutan dentro de un co­n­te­ne­dor. En co­n­se­cue­n­cia, muchos de los comandos de los co­n­te­ne­do­res Docker se ocupan de estas tareas:

Comando del co­n­te­ne­dor Docker Ex­pli­ca­ción
docker container ls Muestra los co­n­te­ne­do­res que se ejecutan en el host
docker container stats Muestra in­fo­r­ma­ción sobre el estado de los co­n­te­ne­do­res en fu­n­cio­na­mie­n­to
docker container run <image> Inicia un nuevo co­n­te­ne­dor desde la imagen es­pe­ci­fi­ca­da o ejecuta un comando en un nuevo co­n­te­ne­dor
docker container commit <container> Crea una nueva imagen a partir de los cambios de un co­n­te­ne­dor en fu­n­cio­na­mie­n­to
docker container attach <container> Pro­po­r­cio­na un co­n­te­ne­dor en ejecución con flujos locales de entrada, salida y error estándar
docker container logs <container> Muestra la in­fo­r­ma­ción de registro de un co­n­te­ne­dor
docker container inspect <container> Muestra in­fo­r­ma­ción detallada de un co­n­te­ne­dor
docker container update <container> Renueva la co­n­fi­gu­ra­ción de un co­n­te­ne­dor
docker container rename <container> <new-name> Da un nuevo nombre a un co­n­te­ne­dor
docker container port <container> Muestra la asi­g­na­ción de puertos de un co­n­te­ne­dor
docker container pause <container> Pone en pausa los procesos que se ejecutan en un co­n­te­ne­dor
docker container unpause <container> Reanuda la ejecución de los procesos pausados en un co­n­te­ne­dor
docker container exec <container> <command> Ejecuta un comando dentro de un co­n­te­ne­dor en fu­n­cio­na­mie­n­to
docker container stop <container> Detiene la ejecución de un co­n­te­ne­dor
docker container start <container> Reanuda la ejecución de un co­n­te­ne­dor detenido
docker container restart <container> Reinicia un co­n­te­ne­dor; se comporta como “docker container stop <container>; docker container start <container>”
docker container top <container> Lista de los procesos que se ejecutan dentro de un co­n­te­ne­dor
docker container kill <container> Detiene un co­n­te­ne­dor en marcha
docker container rm <container> Elimina un co­n­te­ne­dor del sistema
docker container prune Elimina todos los co­n­te­ne­do­res detenidos del sistema
docker container cp <container>:<source-path> <dest-path> Copia archivos y carpetas entre un co­n­te­ne­dor y el sistema de archivos local
docker container diff <container> Muestra los cambios en el sistema de archivos de un co­n­te­ne­dor
docker container export <container> Exporta el sistema de archivos de un co­n­te­ne­dor a un archivo tarball; todas las capas se reducen a una

¿Qué comandos de imagen de Docker existen?

A di­fe­re­n­cia de las imágenes de máquinas virtuales, una imagen de Docker no es un único archivo en su estado normal, sino está compuesto de varios co­m­po­ne­n­tes:

  • Ima­ge­La­ye­rs: contienen datos añadidos por la operación en el sistema de archivos. Las capas se su­pe­r­po­nen y se reducen a un nivel coherente mediante un sistema de archivos de unión.
  • Parent Image: pro­po­r­cio­na las funciones básicas de la imagen y ancla la imagen en el árbol raíz del eco­si­s­te­ma Docker.
  • Image Manifest: describe la co­m­po­si­ción e ide­n­ti­fi­ca las capas de imagen que contiene.

Una imagen de Docker contiene capas de solo lectura y cada capa describe cambios sucesivos en el sistema de archivos de la imagen. Por lo tanto, para cada operación que suponga un cambio en el sistema de archivos de la imagen, se crea una nueva capa. Los si­guie­n­tes comandos se utilizan para in­ter­ac­tuar con las imágenes en el host:

Comando de imagen de Docker Ex­pli­ca­ción
docker image build Crea una imagen de Docker a partir de un fichero de Docker
docker image history <image> Muestra los pasos para crear una imagen de Docker
docker image import <tarball> Crea una imagen de Docker a partir de un archivo “tarball”
docker image inspect <image> Muestra in­fo­r­ma­ción detallada de una imagen de Docker
docker image load Carga un archivo de imagen creado con “docker image save”
docker image ls Lista de imágenes di­s­po­ni­bles en el host Docker
docker image prune Elimina las imágenes de Docker no uti­li­za­das del host Docker
docker image pull <image> Obtiene la imagen de Docker del registro
docker image push <image> Envía una imagen a un registro
docker image rm <image> Elimina una imagen del host local
docker image save <image> Crea un archivo de imágenes con todas las capas de una imagen
docker image tag <source-image> <target-image> Etiqueta una imagen

¿Qué comandos de Docker Volume existen?

Un co­n­te­ne­dor de Docker contiene una apli­ca­ción aislada del mundo exterior. En muchos casos, sin embargo, es re­co­me­n­da­ble compartir archivos entre el co­n­te­ne­dor y el host. Para ello, Docker conoce di­fe­re­n­tes tipos de volúmenes. Las di­fe­re­n­cias entre los tipos de volumen son sutiles; la elección del tipo adecuado depende en gran medida del re­s­pe­c­ti­vo escenario de im­pla­n­ta­ción:

  • Volúmenes con nombre: re­co­me­n­da­do
  • Volúmenes anónimos: se pierden al eliminar el co­n­te­ne­dor
  • Bind Mounts: hi­s­tó­ri­ca­me­n­te co­n­di­cio­na­do y no re­co­me­n­da­do; ofrece re­n­di­mie­n­to
  • Tmpfs Mounts: están en memoria; solo en Linux

Hay un grupo de comandos de Docker di­s­po­ni­bles para in­ter­ac­tuar con los volúmenes:

Comando de volumen de Docker Ex­pli­ca­ción
docker volume ls Muestra los volúmenes ubicados en el host
docker volume prune Elimina todos los volúmenes no uti­li­za­dos del host
docker volume create Crea un nuevo volumen en el host
docker inspect <volume> Muestra in­fo­r­ma­ción detallada de un volumen
docker volume rm <volume> Elimina el volumen es­pe­ci­fi­ca­do del host
Ir al menú principal