Docker Compose
What is Docker Compose?
Docker Compose is a tool for defining and managing multi-container applications. It allows you to describe the services, networks, and volumes required for a complete application stack in a simple YAML file.
Docker Compose Commands
To manage your application with Docker Compose, you can use the following commands:
-
docker-compose up: Creates and starts the containers defined in the Docker Compose file. It also builds images if necessary. -
docker-compose down: Stops and removes the containers defined in the Docker Compose file. -
docker-compose start: Starts the containers defined in the Docker Compose file. -
docker-compose stop: Stops the containers defined in the Docker Compose file. -
docker-compose restart: Restarts the containers defined in the Docker Compose file.
Volumes and Networks in Docker Compose
When working with Docker Compose, you can define volumes and networks to manage data persistence and communication between containers:
Volumes
Volumes in Docker Compose allow you to persist and share data between containers and the host machine. By using volumes, you can separate your data from the container’s lifecycle, making it easier to update or replace containers without losing important data. Volumes can be used for databases, file uploads, or any other data that needs to persist across container restarts.
To define a volume in Docker Compose, you can use the volumes key under a service. Here’s an example:
services:
db:
image: mysql
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
In this example, a volume named db_data is created, and it is mounted to the /var/lib/mysql directory inside the db service container.
Networks
Networks in Docker Compose enable communication between containers within the same application stack. By default, Docker Compose creates a default network for your application, allowing services to communicate with each other using their service names as hostnames. This makes it easy to establish connections between containers without exposing unnecessary ports to the host machine.
To define a network in Docker Compose, you can use the networks key under a service. Here’s an example:
services:
web:
image: nginx
networks:
- frontend
api:
image: myapi
networks:
- frontend
- backend
networks:
frontend:
backend:
In this example, two networks are defined: frontend and backend. The web service is connected to the frontend network, while the api service is connected to both the frontend and backend networks.
How to Use Docker Compose
To use Docker Compose, follow these steps:
-
Define your application’s services, networks, and volumes in a Docker Compose YAML file.
-
Save the YAML file with a
.ymlor.yamlextension (e.g.,docker-compose.yml). -
Open a terminal or command prompt and navigate to the directory where the Docker Compose file is located.
-
Run the desired Docker Compose command, such as
docker-compose up, to start your application. -
Monitor the logs to ensure everything is running correctly.
-
When you’re done, use
Ctrl + Cto stop the Docker Compose command, or rundocker-compose downto stop and remove the containers.
Docker Compose simplifies the process of running multi-container applications and enables easy management of complex application stacks.
Example
To get you started, let’s consider running a multi-container application using a docker-compose.yml file. Here are the steps:
To start:
-
Ensure Docker Compose is installed on your machine. If not, follow the official Docker Compose installation guide for your operating system.
-
Create a directory for your application and navigate to it using the command line:
mkdir my-app
cd my-app
Next:
-
Create a
docker-compose.ymlfile in the project directory (my-app) using a text editor:version: '3' services: web: image: nginx:latest ports: - 8080:80 volumes: - ./html:/usr/share/nginx/html db: image: mysql:latest environment: - MYSQL_ROOT_PASSWORD=secretpassword - MYSQL_DATABASE=mydatabase - MYSQL_USER=myuser - MYSQL_PASSWORD=mypasswordIn this example, we define two services: web and db. The web service uses the official nginx image, maps port 8080 on the host to port 80 in the container, and mounts the html directory from the host to the /usr/share/nginx/html directory inside the container. The db service uses the official mysql image and sets environment variables for the root password, database, user, and password.
-
Create an
htmldirectory in the project directory (my-app) and place your HTML files inside it. -
Open a terminal or command prompt, navigate to the project directory (
my-app), and run the following command to start the application:docker-compose up -dThis command starts the services defined in the docker-compose.yml file in detached mode (-d), creating and running the containers.
-
Open a web browser and navigate to
http://localhost:8080to access your web applicatio
In this example, we demonstrate a basic use case where we use Docker Compose to define and run a multi-container application. The docker-compose.yml file specifies two services: web and db. The web service uses the official nginx image, mounts the html directory from the host, and exposes port 8080. The db service uses the official mysql image and sets environment variables. Running docker-compose up -d starts the application, and you can access the web application by navigating to http://localhost:8080 in a web browser.
That’s it! You’ve successfully run a multi-container application using Docker Compose.
Additional Information
If you would like any additionalk information, please refer to this documentation.