Spring Boot bài 28: Đóng gói JAR, Docker và cấu hình triển khai
- 18-10-2026
- Toanngo92
- 0 Comments
Giáo trình Spring Boot MVC và REST API · Chương 12/12: Quan sát, migration và triển khai · Bài 28/28 · Biên soạn tháng 10/2026.
Mục lục
Mục tiêu bài học
Build bản chạy độc lập, tạo container không dùng root và chuẩn bị cấu hình, lưu trữ, HTTPS cho môi trường triển khai.
JAR chứa ứng dụng và web server nhúng
Spring Boot Maven Plugin tạo executable JAR từ dự án. Chạy test trước khi đóng gói để tránh xuất bản một bản chỉ biên dịch được nhưng sai hành vi. Khi chạy bằng java -jar, máy đích cần Java tương thích và cấu hình môi trường; không cần mở IDE hoặc cài Tomcat riêng cho cách đóng gói này.
Build một lần và dùng cùng artifact đã kiểm tra giúp tránh việc mỗi server tải dependency rồi tạo ra bản khác nhau. Ghi lại phiên bản Java, Boot và checksum artifact nếu xây pipeline. Không chọn file .jar.original để chạy như executable Boot JAR.
.\mvnw.cmd clean verify
java -jar target/hvc-academy-0.0.1-SNAPSHOT.jar
Docker image tối giản cho phần runtime
Dockerfile trong mã mẫu lấy Java 21 JRE, sao chép JAR đã build và chạy bằng user app không đặc quyền. Nó không build Maven bên trong runtime image. Vì vậy phải có target/hvc-academy-0.0.1-SNAPSHOT.jar trước khi docker build.
Tag image cố định giúp lặp lại môi trường; trong vận hành nghiêm ngặt nên pin digest và cập nhật bản vá có kế hoạch. Không COPY .env, mật khẩu hoặc thư mục .m2 vào image. EXPOSE mô tả cổng container, không tự mở cổng ra máy host.
Tệp trong mã nguồn mẫu: Dockerfile. Đoạn dưới được trích từ tệp này; xem bản tải về để có đủ import và phần còn lại.
FROM eclipse-temurin:21-jre
WORKDIR /app
RUN groupadd --system app && useradd --system --gid app app && mkdir /app/uploads && chown app:app /app/uploads
COPY --chown=app:app target/hvc-academy-0.0.1-SNAPSHOT.jar app.jar
USER app
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app/app.jar"]
docker build -t hvc-academy:2026 .
docker run --rm --name hvc-academy -p 127.0.0.1:8080:8080 --env HVC_DEMO_PASSWORD --mount type=volume,src=hvc-academy-uploads,dst=/app/uploads hvc-academy:2026
Mặc định là bản demo H2
Lệnh trên nhận HVC_DEMO_PASSWORD từ shell host và chạy cấu hình H2. Upload được giữ trong volume, nhưng dữ liệu khóa học H2 vẫn mất khi ứng dụng dừng. Để lưu bền, đặt thêm profile mysql và các biến DB như bài 13, bảo đảm container kết nối được hostname database. localhost bên trong container là chính container đó, không mặc định là máy host hoặc container MySQL khác.
Với server thật, dùng cơ chế secrets của nền tảng hoặc tệp môi trường được bảo vệ và không commit. Tài khoản teacher/student in-memory chỉ để học: trước khi mở phục vụ thật cần thay bằng kho tài khoản, quy trình mật khẩu và phân quyền theo nghiệp vụ. Không dùng bộ demo như một LMS production đầy đủ.
Những việc cần kiểm tra ở biên triển khai
Đặt reverse proxy và HTTPS, cấu hình forwarded headers theo proxy tin cậy, cookie Secure/SameSite phù hợp, CORS đúng domain và database có backup/restore. Chỉ mở cổng cần thiết, không công khai cổng DB hay các Actuator endpoint nhạy cảm. Nếu upload dùng volume, xác nhận user app có quyền ghi đúng nơi.
Sau deploy, kiểm tra health, danh sách, chi tiết, đăng nhập, POST có CSRF, quyền student/teacher và một vòng API CRUD trên dữ liệu thử. Quan sát log và xác nhận dữ liệu còn sau restart khi dùng MySQL. Tài liệu và mã mẫu cung cấp nền tảng MVC/API; các chuyên đề như OAuth2, queue, cache hay tối ưu quy mô lớn là bước học tiếp theo theo nhu cầu.
Lỗi thường gặp và lưu ý
- Không nhét mật khẩu vào Dockerfile, lệnh build argument hoặc Git.
- Volume upload không lưu database H2 trong bộ nhớ; đây là hai loại dữ liệu khác nhau.
Ghi nhớ
Bạn đã đi từ request HTML đến API có dữ liệu, bảo mật, kiểm thử và đóng gói; bước triển khai cần giữ nguyên các bằng chứng đã kiểm tra.

