3v-Hosting Blog
Docker-Compose Basics
7 min read
Introduction to Docker-Compose
Docker-Compose is a powerful tool that allows developers and system administrators to define and manage multi-container Docker applications.It simplifies the deployment of complex environments by using a declarative YAML file to specify services, networks, and volumes.Rather than running multiple docker run commands with intricate configurations, Docker-Compose provides a streamlined approach to orchestrating containers efficiently.
Maintaining and deploying applications across different environments is made easier by using a single configuration file (docker-compose.yml), making it a crucial component in modern DevOps workflows.
Key Features of Docker-Compose
Docker-Compose offers a range of features that make it an essential tool for containerized applications:
Multi-Container Management: Allows defining and running multiple interdependent containers in a single configuration file.
Service-Oriented Architecture: Enables a microservices-based approach, where each service runs in its own isolated container.
Networking: Automatically creates and manages networks between defined services, simplifying communication.
Volume Management: Defines persistent storage for databases and stateful applications.
Environment Variables Support: Helps manage different configurations for development, testing, and production environments.
Scalability: Facilitates horizontal scaling of services when necessary.
Logging and Debugging: Provides structured logs and debugging tools for better observability.
Installing Docker-Compose
Before using Docker-Compose, ensure that Docker is installed on your system. Docker-Compose is included in Docker Desktop, but for standalone installations, follow these steps:
Installing on Linux
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Verify the installation:
docker-compose --version
Installing on Windows and macOS
For Windows and macOS users, Docker-Compose is included in Docker Desktop. Simply download and install Docker Desktop from the official Docker website.
Writing a Basic docker-compose.yml File
A docker-compose.yml file defines the services, networks, and volumes for a multi-container application. Below is an example of a basic configuration for a web application using Nginx and a PostgreSQL database:
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
db:
image: postgres:latest
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: app_db
volumes:
- pg_data:/var/lib/postgresql/data
volumes:
pg_data:
Running and Managing Services with Docker-Compose
Starting the Services
Once the docker-compose.yml file is set up, launch the application with:
docker-compose up -d
The -d flag runs the services in detached mode (background execution).
Viewing Running Services
Check the status of running services with:
docker-compose ps
Viewing Logs
Monitor service logs using:
docker-compose logs -f
Stopping Services
To stop the services, run:
docker-compose down
This command stops and removes all containers, networks, and volumes defined in the docker-compose.yml file.
Other useful articles in our Blog:
- How To Install and Use Docker on Ubuntu 22.04
- How to Create Your Own Docker Image
- How To Remove Docker Images, Containers, and Volumes
- What is the VPS or VDS
Defining Networks and Volumes
Custom Network Configuration
Docker-Compose allows defining custom networks to isolate services:
networks:
frontend:
backend:
services:
app:
image: myapp:latest
networks:
- frontend
- backend
db:
image: mysql:latest
networks:
- backend
Persistent Data Storage with Volumes
Volumes ensure data persistence when containers are restarted:
volumes:
mysql_data:
services:
database:
image: mysql:latest
volumes:
- mysql_data:/var/lib/mysql
Using Environment Variables in Docker-Compose
For better configurability, environment variables can be stored in an .env file and referenced in docker-compose.yml:
.env File:
POSTGRES_USER=admin
POSTGRES_PASSWORD=securepassword
docker-compose.yml:
services:
db:
image: postgres:latest
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
Scaling Services with Docker-Compose
Docker-Compose supports service scaling using the --scale flag:
docker-compose up --scale web=3 -d
This command starts three instances of the web service, distributing traffic among them.
Best Practices for Using Docker-Compose
Keep Services Stateless: Store persistent data in volumes rather than within containers.
Use .env Files for Configuration: Avoid hardcoding credentials in docker-compose.yml.
Leverage Named Volumes: Prevent data loss during container updates.
Define Resource Limits: Specify memory and CPU limits to prevent resource exhaustion.
Implement Health Checks: Use healthcheck to monitor service health.
Example of a health check:
services:
db:
image: mysql:latest
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 30s
retries: 3
Conclusion
Docker-Compose is the most effective way to manage multi-container applications. Its structured and declarative configuration approach is unparalleled. Whether you're developing a local application, deploying a microservices architecture, or running a production system, Docker-Compose will enhance your efficiency by streamlining service deployment, networking, and data persistence.
If you're a DevOps engineer, developer or system administrator looking to optimise your containerised environments, then you need to understand the basics of Docker-Compose. Follow best practices and leverage its powerful features to create scalable, maintainable and robust container-based applications.