Bài 14: Hiểu về Docker Compose
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 đọcDockerfiletrong thư mục đó.ports: ánh xạ cổng8080từ 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 imageredis:alpinetừ Docker Hub.
db:image: sử dụng imagemysql: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
webappkết nối đếndbthông quaSPRING_DATASOURCE_URL=jdbc:mysql://db:3306/mydatabase. Lưu ý rằngdbở đâ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.webappcũng có thể kết nối đếnredisthông qua hostnameredis, 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.