4.1 Khởi tạo
Trong bước này, tụi mình sẽ cấu hình file compose.yaml
để khởi chạy tất cả các dịch vụ trong ứng dụng đa container. File compose.yaml
sẽ bao gồm cấu hình cho frontend, backend và cơ sở dữ liệu, cũng như định nghĩa network và volume.
Xác định phiên bản Docker Compose
Bắt đầu bằng cách chỉ ra phiên bản của Docker Compose. Trong ví dụ này sử dụng phiên bản 3:
version: '3'
4.2 Định nghĩa dịch vụ
Dịch vụ 1: Frontend (ReactJS)
Định nghĩa một dịch vụ cho frontend, được build từ thư mục frontend và sẽ có sẵn tại cổng 3000:
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
networks:
- task-network
Dịch vụ 2: Backend (Flask)
Định nghĩa một dịch vụ cho backend, được build từ thư mục backend. Nó phụ thuộc vào dịch vụ cơ sở dữ liệu và sẽ có sẵn tại cổng 5000:
backend:
build: ./backend
ports:
- "5000:5000"
depends_on:
- database
networks:
- task-network
environment:
- DATABASE_URL=postgresql://taskuser:taskpassword@database:5432/taskdb
Trong đó:
- depends_on: chỉ ra rằng dịch vụ backend phụ thuộc vào dịch vụ database. Điều này có nghĩa là cơ sở dữ liệu sẽ được khởi động trước khi backend khởi động.
- environment: cấu hình biến môi trường để kết nối với cơ sở dữ liệu.
Dịch vụ 3: Database (PostgreSQL)
Định nghĩa một dịch vụ cho cơ sở dữ liệu, sử dụng image chính thức postgres:13. Cấu hình các biến môi trường để tạo cơ sở dữ liệu và thông tin tài khoản người dùng:
database:
image: postgres:13
environment:
- POSTGRES_DB=taskdb
- POSTGRES_USER=taskuser
- POSTGRES_PASSWORD=taskpassword
networks:
- task-network
volumes:
- db-data:/var/lib/postgresql/data
Trong đó:
-
environment
: cấu hình các biến môi trường để tạo cơ sở dữ liệu và người dùng khi container khởi động. -
volumes
: gắn volume db-data để lưu trữ dữ liệu vĩnh viễn.
4.3 Cấu hình mạng và volumes
Xác định mạng và volumes sẽ được sử dụng bởi các dịch vụ của chúng ta:
networks:
task-network:
driver: bridge
volumes:
db-data:
Ở đây:
- networks: định nghĩa mạng
task-network
với loại driverbridge
, cái này sẽ được sử dụng để kết nối giữa các containers. - volumes: định nghĩa volume
db-data
để lưu trữ dữ liệu của cơ sở dữ liệu.
4.4 Tệp đầy đủ docker-compose.yml
Bây giờ chúng ta sẽ kết hợp tất cả các phần vào một tệp docker-compose.yml
:
version: '3'
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
networks:
- task-network
backend:
build: ./backend
ports:
- "5000:5000"
depends_on:
- database
networks:
- task-network
environment:
- DATABASE_URL=postgresql://taskuser:taskpassword@database:5432/taskdb
database:
image: postgres:13
environment:
- POSTGRES_DB=taskdb
- POSTGRES_USER=taskuser
- POSTGRES_PASSWORD=taskpassword
networks:
- task-network
volumes:
- db-data:/var/lib/postgresql/data
networks:
task-network:
driver: bridge
volumes:
db-data:
Giải thích cấu hình
-
build
: chỉ định đường dẫn tới thư mục chứaDockerfile
để xây dựng image. -
ports
: mở các cổng trên host để truy cập vào các dịch vụ. -
depends_on
: cho biết dịch vụ phụ thuộc vào dịch vụ khác để đảm bảo thứ tự khởi chạy. -
environment
: cấu hình các biến môi trường cho dịch vụ. -
networks
: xác định mạng để các container liên lạc với nhau. -
volumes
: xác định volumes để lưu trữ dữ liệu lâu dài.
4.5 Khởi chạy ứng dụng
Giờ đây, khi file compose.yaml
đã được cài đặt, mình có thể khởi chạy tất cả các dịch vụ chỉ với một lệnh duy nhất:
docker compose up
Lệnh này sẽ tạo và khởi chạy các container cho frontend, backend và cơ sở dữ liệu, sử dụng các thiết lập đã được định nghĩa trong compose.yaml
.
Kiểm tra việc khởi chạy
Sau khi các container được khởi động, hãy đảm bảo tất cả dịch vụ hoạt động bình thường:
- Frontend: mở trình duyệt và truy cập địa chỉ http://localhost:3000, để kiểm tra hoạt động của frontend.
- Backend: mở trình duyệt và truy cập địa chỉ http://localhost:5000, để kiểm tra hoạt động của backend.
- Database: đảm bảo container cơ sở dữ liệu đã được khởi động và có thể truy cập thông qua kết nối mạng với backend.
GO TO FULL VERSION