Chào mọi người, hôm nay Ngô Tôn .IT sẽ hướng dẫn các bạn cách Build và deploy website Angular và Spring Boot bằng Docker Compose.
Bài viết chỉ tập trung vào phần Docker Compose, còn Angular và Spring Boot sẽ hẹn các bạn vào các bài viết khác nhé.
Docker Compose là gì?
Nếu như các bạn có theo dõi bài trước đó là Build và Deploy ứng dụng Machine Learning với Docker thì các bạn cũng biết được Docker là gì. Vậy còn Docker Compose?
Docker Compose là một công cụ dùng để định nghĩa và chạy các chương trình Docker sử dụng nhiều container (multi-container). Chúng ta sử dụng một file YAML để thiết lập các service cần thiết cho chương trình. Và chỉ với một câu lệnh, chúng ta sẽ create và start tất cả service từ các thiết lập đó.
Việc sử dụng Docker Compose thường có 3 bước cơ bản sau:
- Khai báo environment của ứng dụng với Dockerfile.
- Khai báo các services cần thiết để chạy app trong docker-compose.yml.
- Chạy lệnh docker-compose up để khởi động Compose và chạy app.
Lợi ích của Docker Compose
- Tạo nhiều môi trường độc lập trên một máy chủ duy nhất
- Bảo toàn dữ liệu khi các container được tạo
- Chỉ tạo lại các container đã thay đổi
- Điều chỉnh các biến giữa các môi trường
Cài đặt
Việc cài đặt Docker Compose rất đơn giản, các bạn chỉ cần tải Docker và Docker Compose theo hệ điều hành mình đang sử dụng về máy và tiến hành cài đặt thôi.
Build và deploy website Angular và Spring Boot bằng Docker Compose
Bây giờ đến nội dung chính của bài viết, sử dụng Docker Compose để build và deploy website với front-end là Angular và back-end là Java Spring Boot.
Cấu trúc thư mục của dự án
1 2 3 4 5 6 7 8 |
. ├── Banking ├── backend ├── frontend ├── Dockerfile_be ├── Dockerfile_fe ├── docker-compose-be.yml └── docker-compose-fe.yml |
Thư mục frontend chứa mã nguồn của website được viết bằng Angular.
Tạo Dockerfile
File Dockerfile_be
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
FROM maven:3.6.0-jdk-11-slim AS MAVEN_BUILD COPY . /Banking RUN rm -rf /Banking/frontend WORKDIR /Banking RUN mvn package FROM openjdk:11-jdk-slim RUN mkdir -p /Banking WORKDIR /Banking COPY --from=MAVEN_BUILD /Banking/backend/target/banking-platform-0.0.1-SNAPSHOT.jar /Banking #run the spring boot application ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "-Dblabla", "-jar","banking-platform-0.0.1-SNAPSHOT.jar"] |
Ở đây dự án mình dùng Maven và JDK 11 nên chúng ta sẽ dùng maven:3.6.0-jdk-11-slim và openjdk:11-jdk-slim để build phần back end.
File Dockerfile_fe
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
FROM node:12-alpine RUN mkdir -p /app WORKDIR /app COPY /frontend/package.json /app RUN npm install COPY /frontend /app EXPOSE 4200 CMD ["npm", "start"] |
Phần front end chúng ta chạy Node 12 và expose port 4200.
Cấu hình Compose
File docker-compose-be.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
version: '2.1' services: flyway: image: boxfuse/flyway:latest command: -url=jdbc:postgresql://banking-postgres:5432/banking -schemas=public -user=banking -password=banking migrate volumes: - ./banking-platform/src/main/resources/db/migration:/flyway/sql depends_on: banking-postgres: condition: service_healthy networks: - banking-network banking-spring: build: context: . dockerfile: Dockerfile_be ports: - 8800:8800 depends_on: banking-postgres: condition: service_healthy networks: - banking-network banking-postgres: image: postgres:10.5-alpine restart: always volumes: - db-data:/var/lib/postgresql/data ports: - 5432:5432 environment: POSTGRES_USER: banking POSTGRES_PASSWORD: banking POSTGRES_DB: banking healthcheck: test: ["CMD-SHELL", "pg_isready -U banking"] interval: 5s timeout: 5s retries: 5 networks: - banking-network volumes: db-data: driver: local networks: banking-network: driver: bridge |
Ở phần này, mình định nghĩa Compose dùng version 2.1. Mình tạo ra 2 service là banking-spring (Java Spring boot) và banking-postgres (Cơ sở dữ liệu PostgreSQL), còn service flyway (cái này các bạn không cần cũng được, do dự án mình có chạy migration DB).
- banking-spring: mình tạo image từ Dockerfile_be và chạy back end port 8800.
- banking-postgres: tạo image postgres:10.5-alpine từ Docker Hub, khai báo thông tin database và chạy port 5432
Tất cả service chạy cùng mạng là banking-network.
File docker-compose-fe.yml
1 2 3 4 5 6 7 8 9 10 |
version: '2.1' services: banking-angular: build: context: . dockerfile: Dockerfile_fe ports: - 4200:4200 networks: - banking-network |
Build và Deploy
Mở Terminal và chạy lệnh sau:
1 |
$docker-compose -f docker-compose-be.yml -f docker-compose-fe.yml up |
Giải thích thêm
Phần thiết lập của file Docker Compose mình có để khá nhiều thông tin, những thông tin này gần như đầy đủ cho 1 dự án thực tế hoàn chỉnh. Nếu dự án của các bạn không dùng tới thì phần thiết lập sẽ đơn giản hơn.
Các thông tin cơ bản như services, volumes, networks, build, image, ports, depends_on, healthcheck,… các bạn tìm hiểu thêm nhé.
Với những website không viết bằng Spring Boot hay Angular thì các bước làm vẫn tương tự, chỉ khác nhau về nền tảng hay phiên bản nên các bạn cũng đừng lo lắng việc đó.
Chúc các bạn thành công
Leave a Reply