Saltar navegación

Docker Compose

Docker Compose é unha ferramenta que nos vai axudar a definir e compartir aplicacións que están formadas por varios contedores. Só precisamos dun ficheiro YAML coas definicións dos contedores que van formar parte da nosa aplicación, e así poder iniciala ou parala cun só comando.

Instalar Docker Compose

Se fixemos unha instalación anterior de Docker Desktop, xa se inclúe Docker Compose polo que non precisamos realizar ninguha instalación adicional. E se fixemos a instalación de Docker Engine seguindo os pasos indicados na documentación, xa se inclúe o paquete docker-compose-plugin.

De todas formas, na documentación de instalación de Docker Compose xa nos advirte que a versión que debemos usar é a V2, xa que a V1 non recibe actualizacións dende o verán de 2023.

Para comprobar a versión que temos instalada no noso equipo, executamos o seguinte comando:

$ docker compose version
Docker Compose version v2.23.0

Advertencia

Revisa con atención a documentación que atoparás en diferentes proxectos, xa que poden facer referencia ao comando docker-compose. Isto significa que executarás a versión V1 de Docker Compose. Nese caso, ten a precaución de substituír ese comando por docker compose (sen o guión no medio)

Crear o ficheiro Compose

  1. Situado no directorio raíz do proxecto, crea un ficheiro co nome docker-compose.yml
  2. Dende a versión V2 non é necesario indicar a versión do ficheiro, polo que omitimos a liña que viñamos usando ata o momento (por exemplo): version "3.7"
  3. A continuación, comezamos coa definición dos servizos (contedores) que forman parte da nosa aplicación

Declarar o servizo App

En pasos anteriores, fixemos uso do seguinte comando para iniciar o contedor da nosa aplicación:

docker run -dp 3000:3000 \
-w /app -v $PWD:/app \
--network todo-app \
-e MYSQL_HOST=mysql \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=secret \
-e MYSQL_DB=todos \
node:10-alpine \
sh -c "yarn install && yarn run dev"
  1. Nos seguintes pasos, imos converter as liñas do comando anterior en declaracións dentro do ficheiro docker-compose.yml.
  2. Comezamos pola declaración do servizo e a imaxe empregada polo contedor. Podemos definir un nome personalizado para o servizo, o cal xa se vai converter de xeito automático nun alias de rede. Algo que será moi útil cando declaremos o contedor coa base de datos MySQL.
    services:
      app:
        image: node:10-alpine
  3. Aínda que a orde das liñas non é estricta, hai unha certa costume en indicar a imaxe a empregar xusto debaixo do nome do servizo. Continuamos co comando que se vai executar á hora de iniciar o contedor coa aplicación, así como o mapeo de portos de rede
    services:
      app:
        image: node:10-alpine
        command: sh -c "yarn install && yarn run dev"
        ports:
          - 3000:3000
  4. Seguimos co directorio de traballo e o mapeo do volume
    services:
      app:
        image: node:10-alpine
        command: sh -c "yarn install && yarn run dev"
        ports:
          - 3000:3000
        working_dir: /app
        volumes:
          - ./:/app
  5. E para finalizar, imos engadir as variables de entorno necesarias para configurar a conexión coa base de datos
    services:
      app:
        image: node:10-alpine
        command: sh -c "yarn install && yarn run dev"
        ports:
          - 3000:3000
        working_dir: /app
        volumes:
          - ./:/app
        environment:
          MYSQL_HOST: mysql
          MYSQL_USER: root
          MYSQL_PASSWORD: secret
          MYSQL_DB: todos

Declarar o servizo MySQL

Agora, seguimos coa definición dos parámetros do contedor que vai almacenar a base de datos MySQL. Facendo uso do comando que empregamos en seccións anteriores.

docker run -d \
  --network todo-app --network-alias mysql \
  -v todo-mysql-data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=secret \
  -e MYSQL_DATABASE=todos \
  mysql:5.7
  1. Comezamos coa declaración do novo servizo, que imos chamar mysql, indicando a imaxe que imos empregar neste caso
    services:
      app:
        # The app service definition
      mysql:
        image: mysql:5.7
  2. Seguimos coa definición do mapeo do volume. Neste caso, é preciso declarar previamente os volumes que se van empregar nos diferentes servizos do ficheiro Compose. Esta declaración debe ir nun nivel superior e só indicamos o nome do volume (ou volumes).

    services:
      app:
        # The app service definition
      mysql:
        image: mysql:5.7
        volumes:
          - todo-mysql-data:/var/lib/mysql
        environment:
          MYSQL_ROOT_PASSWORD: secret
          MYSQL_DATABASE: todos

    volumes:
      todo-mysql-data:

  3. Unha vez rematado, o aspecto do ficheiro docker-compose.yml será algo parecido ao seguinte:

    services:
      app:
        image: node:10-alpine
        command: sh -c "yarn install && yarn run dev"
        ports:
          - 3000:3000
        working_dir: /app
        volumes:
          - ./:/app
        environment:
          MYSQL_HOST: mysql
          MYSQL_USER: root
          MYSQL_PASSWORD: secret
          MYSQL_DB: todos

      mysql:
        image: mysql:5.7
        volumes:
          - todo-mysql-data:/var/lib/mysql
        environment:
          MYSQL_ROOT_PASSWORD: secret
          MYSQL_DATABASE: todos

    volumes:
      todo-mysql-data:

Executar a aplicación

Unha vez definido o ficheiro docker-compose.yml xa podemos arrancar a nosa aplicación cun só comando.

  1. Comproba que non existan outros contedores en execución a través do comando docker ps
  2. Executa o seguinte comando para iniciar todos os contedores declarados no ficheiro docker-compose.yml
    $ docker compose up -d
  3. Observa que na execución do comando anterior foron creados os volumes necesarios, así como a rede que vai conectar os contedores entre si.
  4. Podes examinar a información de rexistro (log) co seguinte comando
    $ docker compose logs -f

Destruír a aplicación

Cando rematemos o noso traballo, tan só temos que executar o comando docker compose down para deter e eliminar os contedores da nosa aplicación.

Por defecto, os volumes non se destrúen. Se queremos desfacernos tamén deles, debemos incluír a opción --volumes no comando anterior.

Feito con eXeLearning (Nova xanela)