Skip to main content

Command Palette

Search for a command to run...

Bài 14: Hiểu về Docker Compose

Updated
3 min read

Giới thiệu

Docker Compose là công cụ hữu ích trong việc định nghĩa và chạy các ứng dụng Docker đa-container. Cụ thể, nó sẽ đọc các thông số từ một file YAML có tên mặc định là docker-compose.yml, sau đó khởi tạo các services, networks, và volumes tương ứng.

Cài Đặt Docker Compose

Ubuntu

Docker Compose có thể được cài đặt qua package manager hoặc direct download. Để cài qua package manager:

sudo apt install docker-compose

Để cài đặt Docker Compose phiên bản cụ thể:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Windows và MacOS

Đối với Docker Desktop, Docker Compose đã được tích hợp sẵn và không cần cài đặt riêng.

Syntax cơ bản và Nâng cao trong docker-compose.yml

File docker-compose.yml được chia thành các section chính: version, services, networks, volumes.

Services

Đây là phần chính, định nghĩa các container và cấu hình của chúng.

services:
  webapp:
    image: nginx:alpine
    build:
      context: ./webapp
      dockerfile: Dockerfile.dev
    ports:
      - "8080:80"
    environment:
      - NODE_ENV=development
    volumes:
      - /app/node_modules
      - ./webapp:/app

Image và Build

  • image: sử dụng image đã có sẵn từ Docker Hub hoặc registry khác.

  • build: build image từ source code, thường dùng trong quá trình development.

Environment

Định nghĩa các biến môi trường cho container.

Networks

networks:
  backend:
    driver: bridge

Networks định nghĩa cách các container nói chuyện với nhau. Trong ví dụ này, backend là một network được tạo ra với driver là bridge, đây là driver mặc định của Docker.

Volumes

volumes:
  db-data:
    driver: local

Volumes giúp bạn quản lý storage, trong trường hợp này, db-data là một volume với driver local.

Phân tích cụ thể một ví dụ với Spring Boot và Redis

Giả sử bạn đang phát triển một ứng dụng web dùng Spring Boot và cần sử dụng Redis để caching hay làm message broker. File docker-compose.yml có thể như sau:

version: '3'
services:
  webapp:
    image: my-springboot-app
    build: ./springboot-app
    ports:
      - "8080:8080"
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/mydatabase
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=root
  redis:
    image: "redis:alpine"
  db:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=mydatabase
  • version: Phiên bản của Docker Compose file format. Ở đây là 3.

  • services: Chúng ta có ba services: webapp, redis, và db.

    • webapp:

      • image: tên image sau khi build sẽ là my-springboot-app.

      • build: Docker sẽ tìm đến thư mục ./springboot-app để build image, bằng cách đọc Dockerfile trong thư mục đó.

      • ports: ánh xạ cổng 8080 từ container ra máy host.

      • environment: định nghĩa các biến môi trường cho ứng dụng Spring Boot, như cấu hình database.

    • redis:

      • image: sử dụng image redis:alpine từ Docker Hub.
    • db:

      • image: sử dụng image mysql:5.7.

      • environment: cài đặt mật khẩu root và tên của database.

Giải thích logic giữa các services

  • webapp kết nối đến db thông qua SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/mydatabase. Lưu ý rằng db ở đây không phải là hostname thật sự mà là tên của service trong Docker Compose. Docker networking sẽ đảm nhận việc routing này.

  • webapp cũng có thể kết nối đến redis thông qua hostname redis, và cổng mặc định 6379 (nếu bạn không override).

Khởi động các services

Sau khi đã có file docker-compose.yml, bạn có thể chạy:

docker-compose up --build

Lệnh trên sẽ build (hoặc rebuild) các images, khởi tạo và khởi động các containers một cách tự động.

Kết luận

Docker Compose giúp chúng ta dễ dàng quản lý và cấu hình các containers liên quan đến ứng dụng. Với file docker-compose.yml mô tả cấu trúc và cách chạy, việc setup môi trường cho developer hay triển khai ứng dụng trở nên rất nhất quán và dễ dàng.

More from this blog

Untitled Publication

218 posts