94 lines
2.2 KiB
Markdown
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)
|