Introducción a Docker - Parte 2 (Docker Compose, Docker File, Docker Volume)
¡Hola Comunidad!
En mi artículo anterior, aprendimos estos temas:
-
¿Qué es Docker?
-
Algunos de los beneficios de Docker
-
¿Cómo funciona Docker?
-
Imagen de Docker
-
Contenedores Docker
-
Repositorio de imágenes Docker
-
Repositorio de imágenes Docker de InterSystems
-
Instalación de Docker
-
Comandos básicos de Docker
-
Ejecutar la Community Edition de IRIS utilizando Docker
-
Interfaz gráfica de Docker Desktop
En este artículo trataré los siguientes temas:
-
Uso del archivo Docker Compose (un fichero YAML)
-
Uso del archivo Docker (empleado para construir una imagen Docker)
-
Uso de Docker Volume
Comencemos.
1. Uso del archivo Docker Compose ( un archivo YAML)
Docker Composees una herramienta desarrollada para ayudar a definir y compartir aplicaciones multicontenedor. Con Compose, podemos crear un archivo YAML para definir los servicios y, con un solo comando, podemos poner todo en marcha o desmontarlo.
Una gran ventaja de utilizar Compose es la posibilidad de definir un conjunto de aplicaciones en un archivo y mantenerlo en la raíz del repositorio del proyecto. También se puede permitir que otra persona contribuya a los proyectos con facilidad. Sólo tendrían que clonar el repositorio e iniciar la app de compose.
En mi artículo anterior, utilizamos el comando mencionado a continuación para crear e iniciar el contenedor con la versión community de InterSystems IRIS:
docker run -d -p 52773:52773 intersystemsdc/iris-community Ahora, vamos a modificar este comando y a añadir un nombre de contenedor, mapear más puertos y establecer la opción de reinicio:
docker run -d -p 52773:52773 -p 53773:53773 -p 1972:1972 --name iris --restart=always intersystemsdc/iris-community.png)
Voy a desglosar el comando mencionado anteriormente:
#docker run command to create and start the container
docker run
#-d -an option used to start container in deattach mode
-d
#-p -an option is used to map the ports
-p 52773:52773
-p 53773:53773
-p 1972:1972
#name of the container
--name iris
#set the restart option to always
--restart=always
#base image
intersystemsdc/iris-community
Crear el archivo Compose
En la carpeta raíz, hay que crear un archivo llamado docker-compose.yml a y escribir los comandos mencionados anteriormente, como se indica a continuación:
#specify docker-compose versionversion:'3.6'#services/container detailsservices:#Name of the container iris:#Base Image image:intersystemsdc/iris-community
#set restart option restart:always#port mapping ports: -55036:1972 -55037:52773 -53773:53773El mapeo del comando docker run y un archivo docker-compose se muestra a continuación:
.png)
A continuación se muestra un pantallazo de un archivo Docker-compose:
.png)
Para ejecutar el código del archivo docker-compose, utilizaremos el comando docker-compose up:
docker-compose up -d-do-detach: una opción que ejecuta el comando en segundo plano y devuelve el control al terminal.
.png)
El contenedor se inicia. Vamos a ejecutar el comando "docker ps" para listar los contenedores en ejecución
.png)
Como se puede ver, estamos obteniendo el mismo resultado con el archivo docker-compose.
Crear e iniciar múltiples contenedores
Con la ayuda de docker-compose no sólo podemos ejecutar múltiples contenedores, sino también organizar y añadir más comandos a elllos.
Por ejemplo, en el siguiente archivo docker-compose estamos ejecutando el contenedor MongoDB junto con el contenedor iris:
#specify docker-compose version
version: '3.6'
#services/container details
services:
#Name of the container
iris:
#Base Image
image: intersystemsdc/iris-community
#set restart option
restart: always
#port mapping
ports:
- 55036:1972
- 55037:52773
- 53773:53773
#start MongoDB container
mongodb:
image: mongo
ports:
- 27017:27017 Vamos a ejecutar el comando docker-compose up
.png)
Tanto los contenedores de MongoDB como los de IRIS han sido creados e iniciados ahora.
2. El archivo Docker
Docker puede construir imágenes automáticamente leyendo las instrucciones de unDockerfile. Un Dockerfile es un documento de texto que contiene todos los comandos que un usuario podría llamar en la línea de comandos para montar una imagen.
Así pues, nuestra primera pregunta es sencilla ¿Qué es un Dockerfile? Es lo que Docker utiliza para generar la imagen. El Dockerfile es esencialmente el conjunto de instrucciones necesarias para construir la imagen.
La ventaja de un Dockerfile sobre simplemente almacenar la imagen binaria es que las construcciones automáticas de las imágenes asegurarán que se tiene la última versión disponible. Es algo bueno desde el punto de vista de la seguridad, porque hay que asegurarse de que no se está instalando ningún software vulnerable.
Comandos comunes de archivos Docker
A continuación encontraréis algunos de los comandos Docker más utilizados. Tened en cuenta que todos los comandos Docker deben ir en mayúsculas.
FROM
El comando FROM indica en qué imagen se basó. Este es el enfoque multicapa que hace que Docker sea tan eficiente y potente. En esta instancia se utilizó la imagen Docker iris-community, que hace referencia a un Dockerfile una vez más para automatizar el proceso de construcción.
FROM intersystemsdc/iris-communityWORKDIR
Este comando se utiliza para establecer un directorio de trabajo en el que copiaremos los archivos. Por ejemplo, el siguiente comando establecerá /opt/irisbuild como directorio de trabajo:
WORKDIR /opt/irisbuildCOPY
El comando COPY es tan simple como suena. Puede copiar archivos al contenedor. Normalmente, copiamos archivos de configuración personalizados, archivos fuente de aplicaciones, archivos de datos, etc.
#coping Installer.cls to a root of workdir. Don't miss the dot, here.COPY Installer.cls .
#copy source files from src folder to src folder in workdir in the docker container.COPY src src
#copy source files from data/fhir folder to fhirdata folder in the docker container.COPY data/fhir fhirdataENV
Establece las variables de entorno, que se pueden utilizar en el Dockerfile y en cualquier script que llame. La instrucción ENV define la variable de entorno <key> al valor <value>.
ENV USER_ID "SYSTEM"ENV USER_PASSWORD "MANAGER"RUN
El comando RUN se utiliza para ejecutar comandos durante el proceso de creación de imágenes.
#here we give the rights to irisowner user and group which are run IRIS.RUN chown ${ISC_PACKAGE_MGRUSER}:${ISC_PACKAGE_IRISGROUP} /opt/irisapp
#start IRIS and run script in iris.script file RUN iris start IRIS \
&& iris session IRIS < /tmp/iris.scriptUSER
De forma predeterminada, los contenedores se ejecutan como root, lo que les proporciona un control total del host del sistema. A medida que la tecnología de contenedores madura, es posible que estén disponibles opciones predeterminadas más seguras. Por ahora, requering root es peligroso para otros y puede no estar disponible en todos los entornos. La imagen debe utilizar la instrucción USER para especificar un usuario que no sea root para que los contenedores se ejecuten. Si el software no crea su propio usuario, se puede crear un usuario y un grupo en el archivo Dockerfile.
#here we switch user to a root to create a folder and copy files in docker.USER root
WORKDIR /opt/irisapp
#switching user from root to irisowner, to copy filesUSER irisowner
COPY src srcPara más detalles, consultad la Documentación oficial de Docker
3. Docker Volume
Un Docker volume es un sistema de archivos independiente totalmente gestionado por Docker. Existe como un archivo o directorio estándar en el host donde persisten los datos.
El propósito de utilizar Docker volumes es mantener los datos fuera del contenedor para que estén disponibles para realizar copias de seguridad o para compartirlos.
Los Docker volumes dependen del sistema de archivos de Docker y son el método preferido de persistencia de datos para los contenedores y servicios Docker. Cuando se inicia un contenedor, Docker carga la capa de imagen de sólo lectura, añade una capa de lectura-escritura encima del conjunto de imágenes y monta los volúmenes en el sistema de archivos del contenedor.
Utilizamos la etiqueta -v o --volume para permitirnos montar archivos locales en el contenedor.
Los volúmenes son el mecanismo preferido para hacer persistir los datos generados y utilizados por los contenedores Docker. Mientras que los montajes de enlace (bind mounts) dependen de la estructura del directorio y del SO de la máquina host, los volúmenes son gestionados completamente por Docker. Los volúmenes tienen varias ventajas sobre los bind mounts:
- Los volúmenes son más fáciles de respaldar o migrar que los bind mounts.
- Los volúmenes se pueden gestionar utilizando los comandos CLI de Docker o la API de Docker.
- Los volúmenes funcionan tanto en contenedores Linux como Windows.
- Los volúmenes se pueden compartir de forma más segura entre varios contenedores.
- Los controladores de volúmenes permiten almacenar volúmenes en hosts remotos o proveedores en la nube, cifrar el contenido de los volúmenes o añadir otras funcionalidades.
- Los nuevos volúmenes pueden tener su contenido pre-poblado por un contenedor.
- Los volúmenes en Docker Desktop tienen un rendimiento mucho mayor que los bind mount de hosts Mac y Windows.
Además, los volúmenes son a menudo una mejor opción que persistir los datos en una capa que se puede modificar del contenedor porque un volumen no aumenta el tamaño de los contenedores mientras se utiliza. Además, el contenido del volumen existe fuera del ciclo de vida de un contenedor determinado.
.png)
Podemos mencionar los volúmenes en la sección de servicios del archivo docker-compose.
#specify docker-compose versionversion:'3.6'#services/container detailsservices:#Name of the container iris:#Base Image image:intersystemsdc/iris-community
#set restart option restart:always#port mapping ports: -55036:1972 -55037:52773 -53773:53773#create a volume volumes: -./:/irisdev/appHemos creado el volumen irisdev/app.
Resumen
Docker es una potente herramienta que permite a los desarrolladores y equipos de IT crear, implementar y ejecutar aplicaciones en un entorno contenedorizado. Al proporcionar portabilidad, consistencia, escalabilidad, eficiencia de recursos y seguridad, Docker facilita la implementación de aplicaciones en diferentes entornos e infraestructuras. Con la creciente popularidad de la contenerización, Docker se está convirtiendo en una herramienta esencial para el desarrollo e implementación de software moderno.
En este artículo, aprendimos a utilizar Docker compose (un archivo YAML que especifica las opciones de configuración para cada contenedor de la aplicación), Docker file (empleado para montar una imagen Docker) y Docker volume (un mecanismo de almacenamiento de datos persistente que funciona para compartir datos entre los contenedores Docker y el host.)
Comments
¿Cuál es la diferencia clave entre un Dockerfile y un archivo Docker Compose en el contexto de Docker?
Dockerfile te describe cómo se construir las imágenes de Docker mientras que docker compose se usar para ejecutar los contenedores de Docker.