Docker es una excelente herramienta para automatizar la implementación de aplicaciones de Linux dentro de contenedores de software, pero para aprovechar plenamente su potencial cada componente de una aplicación debería ejecutarse en su propio contenedor individual. En el caso de aplicaciones complejas con muchos componentes, la estrategia de organizar todos los contenedores para que se inicien, se comuniquen y se desconecten juntos puede volverse poco productiva en poco tiempo.
La comunidad de Docker propuso una solución popular llamada Fig, que permitió el uso de un archivo YAML único para organizar la totalidad de sus contenedores y configuraciones de Docker. La popularidad de esto fue tal que el equipo de Docker decidió crear Docker Compose en base a la fuente de Fig, que ahora es obsoleta. Docker Compose permite que los usuarios organicen de forma más sencilla los procesos de los contenedores de Docker, incluidos los de inicio, cierre y configuración de enlaces y volúmenes dentro de los contenedores.
En este tutorial, le mostraremos la forma de instalar la versión más reciente de Docker Compose para ayudarlo a administrar aplicaciones en varios contenedores.
Para seguir los pasos de este artículo, necesitará un servidor Ubuntu 18.04. con lo siguiente:
Una vez implementado esto, estará listo para seguir adelante.
Nota: Aunque en los requisitos previos se brindan instrucciones para instalar Docker en Ubuntu 18.04, los comandos de docker
de este artículo deben funcionar en otros sistemas operativos mientras Docker esté instalado.
Si bien se puede instalar Docker Compose desde los repositorios oficiales de Ubuntu, la versión está considerablemente atrasada respecto de la más reciente. Por lo tanto, instalaremos Docker Compose desde el repositorio de GitHub. El comando que se muestra a continuación difiere ligeramente respecto del que encontrará en la página Versiones. Al usar el indicador -o
para especificar primero el archivo de salida en lugar de redirigirla, esta sintaxis evita que se produzca un error de denegación de permiso al usar sudo
.
Revisaremos la versión actual y, si es necesario, la actualizaremos en el comando que se muestra a continuación:
- sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
Luego, configuraremos los permisos:
- sudo chmod +x /usr/local/bin/docker-compose
A continuación, comprobaremos que la instalación se haya realizado de forma correcta revisando la versión:
- docker-compose --version
Con esto se imprimirá la versión que instalamos:
Outputdocker-compose version 1.21.2, build a133471
Ahora que instalamos Docker Compose, estamos listos para ejecutar un ejemplo “Hello World”.
En Docker Hub, el registro público de Docker, se incluye una imagen de Hello World para demostración y pruebas. En ella se muestra la configuración mínima requerida para ejecutar un contenedor usando Docker Compose; un archivo YAML que llama a una única imagen:
Primero, crearemos un directorio para el archivo YAML y nos ubicaremos en él:
- mkdir hello-world
- cd hello-world
Luego, crearemos el archivo YAML:
- nano docker-compose.yml
Introduzca el siguiente contenido en el archivo, guárdelo y cierre el editor de texto:
my-test:
image: hello-world
La primera línea del archivo YAML se utiliza como parte del nombre del contenedor. En la segunda línea se especifica la imagen que se debe usar para crear el contenedor. Cuando ejecutamos el comando docker-compose
se buscará una imagen local con el nombre que precisamos: hello-world
. Una vez implementado esto, guardaremos el archivo y lo cerraremos.
Podemos ver de forma manual imágenes de nuestro sistema con el comando docker images
:
- docker images
Cuando no hay imágenes locales, solo se muestran los encabezados de columnas:
OutputREPOSITORY TAG IMAGE ID CREATED SIZE
Ahora, aunque aún nos encontremos en el directorio ~/hello-world
, ejecutaremos el siguiente comando:
- docker-compose up
La primera vez que ejecutemos el comando, si no aparece una imagen local con el nombre hello-world
Docker Compose la extraerá del repositorio público de Docker Hub:
OutputPulling my-test (hello-world:latest)...
latest: Pulling from library/hello-world
c04b14da8d14: Downloading [==================================================>] c04b14da8d14: Extracting [==================================================>] c04b14da8d14: Extracting [==================================================>] c04b14da8d14: Pull complete
Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
Status: Downloaded newer image for hello-world:latest
. . .
Tras extraer la imagen, docker-compose
crea un contenedor, adjunta y ejecuta el programa hello, lo que a su vez confirma que la instalación parece funcionar:
Output. . .
Creating helloworld_my-test_1...
Attaching to helloworld_my-test_1
my-test_1 |
my-test_1 | Hello from Docker.
my-test_1 | This message shows that your installation appears to be working correctly.
my-test_1 |
. . .
Luego imprime una explicación de lo que hizo:
Output of docker-compose up1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.
Los contenedores de Docker solo se ejecutan mientras el comando está activo, de modo que cuando hello
termina de ejecutarse, el contenedor se detiene. Por consiguiente, cuando examinamos procesos activos los encabezados de columna aparecerán, pero el contenedor de hello-world
no figurará por no estar en ejecución.
- docker ps
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Podemos ver la información del contenedor, la cual necesitaremos en el siguiente paso, usando el indicador -a
que muestra todos los contenedores, no solo los activos:
- docker ps -a
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
06069fd5ca23 hello-world "/hello" 35 minutes ago Exited (0) 35 minutes ago drunk_payne
Esto muestra la información que deberemos eliminar del contenedor cuando terminemos con él.
Para evitar ocupar espacio innecesario en el disco, eliminaremos la imagen local. Para hacerlo, tendremos que eliminar todos los contenedores que hagan referencia a la imagen usando el comando
docker rm, seguido del ID DEL CONTENEDOR o del NOMBRE. A continuación, usaremos el ID del CONTENEDOR del comando docker ps -a
que acabamos de ejecutar. Asegúrese de sustituir el ID de su contenedor:
- docker rm 06069fd5ca23
Una vez eliminados todos los contenedores que hagan referencia a la imagen, podemos eliminar la imagen:
- docker rmi hello-world
De esta manera, instalamos Docker Compose, probamos nuestra instalación ejecutando un ejemplo de Hello World y eliminamos la imagen de prueba y el contenedor.
Aunque el ejemplo de Hello World confirmó nuestra instalación, la configuración sencilla no muestra uno de los principales beneficios de Docker Compose: crear y eliminar un grupo de contenedores de Docker al mismo tiempo. Para ver el poder de Docker Compose en acción, tal vez desee revisar el ejemplo práctico Cómo configurar un entorno de integración continua de prueba con Docker y Docker Compose en Ubuntu 16.04 (nota: este artículo es para Ubuntu 16.04 y no responde a la versión 18.04).
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Sign up for Infrastructure as a Newsletter.
Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.
Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.