Docker Compose
Docker Compose is a tool used for defining and running multi-container Docker applications. With Compose, you can define a multi-container application in a single YAML file, and then spin up all the services with a single command.
This guide explains the basics of Docker Compose, its key components, and how to use it effectively.
Table of Contents
- What is Docker Compose?
- Installing Docker Compose
- Docker Compose File Structure
- Creating a Docker Compose File
- Starting the Application with Docker Compose
- Managing Docker Compose Projects
- Common Docker Compose Commands
- Docker Compose Networks
- Best Practices for Docker Compose
What is Docker Compose?
Docker Compose allows you to define and manage multi-container Docker applications using a docker-compose.yml file. Each service within the file is defined as a separate container with its own configuration, and Compose ensures all services can communicate with each other.
Benefits of Docker Compose
- Multi-container management: Easily define and manage complex multi-container applications.
- Automation: Automates container creation, starting, and stopping, making deployment easier.
- Consistency: Define your entire application environment in one file for consistent deployments.
- Networking: Compose automatically handles the networking between containers.
Installing Docker Compose
Before using Docker Compose, you need to install it. You can install Docker Compose on Linux, Mac, and Windows. Here are the installation steps for Docker Compose:
On Linux
# Download the latest version of Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/$(curl -s https://api.github.com/repos/docker/compose/releases/latest | jq -r .tag_name)/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# Apply executable permissions
sudo chmod +x /usr/local/bin/docker-compose
On Windows & Mac
You can download Docker Compose along with Docker Desktop from the official Docker website.
Docker Compose File Structure
The Docker Compose file is written in YAML format and typically named docker-compose.yml. Below are the key sections of the docker-compose.yml file:
- version: Specifies the version of the Compose file format.
- services: Defines the containers in the application.
- volumes: Used for defining persistent data storage.
- networks: Defines custom networks for your services.
- configs: Defines configuration data for services.
Example Structure
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "8080:80"
db:
image: postgres:latest
environment:
POSTGRES_PASSWORD: example
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
Creating a Docker Compose File
To create a Docker Compose file, follow these steps:
- Create a
docker-compose.ymlfile in your project directory. - Define your services (containers) under the
servicessection. - Specify any configuration, environment variables, volumes, and networks.
Example: Simple Web and Database Setup
Here is an example of a basic docker-compose.yml file with a web server and a database:
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "8080:80"
networks:
- mynetwork
db:
image: postgres:latest
environment:
POSTGRES_PASSWORD: password
volumes:
- db-data:/var/lib/postgresql/data
networks:
- mynetwork
networks:
mynetwork:
volumes:
db-data:
In this example:
- The
webservice uses thenginximage and maps port 8080 on the host to port 80 inside the container. - The
dbservice uses thepostgresimage and sets an environment variable for the database password. - Both services are connected to the same custom network (
mynetwork), allowing them to communicate.
Starting the Application with Docker Compose
Once the docker-compose.yml file is defined, you can use the following command to start the application:
docker-compose up
- This command will build and start all the services defined in the
docker-compose.ymlfile. - To run it in the background (detached mode), use the
-dflag:
docker-compose up -d
To stop the application and remove containers, use:
docker-compose down
This command stops all the services and removes the containers, networks, and volumes defined in the docker-compose.yml file.
Managing Docker Compose Projects
Docker Compose provides several commands to manage the lifecycle of a project:
-
Start services:
docker-compose up -
Stop services:
docker-compose down -
View logs:
docker-compose logs -
List services:
docker-compose ps
Common Docker Compose Commands
Here are some of the most commonly used Docker Compose commands:
| Command | Description |
|---|---|
docker-compose up | Builds and starts containers in the background (detached mode). |
docker-compose down | Stops and removes containers, networks, and volumes. |
docker-compose build | Builds or rebuilds the services defined in the Compose file. |
docker-compose logs | Fetches logs for the services. |
docker-compose ps | Lists containers that are part of the Compose project. |
docker-compose exec <service> <command> | Executes a command inside a running service container. |
Docker Compose Networks
Docker Compose automatically creates a default network for the services to communicate. However, you can define custom networks in the docker-compose.yml file for more control over how services communicate.
Example of Custom Networks:
version: "3.8"
services:
web:
image: nginx:latest
networks:
- frontend
db:
image: postgres:latest
networks:
- backend
networks:
frontend:
backend:
In this example:
- The
webservice connects to thefrontendnetwork. - The
dbservice connects to thebackendnetwork. - The services cannot communicate with each other unless explicitly connected to the same network.
Best Practices for Docker Compose
- Use
.envFiles: Store environment variables in.envfiles for better manageability and portability. - Version Control: Always keep the
docker-compose.ymlfile under version control (e.g., Git) to track changes. - Minimal Service Definitions: Define only essential configurations in the
docker-compose.ymlfile to keep it simple and readable. - Use Networks for Isolation: Create custom networks to isolate services and control communication between them.
Conclusion
Docker Compose is a powerful tool for defining and running multi-container Docker applications. With Compose, you can easily manage complex applications, define services, and control their interaction. It is especially useful for local development, testing, and deploying multi-service applications.
For more details, check out the official Docker Compose documentation.