Cập Nhật Gần Nhất: 10/11/2024
Chào các bạn! 👋👋
Những ngày cuối năm miền Bắc thật lạnh, và hôm nay mình sẽ tiếp tục với series học Docker và CI/CD. Bài viết này sẽ hướng dẫn các bạn cách Dockerize một dự án Java Spring Boot sử dụng MySQL và Redis.
Clone Source Code
Trước tiên, hãy clone source code của mình từ nhánh master. Trong bài viết này, chúng ta sẽ chỉ tập trung vào thư mục docker-java-spring-boot-mysql-redis
.
Chạy Thử Trên Local
Khi Dev
Dự án của chúng ta là một ứng dụng CRUD cho người dùng, và dữ liệu sẽ được lưu vào MySQL. Ngoài ra, chúng ta cũng sẽ có tính năng đăng nhập và đăng xuất, với phiên làm việc được lưu trữ trong Redis.
Nếu máy tính của bạn chưa cài đặt Java 17, MySQL hoặc Redis, các bạn có thể theo dõi bài viết này để có cái nhìn tổng quát.
Trước khi chạy, hãy kiểm tra xem các công cụ cần thiết đã được cài đặt chưa bằng các lệnh sau:
bash
java --version
curl localhost:3306
curl localhost:6379
Chú ý: Nếu cổng của MySQL hoặc Redis của bạn khác, hãy thay đổi cho phù hợp.
Tại tệp src/main/java/resources/application.properties
, bạn sẽ cần cập nhật các thông tin cho đúng với cấu hình máy của mình:
- Ứng dụng sẽ chạy trên cổng
8081
. - Tên database là
java_test
với thông tin tài khoản làroot/rootpass
. - Tài khoản đăng nhập vào ứng dụng là
user/Password1
.
Bạn cũng có thể chạy scrip trong tệp db.sql
để tạo bảng dữ liệu cần thiết trong database.
Sau đó, hãy chạy dự án:
bash
./gradlew bootRun
Mở trình duyệt và truy cập vào địa chỉ http://localhost:8081
, sau đó đăng nhập với tài khoản user/Password1
. Bây giờ bạn có thể thử thêm, sửa, xoá một vài người dùng và kiểm tra xem mọi thứ hoạt động ổn không nhé!
Xây Dựng Ứng Dụng
Khi các bạn đã kiểm tra mọi thứ ổn định, bước tiếp theo là chúng ta sẽ sản xuất một file JAR để ứng dụng có thể chạy tốt hơn và sẵn sàng cho việc triển khai vào môi trường sản xuất.
Để xây dựng dự án, bạn chạy lệnh:
bash
./gradlew build
Sau khi quá trình xây dựng hoàn tất, bạn sẽ thấy hai file JAR nằm trong thư mục build/libs
. Bạn có thể chạy thử ứng dụng bằng lệnh:
bash
java -jar demo-0.0.1-SNAPSHOT.jar
Một lần nữa, hãy chắc chắn rằng bạn có thể truy cập vào http://localhost:8081
để thử nghiệm ứng dụng.
Dockerize Ứng Dụng
Bước 1: Dockerize với Build Ngoài, Chạy Trong
Tùy chọn đầu tiên cho việc Dockerize dự án Java là xây dựng JAR ở môi trường ngoài, sau đó đưa vào trong Docker image và chạy nó. Để thực hiện điều này, hãy tạo một tệp Dockerfile
với nội dung sau:
dockerfile
FROM openjdk:17-jdk-alpine3.14
WORKDIR /app
COPY ./build/libs/demo-0.0.1-SNAPSHOT.jar app.jar
CMD ["java","-jar","app.jar"]
Tiếp tục với quá trình build image:
bash
docker build -t java-spring:v1 .
Sau đó tạo tệp docker_application.properties
trong root folder dự án với cấu hình cần thiết cho ứng dụng trong container.
Bước 2: Tạo docker-compose.yml
Tiếp theo, bạn cần tạo tệp docker-compose.yml
để dễ dàng chạy ứng dụng cùng với MySQL và Redis:
yaml
version: '3.7'
services:
app:
image: java-spring:v1
restart: always
ports:
- "8081:8081"
volumes:
- ./docker_application.properties:/app/application.properties:ro
depends_on:
- db
- redis
db:
image: mysql:8
restart: always
volumes:
- ./.docker/data/db:/var/lib/mysql
- ./db.sql:/docker-entrypoint-initdb.d/db.sql:ro
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: demo_app
redis:
image: redis:6-alpine
restart: always
volumes:
- ./.docker/data/redis:/data
Bước 3: Chạy Docker Compose
Bây giờ, hãy chạy ứng dụng:
bash
docker compose up -d
Sau khi ứng dụng đã khởi động, hãy quay lại trình duyệt của bạn và truy cập http://localhost:8081
một lần nữa để kiểm tra mọi thứ.
Xây Dựng + Chạy Trong Docker
Nếu bạn muốn không cần cài đặt Java trên máy của mình, bạn có thể xây dựng và chạy tất cả trong Docker. Đầu tiên, hãy down ứng dụng:
bash
docker compose down
Chỉnh sửa tệp Dockerfile
để xây dựng và chạy trong một môi trường hoàn toàn trong Docker:
dockerfile
FROM openjdk:17-jdk-alpine3.14 as build
WORKDIR /app
COPY . .
RUN ./gradlew build -x test
FROM openjdk:17-jdk-alpine3.14 as production
WORKDIR /app
COPY --from=build /app/build/libs/demo-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","app.jar"]
Cuối cùng, hãy xây dựng lại image và chạy ứng dụng như trước:
bash
docker build -t java-spring:v2 .
docker compose up -d
Tối Ưu Image Size
Bây giờ, hãy tối ưu hóa kích thước image bằng cách sử dụng multi-stage build, giữ lại chỉ file JAR cần thiết cho runtime. Sửa đổi Dockerfile như sau:
dockerfile
FROM eclipse-temurin:17-jdk-alpine as build
WORKDIR /app
COPY . .
RUN ./gradlew build -x test
FROM eclipse-temurin:17-jre-alpine as production
WORKDIR /app
COPY --from=build /app/build/libs/demo-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","app.jar"]
Khi bạn quay lại kiểm tra kích thước của các image, bạn sẽ thấy rằng kích thước của image đã giảm đáng kể.
Kết Luận
Hy vọng bài viết này đã cung cấp cho các bạn kiến thức và kỹ năng cần thiết để Dockerize dự án Java Spring Boot của mình. Hãy áp dụng những gì bạn đã học vào dự án thực tế và trở thành một lập trình viên tự chủ hơn. Cảm ơn các bạn đã theo dõi! Hẹn gặp lại trong các bài viết tiếp theo! 👋
source: viblo