Tutoriales y Manuales
Entradas Mensuales
-
▼
2024
(Total:
1075
)
-
▼
noviembre
(Total:
96
)
- Australia prohíbe el uso de las redes sociales a m...
- Una cámara de seguridad capta como un robot con In...
- WebTunnels de Tor: otra forma de evitar la censura
- Bootkitty: primer Bootkit UEFI para Linux
- elementary OS 8 con más seguridad, mejor gestión m...
- La botnet Matrix realiza ataques DDoS masivos expl...
- Un profesor suspende a dos alumnos por usar la IA,...
- Artistas filtran Sora, el generador de vídeos de O...
- TikTok bloqueará los filtros de belleza a los adol...
- ¿Qué ocurre con el dominio geográfico de un país c...
- Un nuevo ciberataque de ransomware al CSIC en Espa...
- FreeCAD 1.0, primera versión «completa» de esta al...
- Grupo ruso RomCom realiza ciberataques en España y...
- Detectan un malware que utiliza un driver de Avast
- Investigadores hacen jailbreak a robots para causa...
- Tiny11 Core 24H2, Windows 11 compacto y sin bloatw...
- Suecia apostó en 2009 por sustituir libros por ord...
- Meta cierra 2 millones de cuentas ligadas a estafa...
- Análisis técnico del keylogger e infostealer HawkEye
- Vulnerabilidades graves en Winzip y 7-Zip
- Fallo en el diseño de la VPN de Fortinet oculta at...
- Cómo instalar Pi.Alert en una Raspberry Pi
- Espías rusos saltaron de una red a otra a través d...
- WhatsApp activa la transcripción de audios para fa...
- Un chaval de 13 años crea una criptomoneda y logra...
- Cómo pasar tus contactos de X / Twitter a Bluesky
- Listado de comandos en Windows 10 - 11
- Un fan de Interstellar crea un TARS en miniatura y...
- El Departamento de Justicia de EE.UU. dice que Goo...
- El Constitucional de España absuelve finalmente a ...
- Vulnerabilidad crítica de Laravel
- Nuevo ransomware Helldown
- Vulnerabilidad Crítica en Routers D-Link Fuera de ...
- Microsoft presenta Windows 365 Link, su Mini-PC pa...
- Aprovechan servidores Jupyter mal configurados par...
- Apple soluciona dos vulnerabilidades Zero-Days en ...
- Microsoft prepara un ordenador cuántico de uso com...
- IA logra operar sin intervención humana
- 12 aplicaciones de Android graban conversaciones s...
- Next SBC, el espectacular mini PC que te cabe en l...
- El chatbot Gemini de Google le responde a un usuar...
- Alemania y Finlandia denuncian el corte del cable ...
- Una vulnerabilidad en el complemento SSL de WordPr...
- EE.UU. quiere obligar a Google a vender Chrome por...
- ¿Qué significa PON, GPON, XG-PON, 10G-EPON…?
- Comandos de Docker básicos y avanzados
- Memorias DIMM vs UDIMM vs CUDIMM vs RDIMM vs SODIMM
- Microsoft confirma que está creando una IA con 100...
- AsusWRT 4.0 - 5.0 (Firmware 3.0.0.6)
- Qué es LLaMA, cómo funciona y cómo se puede probar...
- Qué placa base elegir: Guía de compras para Intel ...
- Las mejores distribuciones de Linux para usuarios ...
- Llega a España el malware ToxicPanda: un troyano b...
- Extraen datos de casi 500 millones de usuarios de ...
- La Guardia Civil desactiva Cristal Azul, el canal ...
- Google presenta dos funciones seguridad para Andro...
- OPNsense: un router y firewall gratuito
- El SSD más rápido del mundo con 60 TB con una velo...
- Guía de compra de todas las RaspBerry Pi
- Qué es una NPU, cómo funciona y por qué es importa...
- El peligro de los dominio .zip
- AMD despedirá al 4 % de su plantilla para centrars...
- Informe dark web de Google
- Apple Maps sin conexión: cómo descargar mapas y us...
- Hachazos y amputaciones por el Wifi: violenta trif...
- VMware Workstation y Fusion ahora son gratis
- Aprovechan el calor de la PS5 para mantener la piz...
- Guía compra AMD Ryzen 3, Ryzen 5, Ryzen 7 y Ryzen 9
- 50 cosas que puedes pedirle a Alexa y no conocías
- Mover archivos más rápido en Windows con "Enviar a"
- La Comisión Europea pide a Apple que elimine el ge...
- Grabar pantalla en macOS
- Apple presenta Share Item Location, la función par...
- Microsoft cambiará actualizaciones de Windows para...
- D-Link no solucionará una vulnerabilidad crítica q...
- Polvo cerámico mejora hasta un 72% el rendimiento ...
- Concatenación de ficheros comprimidos para infecta...
- Filtran datos de empleados de Amazon, McDonald's, ...
- El código IUA escrito en la roseta de fibra óptica...
- Fibra luminosa, descubierta por accidente, podría ...
- Canadá prohíbe el uso de TikTok
- Google tumbó la web de este matrimonio por hacerle...
- Visualizar con Grafana los eventos del IDS/IPS Sur...
- China está usando la IA de Meta para fines militares
- Multa de 85 millones a Telefónica en Estados Unido...
- Vulnerabilidad API de la web de Kia permitió a ata...
- Google revela el primer fallo de seguridad descubi...
- La IA llega a Paint y Notepad en Windows 11
- Alemania redacta una ley para proteger a los inves...
- Microsoft ralentizó el Panel de Control de Windows...
- Guías Equivalencias de procesadores Intel y AMD [G...
- Roban 15 mil credenciales en Git y hay 10 mil repo...
- Publican información del creador del infostealer "...
- Vulnerabilidad RCE en MS SharePoint explotada acti...
- Panel de Control Grafana para el WAF de Apache-Ngi...
- Cómo visualizar los registros de Apache/Nginx en m...
- ► septiembre (Total: 50 )
-
▼
noviembre
(Total:
96
)
-
►
2023
(Total:
710
)
- ► septiembre (Total: 65 )
-
►
2022
(Total:
967
)
- ► septiembre (Total: 72 )
-
►
2021
(Total:
730
)
- ► septiembre (Total: 56 )
-
►
2020
(Total:
212
)
- ► septiembre (Total: 21 )
-
►
2019
(Total:
102
)
- ► septiembre (Total: 14 )
-
►
2017
(Total:
231
)
- ► septiembre (Total: 16 )
-
►
2016
(Total:
266
)
- ► septiembre (Total: 38 )
-
►
2015
(Total:
445
)
- ► septiembre (Total: 47 )
-
►
2014
(Total:
185
)
- ► septiembre (Total: 18 )
-
►
2013
(Total:
100
)
- ► septiembre (Total: 3 )
-
►
2011
(Total:
7
)
- ► septiembre (Total: 1 )
Blogroll
Etiquetas
Entradas populares
-
Después de ver qué es una vCPU y la diferencia entre núcleos (cores) e hilos en los procesadores, pasamos a explicar toda la nomenclatura d...
-
Un conector HDMI dummy o fantasma no es más que un HDMI que simula que hay una pantalla conectada. Tienen una variedad de propósitos útil...
-
Si estos días vas a cualquiera de las plataformas de venta que hay en internet y buscas un USB probablemente te encuentras con no pocos con ...
Comandos de Docker básicos y avanzados
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.
¿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
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:
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
¿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 |
Variables de entorno y configuración de tiempo de ejecución
Siguiendo la metodología de las app de doce factores, la configuración de un contenedor Docker se almacena en variables de entorno. Por configuración, nos referimos a todos los valores que cambian entre los diferentes entornos, como el sistema de desarrollo frente al de producción. Esto suele incluir nombres de host y credenciales de la base de datos.
Los valores de las variables de entorno influyen en el comportamiento del contenedor. Para que las variables de entorno estén disponibles dentro de un contenedor, se utilizan principalmente dos vías:
1. Definición en Dockerfile
Una variable de entorno se declara en un Dockerfile con la instrucción ENV. Ahí es posible asignar un valor por defecto, que se utilizará si la variable de entorno está vacía al iniciar el contenedor.
2. Pasar variable al iniciar el contenedor
Para acceder en el contenedor a una variable de entorno que no ha sido declarada en el Dockerfile, pasamos la variable al iniciar el contenedor. Esto sirve para las variables individuales a través de parámetros de la línea de comandos. Además, es posible pasar el archivo llamado Env, que define varias variables de entorno y sus valores.
Este es el patrón para pasar una variable de entorno al iniciar el contenedor:
docker run --env <env-var> <image-id></image-id></env-var>
En muchas variables de entorno merece la pena pasar un archivo Env:
docker run --env-file /path/to/.env <image-id></image-id>
Con el comando “docker inspect”, las variables de entorno de los contenedores pueden mostrar su valor, por lo que hay que tener cuidado al utilizar datos sensibles en variables de entorno.
Al iniciar el contenedor desde una imagen, se pueden transferir los parámetros de configuración, entre los que se encuentran las cantidades asignadas de los recursos del sistema, que por lo demás son ilimitados. Además, también se utilizan los parámetros de inicio para definir los puertos y volúmenes del contenedor (más información en la siguiente sección). Los parámetros de inicio pueden incluso sobrescribir los valores previamente asignados en el Dockerfile. A continuación, reunimos varios ejemplos.
Asignar un núcleo CPU y 10 megabytes de almacenamiento al Docker Container al iniciarlo:
docker run --cpus="1" --memory="10m" <image-id></image-id>
Liberar los puertos definidos en el Dockerfile al iniciar el contenedor:
docker run -P <image-id></image-id>
Mapear el puerto TCP 80 del host de Docker al puerto 80 del contenedor de Docker:
docker run -p 80:80/tcp <image-id></image-id>
Puertos y volumen
Un Docker Container contiene una aplicación aislada del mundo exterior. Para sacarle partido, debe poder interactuar con el entorno. Por eso, existen maneras de intercambiar datos entre host y container así como entre múltiples contenedores. Así, las interfaces estandarizadas permiten utilizar un contenedor en distintos entornos.
Comunicarse desde el exterior con los procesos en ejecución dentro de un container es posible mediante puertos en red liberados. Aquí se utilizan los protocolos estándar TCP y UDP. A modo de ejemplo, imaginemos un contenedor de Docker que contiene un servidor web y escucha al puerto 8080 TCP. Además, el Dockerfile de la Docker Image contiene la línea 'EXPOSE 8080/tcp'. Iniciamos el contenedor con 'docker run -P' y accedemos al servidor web desde la dirección 'http://localhost:8080'.
Los puertos sirven para la comunicación con los servicios que están ejecutándose dentro del contenedor. No obstante, en muchos casos tiene sentido utilizar un archivo compartido entre el contenedor y el sistema host para intercambiar datos. Con esta finalidad, Docker conoce distintos tipos de volumen:
- Volúmenes con nombre: recomendados
- Volúmenes anónimos: se pierden al eliminar el contenedor
- Bind mounts: históricamente relativos y no recomendados; performante
- Tmpfs mounts: están en la memoria de trabajo; solo en Linux
Hay diferencias sutiles entre tipos de volúmenes. Elegir el tipo adecuado depende significativamente del uso que se le vaya a dar. Explicarlos en mayor detalle se saldría del alcance de este artículo.
Procesos y logs
Un contenedor Docker suele encapsular una aplicación o servicio. El software que se ejecuta dentro del contenedor forma un conjunto de procesos en ejecución. Los procesos de un contenedor Docker están aislados de los procesos de otros contenedores o del sistema host. Dentro de un Docker Container, los procesos pueden iniciarse, detenerse y enumerarse. Se controlan a través de la línea de comandos o a través de la API de Docker.
Los procesos en ejecución emiten continuamente información de estado. Siguiendo la metodología de la app de doce factores, se utilizan los flujos de datos estándar STDOUT y STDERR para la salida. La salida de estos dos flujos de datos puede leerse con el comando 'docker logs'. Como alternativa, puede utilizarse el llamado controlador de registro. El controlador de registro estándar escribe los logs en formato JSON.
Uso del comando “volume create” de Docker
A partir de la versión 1.9.0, que salió el 3 de noviembre de 2015, los Docker volumes se pueden crear y gestionar fácilmente con el comando docker volume integrado.
Paso 1. Crear y nombrar el volumen
El comando docker volume create crea un volumen identificado con un nombre. El nombre te permite encontrar fácilmente los Docker volumes y poder asignarlos a los contenedores específicos.
Para crear un volume, utiliza el siguiente comando:
sudo docker volume create - - name [volume name]
Paso 2. Usar el volume en un contenedor de Docker
Para crear un container que utilice un volume creado con docker volume create, añade el siguiente parámetro al comando docker run:
-v [volume name]:[container directory]
Para, por ejemplo, ejecutar un contenedor desde una imagen de CentOS llamada my-volume-test y asignar el data-volume al directorio o el data al container, el comando es el siguiente:
sudo docker run -it --name my-volume-test -v data-volume:/data centos /bin/bash
Paso 3. Listar los volumes
Para listar los Docker volumes que hay en el sistema, utiliza el siguiente comando:
sudo docker volume ls
Este comando emite una lista de todos los Docker volumes creados en el host.
Paso 4. Inspeccionar el volume
Para inspeccionar un volume concreto, utiliza el siguiente comando:
sudo docker volume inspect [volume name]
Este comando te proporciona información sobre el volume que hayas indicado, incluyendo el mount point y el directorio en el sistema host a través del cual se puede acceder al Docker volume.
Para, por ejemplo, obtener más información sobre el volume llamado “data” que hemos creado anteriormente, el comando a utilizar es el siguiente:
sudo docker volume inspect data-volume
Paso 5. Eliminar el volume
Para eliminar un volume creado de esta manera, utiliza el siguiente comando:
sudo docker volume rm [volume name]
No se puede eliminar un volume si está siendo utilizado por un contenedor existente. Antes de poder eliminar el volume, debes detener y eliminar el contenedor de Docker con los siguientes comandos:
sudo docker stop [container name or ID]
sudo docker rm [container name or ID]
Para, por ejemplo, eliminar el volume llamado “Data”, primero debes detener y eliminar el container que lo utiliza con my-volume-test:
sudo docker stop my-volume-test
sudo docker rm my-volume-test
El siguiente comando:
sudo docker volume rm data-volume
Crear un Docker volume e indicar el directorio del host deseado
Si quieres hacer que un directorio concreto del ordenador host se monte como Docker volume en el contenedor, añade el siguiente parámetro a tu comando docker run:
-v [host directory]:[container directory]
Para, por ejemplo, crear un nuevo contenedor y asignar la carpeta /webfiles del host a la carpeta /var/www/html del contenedor, el comando es:
sudo docker run -it -v /webfiles:/var/www/html centos /bin/bash
Prueba esto creando un directorio que luego puedas usar como Docker volume. Para ello ejecuta el siguiente comando:
sudo mkdir /hostvolume
Añade un pequeño archivo de prueba a este directorio con el siguiente comando:
sudo echo "Hello World" >> /hostvolume/host-hello.txt
A continuación, crea un contenedor llamado my-directory-test y asigna la carpeta /hostvolume del host a la carpeta /containervolume del contenedor con el siguiente comando:
sudo docker run -it --name my-directory-test -v /hostvolume:/containervolume centos /bin/bash
Una vez te encuentres en la línea de comandos del nuevo contenedor, puedes mostrar una lista de los archivos del volumen compartido con el siguiente comando:
ls /containervolume
Verás el archivo host-hello.txt que hemos creado en el ordenador host.
Esto también funciona en sentido contrario. Los archivos que pongas en este directorio se mostrarán también en el host. Puedes probarlo desde el contenedor añadiendo otro archivo al volumen compartido con el siguiente comando:
echo "Hello from the container." >> /containervolume/container-hello.txt
Sal del container con [Ctrl] + [P] y [Ctrl] + [Q] y vuelve a la línea de comandos del ordenador host. Allí, muestra una lista de los archivos en el volumen compartido con este comando:
sudo ls /hostvolume
Puedes ver los dos archivos de prueba que hemos creado desde el host y el contenedor.
Crear un Docker volume con un archivo Docker
Utiliza el siguiente comando en un archivo Docker para crear un espacio de almacenamiento compartido en el contenedor:
VOLUME [volume path]
Para, por ejemplo, crear un volume /myvolume en el contenedor lanzado desde un archivo Docker, el comando es:
VOLUME /myvolume
Para poder probarlo, primero crea un archivo llamado Dockerfile con el siguiente comando:
sudo nano Dockerfile
Introduce el siguiente contenido en el archivo:
# The source image to start with FROM centos# Create a volume VOLUME /dockerfilevolume
Guarda y cierra el archivo.
Luego, crea una imagen llamada dockerfile-volumetest a partir del archivo Docker que acabas de redactar. Crea la imagen con el siguiente comando:
sudo docker build -t dockerfile-volumetest
A continuación, crea un contenedor llamado my-dockerfile-test desde la imagen que acabas de crear, para ello usa el siguiente comando:
sudo docker run --name my-dockerfile-test -it dockerfile-volumetest /bin/bash
Una vez estés en la línea de comandos del nuevo contenedor, utiliza este comando para crear un pequeño archivo de prueba en el volumen compartido:
echo "Hello World" >> /dockerfilevolume/dockerfile-container-hello.txt
Sal del contenedor con [Ctrl] + [P] y [Ctrl] + [Q] y vuelve a la línea de comandos del ordenador host.
A continuación, busca el mount point. Para ello, utiliza el siguiente comando:
sudo docker inspect my-dockerfile-test
Busca en el resultado del comando una sección titulada “Mounts” que se parezca a:
Fuente/Source es el directorio en el ordenador host.
Destino/Destination es la carpeta del container.
Comprueba el directorio de origen en tu ordenador host. Para nuestro ejemplo, el comando es el siguiente:
sudo ls /var/lib/docker/volumes/30275034a424251a771c91b65ba44261a27f91e3f6af31097b5226b1f46bfe20/_data/test
Aquí encontrarás el archivo dockerfile-container-hello.txt que has creado en el container.
Resumen de las ventajas y desventajas de los distintos métodos
Método | Ventajas | Desventajas |
Comando “volume create” | Manejo rápido y sencillo | El volume del host se crea automáticamente, pero es difícil de encontrar |
Crear un Docker volume con directorio en el host | El container se puede asignar a una carpeta específica del host | No es posible dar nombre al volume ni automatizarlo mediante Dockerfile |
Crear un volumen con un archivo Docker | Automatización del proceso | No se asigna una carpeta host ni se puede dar nombre a el volume |
Compartir Docker volumes entre contenedores
Hay muchas situaciones en las que tiene sentido compartir un Docker volume entre containers, y hay varias maneras de compartirlo.
Compartir un volume del host
Cuando creas un volume en el ordenador host, este puede ser utilizado por varios contenedores diferentes al mismo tiempo. Esto te permite intercambiar datos entre los contenedores y el host.
Para este ejemplo, crea un directorio en el host y utiliza este directorio como un volume compartido entre dos contenedores.
Comienza utilizando el siguiente comando para crear un directorio que puedas utilizar como Docker volume:
sudo mkdir /webdata
Crea un pequeño archivo de prueba en este directorio con el siguiente comando:
sudo echo "Hello from the host." >> /webdata/host-hello.txt
A continuación, crea un container llamado sql-database desde la imagen oficial de PostgreSQL y asigna /webdata del host con el comando /data del contenedor:
sudo docker run -it --name sql-database -v /webdata:/data postgres /bin/bash
Una vez estés en la línea de comandos del nuevo contenedor, comprueba con el siguiente comando que el volume compartido está configurado correctamente:
ls /data
Verás el archivo host-hello.txt que hemos creado en el host. Añade un archivo al volume compartido con el siguiente comando:
echo "Hello from the sql-database container." >> /data/sql-hello.txt
Sal del container con [Ctrl] + [P] y [Ctrl] + [Q] y vuelve a la línea de comandos del ordenador host.
Ahora crea un container llamado “Webapp” desde la imagen oficial de PHP+Apache y asigna /webdata del host a /var/www/html del container.
sudo docker run -it --name webapp -v /webdata:/var/www/html php:5.6-apache /bin/bash
Una vez estés en la línea de comandos del nuevo contenedor, utiliza el siguiente comando para comprobar si el volume compartido se ha configurado correctamente:
ls /var/www/html
Verás tanto el archivo host-hello.txt que creaste en el host como el archivo sql-hello.txt que creaste en el contenedor de la base de datos SQL.
Ahora añade un archivo del último contenedor que has creado:
echo "Hello from the webapp container." >> /var/www/html/webapp-hello.txt
Sal del contenedor con [Ctrl] + [P] y [Ctrl] + [Q] y vuelve a la línea de comandos del ordenador host. En el host, puedes ver los tres archivos con el siguiente comando:
sudo ls /webdata
Dado que los dos contenedores comparten ahora un directorio que “vive” en el host, los datos pueden transferirse instantáneamente entre las tres ubicaciones con simplemente ser movidos a este directorio.
Configurar un contenedor como volumen de datos compartidos
También puedes configurar un contenedor independiente como volumen de datos compartido.
Para ello, primero debes crear el contenedor de datos. A continuación, a la hora de crear el contenedor que utilizará este contenedor de datos, añade el siguiente parámetro al comando docker run:
--volumes-from [name or ID of data container]
Esto funciona independientemente de si el contenedor de destino se está ejecutando o no. Los Docker volumes nunca se borran y permanecen incluso después de que el contenedor deje de ejecutarse.
Para este ejemplo, crea un contenedor de datos llamado “Data-Storage” que sirve como volumen de datos. Además, se crean otros dos contenedores que comparten el contenedor de datos como espacio de almacenamiento.
Lo primero es iniciar el contenedor de almacenamiento de datos desde la imagen oficial de CentOS 7:
sudo docker run -it -v /shared-data --name data-storage centos /bin/bash
A continuación, añade un pequeño archivo de prueba a la carpeta /shared-data:
echo "Hello from the data-storage container." >> /shared-data/data-storage-hello.txt
Sal del contenedor con [Ctrl] + [P] y [Ctrl] + [Q] y vuelve a la línea de comandos del ordenador host.
Ahora inicia el contenedor de aplicaciones desde la imagen oficial de Python y monta el contenedor de almacenamiento de datos como un volume:
sudo docker run -it --name app --volumes-from data-storage python /bin/bash
Muestra una lista de los archivos en el volume compartido con el siguiente comando:
ls /shared-data
Como puedes ver, la carpeta /shared-data ha sido montada en el contenedor de almacenamiento de datos y contiene el archivo data-storage-hello.txt.
Ahora añade un archivo del contenedor de aplicaciones:
echo "Hello from the app container." >> /shared-data/app-hello.txt
Sal del contenedor con [Ctrl] + [P] y [Ctrl] + [Q] y vuelve a la línea de comandos del ordenador host.
Por último, inicia el contenedor web desde la imagen oficial de Apache y monta el contenedor de almacenamiento de datos como un volume:
sudo docker run -it --name web --volumes-from data-storage httpd /bin/bash
Muestra una lista de los archivos en el volumen compartido con el siguiente comando:
ls /shared-data
Así podrás ver los archivos que hemos creado en los contenedores de almacenamiento y de aplicaciones.
0 comentarios :
Publicar un comentario
Los comentarios pueden ser revisados en cualquier momento por los moderadores.
Serán publicados aquellos que cumplan las siguientes condiciones:
- Comentario acorde al contenido del post.
- Prohibido mensajes de tipo SPAM.
- Evite incluir links innecesarios en su comentario.
- Contenidos ofensivos, amenazas e insultos no serán permitidos.
Debe saber que los comentarios de los lectores no reflejan necesariamente la opinión del STAFF.