¿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.4en 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.ymlen 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 27version: '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 -dEsto construirá y ejecutará el
dbywordpresscontenedores Al igual que cuando se ejecuta un solo contenedor condocker run, el-dbandera 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/wordpressen un navegador web para ver su aplicación de WordPress recién instalada. También puede usardocker pspara explorar más a fondo la configuración resultante:docker psDetener y retirar los contenedores:
docker-compose downCompose File Syntax
Un
docker-compose.ymlEl 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
servicessecció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, dbes 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:containerenlaces 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.ymlarriba usa elenvironmentdirectiva 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.envseparado archivo (que no se registra en el control de versiones ni se hace público) y se accede desde dentro dedocker-compose.ymlusando elenv_filedirectiva.Crear una aplicación desde cero
Crea un
docker-compose.ymlarchive 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.ymlen un editor de texto y agregue el siguiente contenido:- Archivo:docker -compose.yml
1 2 3 4 5 6 7 8version: '3' services: distro: image: alpine restart: always container_name: Alpine_Distro entrypoint: tail -f /dev/nullCada entrada en los
servicesLa sección creará un contenedor separado cuandodocker-composese ejecuta En este punto, la sección contiene un único contenedor basado en la distribución oficial de Alpine:- El
restartLa directiva se usa para indicar que el contenedor siempre debe reiniciarse (después de un bloqueo o reinicio del sistema, por ejemplo). - El
container_nameLa 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 -fes un proceso continuo, por lo que se ejecutará indefinidamente y evitará que el contenedor se detenga. Elentrypointpredeterminado se anula para mantener el contenedor en funcionamiento.
Muestra tu contenedor:
docker-compose up -dConsulta el estado de tu contenedor:
docker psLa 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_DistroBajar el contenedor:
docker-compose downAgregar 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.ymly agregue ladatabaseservicio a continuación:- Archivo:docker -compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16version: '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:/tmpyports:-"5432:5432", la primera directiva mapea el contenedor/dumpscarpeta a nuestro/tmplocal carpeta. La segunda directiva asigna los puertos de los contenedores a los puertos del host local.Compruebe los contenedores en ejecución:
docker psEste 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_DistroBaje ambos contenedores:
docker-compose downAgregar 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 29version: '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 - distroEste
docker-composeEl archivo contiene algunas directivas nuevas:environment y enlaces . La primera directiva establece opciones de nivel de tiempo de ejecución dentro del contenedor.linkscrea 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 adbde lawebcontenedor llegará a ladatabaseServicio. Si bien no necesita loslinksdirectiva para que los contenedores hablen entre sí,linkspuede 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 psLa 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_dbPruebe nginx navegando a la dirección IP pública de su Linode, puerto
8080en 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 upy 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
volumessección adocker-compose.ymly edite ladatabaseservicio 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 32version: '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: trueexternal: truele dice a Docker Compose que use un volumen de datos externo preexistente. Si no hay un volumen llamadodataestá presente, al iniciar la aplicación se producirá un error. Crea el volumen:docker volume create --name=dataInicie la aplicación como antes:
docker-compose up -dPasos 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