3.1 Tệp compose.yaml
Tệp compose.yaml
(hoặc một trong các phiên bản khác như: docker-compose.yaml
, docker-compose.yml
, compose.yml
) — là tệp cấu hình chính được Docker Compose sử dụng để định nghĩa và quản lý các ứng dụng đa container. Tệp này mô tả các container (services) nào cần được chạy, cách chúng tương tác với nhau và tài nguyên nào cần thiết cho chúng.
Để đồng nhất trong bài giảng này, mình sẽ sử dụng phiên bản compose.yaml
, vì nó được khuyến nghị cho các phiên bản Docker Compose hiện đại.
Cấu trúc của tệp compose.yaml
Tệp compose.yaml
bao gồm một số phần, mỗi phần mô tả các khía cạnh khác nhau về cấu hình ứng dụng. Các phần chính bao gồm:
- version: chỉ định phiên bản của tệp Compose (ví dụ:
'3.9'
). - services: mô tả các container (services), các thiết lập và phụ thuộc của chúng.
- volumes: định nghĩa các volume để lưu trữ dữ liệu giữa các container và host.
- networks: cấu hình các mạng, qua đó các services giao tiếp với nhau.
3.2 Các directive chính
1. version
Directive version xác định phiên bản cú pháp Docker Compose được sử dụng trong file compose.yaml
. Tại thời điểm viết bài, phiên bản hiện tại nhất là phiên bản 3, cụ thể là các bản cập nhật như 3.8 và 3.9.
version: '3.9'
2. services
Phần services xác định các container mà Compose cần tạo và chạy. Mỗi service là một container riêng biệt với cấu hình cụ thể.
Ví dụ:
services:
web:
image: nginx:latest
ports:
- "80:80"
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
Trong ví dụ này, có hai service được định nghĩa: web
và db
. Service web
sử dụng image nginx:latest
và mở cổng 80. Service db
sử dụng image mongo:latest
và gắn volume để lưu trữ dữ liệu.
3. volumes
Phần volumes được sử dụng để định nghĩa các volume, có thể được gắn vào container để lưu trữ dữ liệu. Điều này hữu ích để bảo toàn dữ liệu khi các container được khởi động lại.
Ví dụ:
volumes:
mongo-data:
4. networks
Phần networks cho phép định nghĩa mạng tùy chỉnh mà các container sẽ hoạt động trên đó. Điều này đảm bảo sự cô lập và cấu hình kết nối mạng. Nếu không chỉ định mạng, Docker Compose sẽ tạo một mạng mặc định và tất cả các service sẽ kết nối với nó.
Ví dụ:
networks:
front-end:
back-end:
3.3 Chỉ thị để cấu hình services
Các chỉ thị chính để cấu hình services:
1. image
Chỉ thị image chỉ định image sẽ được sử dụng để tạo container.
Ví dụ:
services:
web:
image: nginx:latest
2. build
Chỉ thị build được sử dụng để chỉ định đường dẫn đến Dockerfile, cái sẽ được dùng để build image.
Ví dụ:
services:
app:
build: ./app
3. ports
Chỉ thị ports xác định các port cần mở và liên kết từ host machine đến container.
Ví dụ:
services:
web:
image: nginx:latest
ports:
- "80:80"
4. volumes
Chỉ thị volumes gắn volume vào container, cho phép lưu dữ liệu giữa các lần khởi động lại container.
Ví dụ:
services:
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
5. environment
Chỉ thị environment đặt biến môi trường cho container.
Ví dụ:
services:
app:
image: myapp:latest
environment:
- NODE_ENV=production
- API_KEY=1234567890
6. depends_on
Chỉ thị depends_on chỉ ra service này phụ thuộc vào các service khác và phải được chạy sau chúng.
Quan trọng!
Khi khởi động service của bạn, bạn không có 100% đảm bảo rằng tất cả các service cần thiết để nó hoạt động đã hoàn toàn sẵn sàng. Chúng sẽ được khởi chạy — đúng, nhưng hoạt động tiếp theo không được đảm bảo. Vấn đề này được giải quyết bằng health-check, nhưng điều này sẽ được nói sau.
Ví dụ:
services:
web:
image: nginx:latest
depends_on:
- db
db:
image: mongo:latest
7. command
Chỉ thị command cho phép ghi đè lệnh được thực thi khi container chạy.
Ví dụ:
services:
app:
image: myapp:latest
command: python app.py
8. networks
Chỉ thị networks kết nối service với một hoặc nhiều mạng.
Ví dụ:
services:
web:
image: nginx:latest
networks:
- front-end
db:
image: mongo:latest
networks:
- back-end
3.4 Ví dụ đầy đủ
Ví dụ file hoàn chỉnh compose.yaml
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- app
networks:
- front-end
app:
build: ./app
volumes:
- ./app:/usr/src/app
environment:
- NODE_ENV=production
networks:
- front-end
- back-end
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
networks:
- back-end
volumes:
mongo-data:
networks:
front-end:
back-end:
Trong ví dụ này:
- Định nghĩa ba service:
web
,app
vàdb
. -
web
sử dụng image Nginx, gắn file cấu hình và phụ thuộc vào serviceapp
. -
app
được build từ Dockerfile local, gắn mã nguồn ứng dụng và sử dụng các biến môi trường. -
db
sử dụng image MongoDB và gắn volume để lưu trữ dữ liệu. - Tạo hai volume và hai network để cách biệt và quản lý sự tương tác giữa các service.
Lưu ý: một volume là mongo-data
, còn lại là thư mục được mount từ máy host (ví dụ: ./app
).
GO TO FULL VERSION