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.
Docker Compose
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
- Situado no directorio raíz do proxecto, crea un ficheiro co nome docker-compose.yml
- 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"
- 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" |
- Nos seguintes pasos, imos converter as liñas do comando anterior en declaracións dentro do ficheiro docker-compose.yml.
- 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 - 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 - 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 - 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 |
- 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 - 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: todosvolumes:
todo-mysql-data: - 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: todosmysql:
image: mysql:5.7
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todosvolumes:
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.
- Comproba que non existan outros contedores en execución a través do comando docker ps
- Executa o seguinte comando para iniciar todos os contedores declarados no ficheiro docker-compose.yml
$ docker compose up -d - Observa que na execución do comando anterior foron creados os volumes necesarios, así como a rede que vai conectar os contedores entre si.
- 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.
Actividade extra
$ git clone https://github.com/collabnix/dockerlabs $ cd dockerlabs/intermediate/workshop/DockerCompose/ $ cd wordpress |
Licenciado baixo a Licenza Creative Commons Atribución Compartir igual 4.0