El software de código abierto Docker se ha convertido en el estándar para virtualizar contenedores de aplicaciones. La virtualización de contenedores continuó el desarrollo de las máquinas virtuales con una importante diferencia: en lugar de simular un sistema operativo completo, se virtualiza una sola aplicación en un contenedor.
Docker se controla en el sistema local mediante una interfaz de línea de comandos, son esenciales para trabajar con este software de código abierto. A continuación, explicamos cómo funcionan los comandos de Docker y te presentamos los más importantes.
¿Qué son los comandos de Docker?
Para entender mejor qué son los comandos de Docker y cómo funcionan, vamos a explicar brevemente la estructura de Docker. La instalación de Docker en un host local contiene el Docker Engine como núcleo, que consta de tres componentes principales:
- El daemon de Docker, que se ejecuta como “dockerd” en el host.
- La API de Docker, proporcionada por el daemon de Docker. Este se dirige y se deja controlar a través de la API.
- La interfaz de línea de comandos (“command line interface”, CLI), que se utiliza como un comando de Docker para comunicarse 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 procesados por la CLI de Docker. A partir de los comandos, se generan las correspondientes 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 directamente con el software.
¿Cómo se estructuran los comandos de Docker?
Debido a su desarrollo histórico, se han establecido dos tipos de comandos de Docker.
En primer lugar, hay un grupo de comandos independientes, también conocidos como comandos Docker Standalone. Suelen ser verbos como, por ejemplo, “docker pull” o “docker build”. En general, este tipo de comando realiza una acción específica cuando se introducen en la plataforma. Sin embargo, a medida que la plataforma crecía, aparecían nuevas funcionalidades y, por tanto, resultaba cada vez más difícil encontrar verbos adecuados.
Después, se introdujeron los llamados “comandos de gestión de Docker” o comandos Docker Management. Su función es agrupar los comandos para volver a poner orden en la desbordante diversidad de comandos. Estos suelen ser sustantivos como, por ejemplo, los comandos “docker image” y “docker container”. Asimismo, los comandos de gestión de Docker se agrupan en subcomandos, que a su vez son verbos.
De este modo, los mismos verbos pueden utilizarse en diferentes 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 contenedor.
Independientemente de si se utilizan los comandos de Docker Standalone o los comandos de Docker Management, los comandos de Docker se introducen en la línea de comandos. Como es habitual, se introduce el nombre del comando seguido de los parámetros opcionales. En caso de que sea necesario, se introduce el nombre de uno o más objetos, que pueden ser contenedores, imágenes, volúmenes o similares.
Veamos la estructura 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 informació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 subcomando de Docker para mostrar la informació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 específico. Este puede ser un comando independiente o un comando de gestión seguido de un subcomando. Para ello, veamos primero el patrón general de un comando independiente de Docker. El nombre “docker” es seguido por el nombre del comando, parámetros opcionales y el nombre de un objeto Docker si es aplicable:
docker <command> [--options] <object>
Dos conocidos comandos independientes de Docker de uso productivo se utilizan para mostrar diversa información de estado:
# mostrar información de Docker
docker info
# mostrar imágenes de Docker en el host
docker images
A continuación, vamos a familiarizarnos 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 orgánicamente. Originalmente, existía el comando “docker Is” para listar los contenedores en un host y, análogamente, el comando “docker images” para listar imágenes. Como podrás ver, no era muy intuitivo. Aunque ambos comandos pueden seguir utilizándose, hoy en día existen alternativas consistentes utilizando “docker container Is” y “docker image Is”.
El esquema general de los comandos de gestión de Docker se basa en la estructura de los comandos independientes de Docker: el nombre “docker” va seguido del nombre del comando de gestión y su subcomando. Al finalizar el paso anterior, se concluye con parámetros opcionales, así como el nombre de un objeto Docker, si es el caso:
docker <management-command> <subcommand> [--options] <object>
Ilustremos el patrón con un ejemplo concreto. Aquí está el comando Docker para iniciar un nuevo contenedor desde la imagen “httpd” en modo interactivo:
docker container run -it httpd
Comparemos la estructura general de los comandos de gestión de Docker con los componentes individuales del ejemplo anterior:
Docker-CLI | Comando Docker | Opciones | Objeto | |
---|---|---|---|---|
Estructura | docker | <command> <subcommand> | [--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 escribirse exactamente como se indica en la documentación. | Las opciones se envían al comando y controlan su comportamiento. Hay dos anotaciones 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 contenedores 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 parámetros opcionales, llamados “opciones”. Las opciones siguen al nombre del comando y se distinguen entre mayúsculas y minúsculas. Normalmente, hay dos anotaciones para la mayoría de las opciones:
- Forma corta: -, por ejemplo “docker -v”
La forma corta tiene poco valor informativo. 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 arbitrario a la hora de combinar; también se puede escribir “docker run -ti” sin problemas. La forma corta es muy útil para trabajar rápidamente con comandos conocidos en la línea de comandos.
- Forma larga: --<Nombre de la opción>, por ejemplo “docker --version”
La forma larga es fácil de entender, pero lleva más tiempo escribirla y ocupa más espacio. Sin embargo, es adecuada para crear scripts, pues los nombres de las opciones sirven de documentación.
¿Cómo se relacionan Dockerfile, Docker Image y Docker Container?
Una gran parte de los comandos de Docker existentes se utilizan para gestionar Docker Container, Docker Images y Docker Volumes. Antes de entrar en detalles sobre los comandos específicos de Docker, vamos a dar una breve visión general de cómo se relacionan Container y Image, dos conceptos muy importantes en Docker.
Un contenedor Docker se crea a partir de una plantilla inmutable llamada imagen, que contiene las dependencias y los ajustes de configuración necesarios para crear un contenedor. No solo podemos crear un contenedor a partir de una imagen, sino también guardar un contenedor existente en una nueva imagen. Contenedor e imagen se relacionan entre sí como un huevo y una gallina:
Comando Docker | Función | Analogía gallina-huevo |
---|---|---|
docker build | Crear una imagen de Docker desde Dockerfile | Huevo provisto de información genética |
docker run <image> | Abrir un contenedor de Docker desde la imagen | El pollito sale del huevo |
docker commit <container> | Crear una imagen de Docker a partir de un contenedor | La gallina pone otro huevo |
Presentación de los comandos de Docker más importantes
Docker ha experimentado un rápido desarrollo en los últimos diez años. Además de la virtualización de contenedores original, Docker incluye hoy en día funciones que van mucho más allá. Por ejemplo, Docker-Compose y Docker-Swarm pueden utilizarse para orquestar uniones de contenedores, lo que tradicionalmente solo podían llevar a cabo otras alternativas a los contenedores en Docker. A continuación, abordamos un subconjunto de los comandos originales, ya que una lista completa sería demasiado extensa para este artículo.
Un contenedor Docker consta de los siguientes componentes. Estos comandos correspondientes están disponibles para su gestión:
- Sistema operativo de contenedores y sistema de archivos de unión
- Componentes de software y configuración
- Variables de entorno y configuración en tiempo de ejecución
- Puertos y volúmenes
- Procesos y registros
¿Qué comandos de Docker Standalone 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 originales siguen funcionando, hay equivalentes más específicos:
Comando independiente de Docker | Comando equivalente de gestión de Docker | Explicación |
---|---|---|
docker ps | docker container ls | Muestra los contenedores que se ejecutan en el host |
docker images | docker image ls | Muestra las imágenes disponibles en el host |
docker inspect <object> | docker <object-type> inspect <object>, z.B. docker image inspect <image> | Muestra información sobre objetos Docker como imágenes, contenedores, volúmenes, etc. |
Sin embargo, todavía hay un grupo de comandos independientes de Docker. Estos no pueden ser sustituidos por los comandos de gestión de Docker, ya que se refieren a la instalación de Docker en su conjunto:
Comando independiente de Docker | Explicación |
---|---|
docker --help | Muestra la ayuda para la CLI de Docker |
docker --version | Muestra la versión de la instalación de Docker |
docker info | Muestra información de todo el sistema sobre la instalación de Docker |
docker login | Accede a un registro de contenedores o a un backend de la nube |
docker logout | Sale del registro de contenedores o del backend de la nube |
¿Qué comandos de Docker Container existen?
A diferencia de la virtualización con máquinas virtuales, un contenedor Docker no contiene su propio sistema operativo. En cambio, todos los contenedores que se ejecutan en un host Docker acceden al mismo núcleo del sistema operativo. A cada contenedor se le asigna una determinada cantidad de recursos del sistema por comando cuando se ejecuta. Se trata de la memoria, los núcleos de la CPU, el almacenamiento masivo y los dispositivos de red (virtuales). Aquí, te mostramos dos ejemplos:
Al principio, asignar un núcleo de CPU y 10 megabytes de memoria a los contenedores de Docker:
docker container run --cpus="1" --memory="10m" <image>
Determinar el puerto TPC 80 del host Docker al puerto 80 del contenedor Docker:
docker container run -p 80:80/tcp <image>
Los contenedores pueden iniciarse, detenerse y eliminarse en un host. Además, se pueden controlar los procesos que se ejecutan dentro de un contenedor. En consecuencia, muchos de los comandos de los contenedores Docker se ocupan de estas tareas:
Comando del contenedor Docker | Explicación |
---|---|
docker container ls | Muestra los contenedores que se ejecutan en el host |
docker container stats | Muestra información sobre el estado de los contenedores en funcionamiento |
docker container run <image> | Inicia un nuevo contenedor desde la imagen especificada o ejecuta un comando en un nuevo contenedor |
docker container commit <container> | Crea una nueva imagen a partir de los cambios de un contenedor en funcionamiento |
docker container attach <container> | Proporciona un contenedor en ejecución con flujos locales de entrada, salida y error estándar |
docker container logs <container> | Muestra la información de registro de un contenedor |
docker container inspect <container> | Muestra información detallada de un contenedor |
docker container update <container> | Renueva la configuración de un contenedor |
docker container rename <container> <new-name> | Da un nuevo nombre a un contenedor |
docker container port <container> | Muestra la asignación de puertos de un contenedor |
docker container pause <container> | Pone en pausa los procesos que se ejecutan en un contenedor |
docker container unpause <container> | Reanuda la ejecución de los procesos pausados en un contenedor |
docker container exec <container> <command> | Ejecuta un comando dentro de un contenedor en funcionamiento |
docker container stop <container> | Detiene la ejecución de un contenedor |
docker container start <container> | Reanuda la ejecución de un contenedor detenido |
docker container restart <container> | Reinicia un contenedor; 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 contenedor |
docker container kill <container> | Detiene un contenedor en marcha |
docker container rm <container> | Elimina un contenedor del sistema |
docker container prune | Elimina todos los contenedores detenidos del sistema |
docker container cp <container>:<source-path> <dest-path> | Copia archivos y carpetas entre un contenedor y el sistema de archivos local |
docker container diff <container> | Muestra los cambios en el sistema de archivos de un contenedor |
docker container export <container> | Exporta el sistema de archivos de un contenedor a un archivo tarball; todas las capas se reducen a una |
¿Qué comandos de imagen de Docker existen?
A diferencia 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 componentes:
- ImageLayers: contienen datos añadidos por la operación en el sistema de archivos. Las capas se superponen y se reducen a un nivel coherente mediante un sistema de archivos de unión.
- Parent Image: proporciona las funciones básicas de la imagen y ancla la imagen en el árbol raíz del ecosistema Docker.
- Image Manifest: describe la composición e identifica 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 siguientes comandos se utilizan para interactuar con las imágenes en el host:
Comando de imagen de Docker | Explicació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 informació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 disponibles en el host Docker |
docker image prune | Elimina las imágenes de Docker no utilizadas 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 contenedor de Docker contiene una aplicación aislada del mundo exterior. En muchos casos, sin embargo, es recomendable compartir archivos entre el contenedor y el host. Para ello, Docker conoce diferentes tipos de volúmenes. Las diferencias entre los tipos de volumen son sutiles; la elección del tipo adecuado depende en gran medida del respectivo escenario de implantación:
- Volúmenes con nombre: recomendado
- Volúmenes anónimos: se pierden al eliminar el contenedor
- Bind Mounts: históricamente condicionado y no recomendado; ofrece rendimiento
- Tmpfs Mounts: están en memoria; solo en Linux
Hay un grupo de comandos de Docker disponibles para interactuar con los volúmenes:
Comando de volumen de Docker | Explicación |
---|---|
docker volume ls | Muestra los volúmenes ubicados en el host |
docker volume prune | Elimina todos los volúmenes no utilizados del host |
docker volume create | Crea un nuevo volumen en el host |
docker inspect <volume> | Muestra información detallada de un volumen |
docker volume rm <volume> | Elimina el volumen especificado del host |