eolas/neuron/4b848157-992a-4aaf-9f84-ac12ec2edc55/Docker_Compose.md
2024-10-19 12:00:05 +01:00

94 lines
2.2 KiB
Markdown

---
tags: [docker]
---
# Docker Compose
- Docker Compose (DC) is a tool for defining and running multi-container
applications. A typical example would be combining a FE with a BE
implementation and database as three related but distinct containers.
- DC is a prime example of _infrastructure as code_.
- A YAML file defines all the required configuration and **all services can be
started with a single command**.
- It provides a consistent configuration accross environments: development,
test, production
## Composition
Three step process:
1. Define your application image in a Dockerfile
2. Define the services in `docker-compose.yaml` (backend services, networks,
volumes)
3. Start the entire application with `docker compose up`
### `docker-compose.yml`
- Must always begin with `version`
- Must have `services` map
- This defines the different components that comprise your application
- Services can be either an image reference (the one that generates the
container you want to include) or a build context
Look at the following example. It runs a Python Flask frontend connected to a
Redis key-value pair database for backend.
```yml
# docker-compose.yml
version: "3.9"
services:
web:
build: . # here we are using the current directory as the build context
image: myapp:1.0
ports:
- "5050:5000"
depends_on:
- redis
redis:
image: "redis:alpine"
```
`depends_on` is important - it means this container must be running first before
any others. If this is a DB, it means the data is accessible before the frontend
request start.
## Main commands
```sh
# start the composition:
docker compose up -d
# start a specific service within the composition:
docker compose up -d web
docker compose up -d redis
# view logs for a specific service
docker compose logs --follow web
# view processes by activity
docker compose top
```
## Environment variables
You can define them in the compose file or name them and leave them blank. If
you do this, Docker will look in the host environment for the variable which is
really handy:
```yml
...
services:
redis:
...
environment:
ENV1: 'some value'
ENV2:
```
## See also
[NodeJS and MySQL Docker backend](Node_and_MySQL_db.md)