GNU/Linux >> Tutoriales Linux >  >> Panels >> Docker

Cómo usar Docker Compose

¿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

  1. 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
    
  2. 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.

  1. Abra docker-compose.yml en un editor de texto y agregue el siguiente contenido:

    Archivo:docker -compose.yml
  2. Guarde el archivo y ejecute Docker Compose desde el mismo directorio:

    docker-compose up -d
    

    Esto construirá y ejecutará el db y wordpress contenedores Al igual que cuando se ejecuta un solo contenedor con docker run , el -d bandera inicia los contenedores en modo separado.

  3. 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 usar docker ps para explorar más a fondo la configuración resultante:

    docker ps
    
  4. Detener y retirar los contenedores:

    docker-compose down
    
  5. Compose File Syntax

    Un docker-compose.yml El archivo está organizado en cuatro secciones:

     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:

    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
    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.

    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 el environment 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 de docker-compose.yml usando el env_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:

    1. Crea un nuevo docker-compose.yml en un editor de texto y agregue el siguiente contenido:

      Archivo:docker -compose.yml
    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í.

    Cada entrada en los services La sección creará un contenedor separado cuando docker-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. El entrypoint predeterminado se anula para mantener el contenedor en funcionamiento.
  6. Muestra tu contenedor:

    docker-compose up -d
    
  7. 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
  8. Bajar el contenedor:

     docker-compose down
    
  9. Agregar servicios adicionales

    Desde aquí puede comenzar a construir un ecosistema de contenedores. Puede definir cómo trabajan juntos y se comunican.

    1. Vuelva a abrir docker-compos.yml y agregue la database servicio a continuación:

      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

    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 y ports:-"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.

  10. 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
  11. Baje ambos contenedores:

     docker-compose down
    
  12. Agregar un servicio nginx

    1. 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
    
    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"

    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 a db de la web contenedor llegará a la database Servicio. Si bien no necesita los links directiva para que los contenedores hablen entre sí, links puede servir como mecanismo de seguridad al iniciar la aplicación docker-compose.

  13. 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
  14. 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.

  15. 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 ejecutar docker-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.

    1. Agregue un volumes sección a docker-compose.yml y edite la database 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
    
    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
  16. external: true le dice a Docker Compose que use un volumen de datos externo preexistente. Si no hay un volumen llamado data está presente, al iniciar la aplicación se producirá un error. Crea el volumen:

    docker volume create --name=data
    
  17. Inicie la aplicación como antes:

    docker-compose up -d
    
  18. 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
    1. Cómo usar imágenes, contenedores y archivos Docker en profundidad

    2. Cómo conectar contenedores Docker

    3. Cómo usar los perfiles de servicio para simplificar las pilas en Docker Compose

    4. Cómo utilizar el comando de inspección de Docker

    5. Cómo listar contenedores 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

       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