¿Qué es Docker Compose?
Si su aplicación Docker incluye más de un contenedor (por ejemplo, un servidor web y una base de datos que se ejecutan en contenedores separados), crear, ejecutar y conectar los contenedores desde Dockerfiles separados es engorroso y requiere mucho tiempo. Docker Compose resuelve este problema al permitirle usar un archivo YAML para definir aplicaciones de varios contenedores. Puede configurar tantos contenedores como desee, cómo deben construirse y conectarse, y dónde deben almacenarse los datos. Cuando el archivo YAML esté completo, puede ejecutar un solo comando para compilar, ejecutar y configurar todos los contenedores.
Esta guía explicará cómo docker-compose.yml
está organizado y muestra cómo usarlo para crear varias configuraciones básicas de aplicaciones.
Nota Por lo general, todos los contenedores de una aplicación creada con Docker Compose se ejecutarán en el mismo host. La gestión de contenedores que se ejecutan en diferentes hosts suele requerir una herramienta adicional, como Docker Swarm o Kubernetes.
Antes de comenzar
Instalar Docker CE
Necesitará un Linode con Docker CE instalado para seguir los pasos de esta guía.
Para instalar Docker CE (Community Edition), siga las instrucciones de una de las siguientes guías:
-
Instalación y uso de Docker en Ubuntu y Debian
-
Instalación y uso de Docker en CentOS y Fedora
Para obtener instrucciones completas sobre aún más distribuciones de Linux, consulte la sección Instalar el motor Docker de la documentación oficial de Docker.
Instalar Docker Compose
-
Descarga la última versión de Docker Compose. Consulte la página de lanzamientos y reemplace
1.25.4
en el siguiente comando con la versión etiquetada como Última versión :sudo curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
-
Establecer permisos de archivo:
sudo chmod +x /usr/local/bin/docker-compose
Uso básico
Esta sección revisará un archivo Docker Compose de ejemplo tomado de la documentación oficial de Docker.
-
Abra
docker-compose.yml
en un editor de texto y agregue el siguiente contenido:- Archivo:docker -compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
version: '3' services: db: image: mysql:5.7 volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wordpress:latest ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress volumes: db_data:
Guarde el archivo y ejecute Docker Compose desde el mismo directorio:
docker-compose up -d
Esto construirá y ejecutará el
db
ywordpress
contenedores Al igual que cuando se ejecuta un solo contenedor condocker run
, el-d
bandera inicia los contenedores en modo separado.Ahora tiene un contenedor de WordPress y un contenedor de MySQL ejecutándose en su host. Navegue a
192.0.8.1:8000/wordpress
en un navegador web para ver su aplicación de WordPress recién instalada. También puede usardocker ps
para explorar más a fondo la configuración resultante:docker ps
Detener y retirar los contenedores:
docker-compose down
Compose File Syntax
Un
docker-compose.yml
El archivo está organizado en cuatro secciones:Directiva Usar versión Especifica la versión de sintaxis del archivo Compose. Esta guía utilizará la versión 3 en todo momento. servicios En Docker, un servicio es el nombre de un "Contenedor en producción". Esta sección define los contenedores que se iniciarán como parte de la instancia de Docker Compose. redes Esta sección se utiliza para configurar la red para su aplicación. Puede cambiar la configuración de la red predeterminada, conectarse a una red externa o definir redes específicas de aplicaciones. volúmenes Monta una ruta vinculada en la máquina host que puede ser utilizada por el contenedor. La mayor parte de esta guía se centrará en configurar contenedores usando los
services
sección. Estas son algunas de las directivas comunes que se utilizan para instalar y configurar contenedores:Directiva Usar imagen Establece la imagen que se usará para construir el contenedor. El uso de esta directiva supone que la imagen especificada ya existe en el host o en Docker Hub. construir Esta directiva se puede usar en lugar de image
. Especifica la ubicación del Dockerfile que se usará para crear este contenedor.bd En el caso del archivo Dockercompose de ejemplo, db
es una variable para el contenedor que está a punto de definir.reiniciar Le dice al contenedor que se reinicie si el sistema se reinicia. volúmenes Monta una ruta vinculada en la máquina host que puede ser utilizada por el contenedor medio ambiente Defina las variables de entorno que se pasarán al comando de ejecución de Docker. depende_de Establece un servicio como una dependencia para el contenedor actual definido por bloques puerto Asigna un puerto del contenedor al host de la siguiente manera: host:container
enlaces Enlace este servicio a cualquier otro servicio en el archivo Docker Compose especificando sus nombres aquí. Muchas otras directivas de configuración están disponibles. Consulte la referencia Compose File para obtener más detalles.
Precaución El ejemplo
docker-compose.yml
arriba usa elenvironment
directiva para almacenar las contraseñas de usuario de MySQL directamente en el archivo YAML para importarlas al contenedor como variables de entorno. Esto no se recomienda para información confidencial en entornos de producción. En cambio, la información confidencial se puede almacenar en un.env
separado archivo (que no se registra en el control de versiones ni se hace público) y se accede desde dentro dedocker-compose.yml
usando elenv_file
directiva.Crear una aplicación desde cero
Crea un
docker-compose.yml
archive una sección a la vez para ilustrar los pasos de la creación de una aplicación de varios contenedores.Definir un servicio simple:
-
Crea un nuevo
docker-compose.yml
en un editor de texto y agregue el siguiente contenido:- Archivo:docker -compose.yml
1 2 3 4 5 6 7 8
version: '3' services: distro: image: alpine restart: always container_name: Alpine_Distro entrypoint: tail -f /dev/null
Cada entrada en los
services
La sección creará un contenedor separado cuandodocker-compose
se ejecuta En este punto, la sección contiene un único contenedor basado en la distribución oficial de Alpine:- El
restart
La directiva se usa para indicar que el contenedor siempre debe reiniciarse (después de un bloqueo o reinicio del sistema, por ejemplo). - El
container_name
La directiva se usa para anular el nombre del contenedor generado aleatoriamente y reemplazarlo con un nombre que sea más fácil de recordar y con el que trabajar. - Los contenedores de Docker salen de forma predeterminada si no se está ejecutando ningún proceso en ellos.
tail -f
es un proceso continuo, por lo que se ejecutará indefinidamente y evitará que el contenedor se detenga. Elentrypoint
predeterminado se anula para mantener el contenedor en funcionamiento.
Muestra tu contenedor:
docker-compose up -d
Consulta el estado de tu contenedor:
docker ps
La salida debe parecerse a lo siguiente:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 967013c36a27 alpine "tail -f /dev/null" 3 seconds ago Up 2 seconds Alpine_Distro
Bajar el contenedor:
docker-compose down
Agregar servicios adicionales
Desde aquí puede comenzar a construir un ecosistema de contenedores. Puede definir cómo trabajan juntos y se comunican.
-
Vuelva a abrir
docker-compos.yml
y agregue ladatabase
servicio a continuación:- Archivo:docker -compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
version: '3' services: distro: image: alpine container_name: Alpine_Distro restart: always entrypoint: tail -f /dev/null database: image: postgres:latest container_name: postgres_db volumes: - ../dumps:/tmp/ ports: - "5432:5432"
Ahora hay dos servicios definidos:
- Distribución
- Base de datos
El servicio Distro es el mismo que antes. El servidor de base de datos contiene las instrucciones para un contenedor de postgres y las directivas:
volumes: - ../dumps:/tmp
yports:-"5432:5432"
, la primera directiva mapea el contenedor/dumps
carpeta a nuestro/tmp
local carpeta. La segunda directiva asigna los puertos de los contenedores a los puertos del host local.Compruebe los contenedores en ejecución:
docker ps
Este comando muestra el estado de los contenedores, la asignación de puertos, los nombres y el último comando que se ejecutó en ellos. Es importante tener en cuenta que el contenedor de postgres dice "docker-entrypoint…" bajo comandos. El script PostgresDocker Entrypoint es lo último que se inicia cuando se inicia el contenedor.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ecc37246f6ef postgres:latest "docker-entrypoint..." About a minute ago Up About a minute 0.0.0.0:5432->5432/tcp postgres_db 35dab3e712d6 alpine "tail -f /dev/null" About a minute ago Up About a minute Alpine_Distro
Baje ambos contenedores:
docker-compose down
Agregar un servicio nginx
-
Agregue un contenedor nginx para que su aplicación pueda servir sitios web:
- Archivo:docker -compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
version: '3' services: distro: image: alpine container_name: Alpine_Distro restart: always entrypoint: tail -f /dev/null database: image: postgres:latest container_name: postgres_db volumes: - ../dumps:/tmp/ ports: - "5432:5432" web: image: nginx:latest container_name: nginx volumes: - ./mysite.template:/etc/nginx/conf.d/mysite.template ports: - "8080:80" environment: - NGINX_HOST=example.com - NGINX_port=80 links: - database:db - distro
Este
docker-compose
El archivo contiene algunas directivas nuevas:environment y enlaces . La primera directiva establece opciones de nivel de tiempo de ejecución dentro del contenedor.links
crea una red de dependencia entre los contenedores. El contenedor nginx depende de los otros dos para ejecutarse. Además, se podrá acceder a los contenedores correspondientes en un nombre de host indicado por el alias. En este caso, haciendo ping adb
de laweb
contenedor llegará a ladatabase
Servicio. Si bien no necesita loslinks
directiva para que los contenedores hablen entre sí,links
puede servir como mecanismo de seguridad al iniciar la aplicación docker-compose.Inicie Docker Compose y compruebe el estado del contenedor:
docker-compose up -d docker ps
La salida debe ser similar a:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 55d573674e49 nginx:latest "nginx -g 'daemon ..." 3 minutes ago Up 3 minutes 0.0.0.0:8080->80/tcp nginx ad9e48b2b82a alpine "tail -f /dev/null" 3 minutes ago Up 3 minutes Alpine_Distro 736cf2f2239e postgres:latest "docker-entrypoint..." 3 minutes ago Up 3 minutes 0.0.0.0:5432->5432/tcp postgres_db
Pruebe nginx navegando a la dirección IP pública de su Linode, puerto
8080
en un navegador (por ejemplo,192.0.2.0:8080
). Debería ver la página de destino de nginx predeterminada.Almacenamiento de datos persistente
No se recomienda almacenar datos de PostgreSQL directamente dentro de un contenedor. Los contenedores Docker están destinados a ser tratados como efímeros:los contenedores de su aplicación se construyen desde cero cuando se ejecuta
docker-compose up
y destruido al ejecutardocker-compose down
. Además, cualquier falla o reinicio inesperado en su sistema hará que se pierdan los datos almacenados en un contenedor.Por estas razones, es importante configurar un volumen persistente en el host que los contenedores de la base de datos usarán para almacenar sus datos.
-
Agregue un
volumes
sección adocker-compose.yml
y edite ladatabase
servicio para referirse al volumen:- Archivo:docker -compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
version: '3' services: distro: image: alpine container_name: Alpine_Distro restart: always entrypoint: tail -f /dev/null database: image: postgres:latest container_name: postgres_db volumes: - data:/var/lib/postgresql ports: - "5432:5432" web: image: nginx:latest container_name: nginx volumes: - ./mysite.template:/etc/nginx/conf.d/mysite.template ports: - "8080:80" environment: - NGINX_HOST=example.com - NGINX_port=80 links: - database:db - distro volumes: data: external: true
external: true
le dice a Docker Compose que use un volumen de datos externo preexistente. Si no hay un volumen llamadodata
está presente, al iniciar la aplicación se producirá un error. Crea el volumen:docker volume create --name=data
Inicie la aplicación como antes:
docker-compose up -d
Pasos siguientes
Docker Compose es una poderosa herramienta para orquestar conjuntos de contenedores que pueden funcionar juntos. Cosas como una aplicación o un entorno de desarrollo pueden utilizar Docker-compose. El resultado es un entorno modular y configurable que se puede implementar en cualquier lugar.
Docker ¿Qué es Docker Compose y cómo se usa?
Cómo usar las políticas de reinicio de Docker para mantener los contenedores en funcionamiento
Cómo instalar Docker Compose en Ubuntu
Cómo ejecutar contenedores Docker
Cómo eliminar contenedores Docker
Cómo detener los contenedores de Docker
- El