DEV Community

Amanda Guan
Amanda Guan

Posted on • Updated on

Retro on "Docker Compose for Developers"

I recently studied the Docker Compose for Developers course, which provided a comprehensive exploration of advanced Docker tools. The course did a fantastic job of simplifying workflows using Docker Compose and scaling clusters with Docker Swarm. In this article, I’ll share a summary of the key concepts I learned and walk through an example exercise to demonstrate how these concepts are applied in practice.

Course Overview

Docker-Compose Explanation:

Docker Compose stood out as a powerful tool that allows you to combine and run multiple related containers with a single command. The beauty of Docker Compose lies in its ability to define all application dependencies in a single docker-compose.yml file. With a simple docker-compose up command, all services spin up effortlessly, streamlining the development process.

Working with Multiple Dockerfiles:

A significant portion of the course focused on managing multiple Dockerfiles, which is crucial for applications that involve microservices or require different environments, such as development and production. By default, Docker Compose looks for a file named Dockerfile, but it’s flexible enough to allow overrides. For instance, you can specify a different Dockerfile using the dockerfile: 'custom-name' directive within the build section of your docker-compose.yml. This capability is especially useful when organizing Dockerfiles in different directories, like placing Dockerfile-db in the db folder and adjusting the docker-compose.yml accordingly:

build:
  context: ./db
  dockerfile: Dockerfile-db
Enter fullscreen mode Exit fullscreen mode

Environment Variables with Docker-Compose:

Another important lesson from the course was the importance of avoiding hardcoding credentials in your code. Docker Compose supports environment variables, making it easier and safer to manage credentials. The course covered two primary methods of accessing environment variables:

  1. Using a .env file:
    • Store your variables in a hidden .env file, and reference them in your docker-compose.yml using ${} syntax.
    • This .env file should reside in the same directory as your docker-compose.yml to ensure it’s picked up automatically.
  2. Using env_file:
    • Alternatively, you can use the env_file keyword in your docker-compose.yml to specify the location of your .env file.
    • This method offers more flexibility as the .env file doesn’t need to be in the same directory as docker-compose.yml.

Example Exercise

To put these concepts into practice, the course included an exercise where you write a docker-compose.yml file to automate the deployment of two services: a web application and a MySQL database.

Here’s a glimpse of how this can be achieved:

docker-compose.yml:

version: '3.8'  # Specifies the version of Docker Compose

services:
  web:
    build:  # Instructions for building the web service container
      context: .  # Use the current directory as the build context
      dockerfile: Dockerfile  # Specify the Dockerfile to use for the build
    ports:
      - "5000:5000"  # Map port 5000 on the host to port 5000 on the container
    environment:  # Environment variables for the web service
      - MYSQL_HOST=db  # Hostname for the MySQL service
      - MYSQL_USER=root  # MySQL username
      - MYSQL_PASSWORD=example  # MySQL password
      - MYSQL_DB=testdb  # MySQL database name

  db:
    image: mysql:5.7  # Use the MySQL 5.7 image from Docker Hub
    environment:  # Environment variables for the MySQL service
      MYSQL_ROOT_PASSWORD: example  # Root password for MySQL
      MYSQL_DATABASE: testdb  # Database name to create in MySQL

Enter fullscreen mode Exit fullscreen mode

The corresponding app.py and Dockerfile are structured to ensure smooth interaction between the services, allowing the web application to connect seamlessly to the MySQL database.

Conclusion

Studying the "Docker Compose for Developers" course has been an enlightening experience. The course not only deepened my understanding of Docker Compose but also equipped me with practical skills to manage multi-container applications more effectively. By mastering the use of docker-compose.yml files, managing multiple Dockerfiles, and securely handling environment variables, I can now streamline my workflows and enhance the scalability of my applications. The example exercise provided a solid foundation for applying these concepts in real-world scenarios. As I continue to explore Docker Compose, I’m confident that these skills will prove invaluable in building efficient, scalable, and maintainable containerized applications.

Top comments (0)