hocvietcode.com
  • Trang chủ
  • Học lập trình
    • Lập trình C/C++
    • Cấu trúc dữ liệu và giải thuật
    • Lập trình HTML
    • Lập trình Javascript
      • Javascript cơ bản
      • ReactJS framework
      • AngularJS framework
      • Typescript cơ bản
      • Angular
      • NodeJS
    • Lập trình Mobile
      • Lập Trình Dart Cơ Bản
        • Dart Flutter Framework
    • Cơ sở dữ liệu
      • MySQL – MariaDB
      • Micrsoft SQL Server
      • Extensible Markup Language (XML)
      • JSON
      • MongoDB
    • Lập trình PHP
      • Lập trình PHP cơ bản
      • Laravel Framework
    • Lập trình Java
      • Java Cơ bản
      • Spring Boot
    • Lập trình C#
      • Lập Trình C# Cơ Bản
      • ASP.NET Core MVC
    • Lập trình Python
    • Git và Github
    • Machine Learning
  • WORDPRESS
    • WordPress cơ bản
    • WordPress nâng cao
    • Chia sẻ WordPress
  • Kiến thức hệ thống
    • Microsoft Azure
    • Docker
    • Linux
    • Mạng và truyền thông
  • Chia sẻ IT
    • Tin học văn phòng
      • Microsoft Word
      • Microsoft Excel
    • Marketing
      • Google Adwords
      • Facebook Ads
      • Kiến thức khác
    • Chia sẻ phần mềm
    • Review công nghệ
    • Công cụ – tiện ích
      • Kiểm tra bàn phím online
      • Kiểm tra webcam online
Đăng nhập
  • Đăng nhập / Đăng ký

Please enter key search to display results.

Home
  • Spring Boot
Spring Boot bài 28: Đóng gói JAR, Docker và cấu hình triển khai
Java và Spring Boot – MVC và REST API

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.

← Bài 27 · Mục lục 12 chương

Mục lục

  • Mục tiêu bài học
  • JAR chứa ứng dụng và web server nhúng
  • Docker image tối giản cho phần runtime
  • Mặc định là bản demo H2
  • Những việc cần kiểm tra ở biên triển khai
  • Lỗi thường gặp và lưu ý
  • Ghi nhớ
  • Tài liệu đối chiếu

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.

Tài liệu đối chiếu

  • Packaging for Production
  • Dockerfiles

← Bài 27 · Mục lục 12 chương

Bài viết liên quan:

Java và Spring Boot – MVC và REST API
Spring Boot bài 14: Quan hệ JPA, DTO và tránh truy vấn N+1
Java và Spring Boot – MVC và REST API
Spring Boot bài 15: Tìm kiếm, phân trang và sắp xếp có kiểm soát
Java và Spring Boot – MVC và REST API
Spring Boot bài 16: Upload và download tài liệu có giới hạn
Java và Spring Boot – MVC và REST API
Spring Boot bài 17: Spring Security: đăng nhập, mật khẩu và SecurityFilterChain
Java và Spring Boot – MVC và REST API
Spring Boot bài 18: Phân quyền teacher/student và bảo vệ endpoint
Java và Spring Boot – MVC và REST API
Spring Boot bài 19: CSRF, CORS và gọi API có session đúng cách
Java và Spring Boot – MVC và REST API
Spring Boot bài 20: REST Controller, JSON và DTO cho API danh sách
Java và Spring Boot – MVC và REST API
Spring Boot bài 21: REST CRUD: POST, PUT, DELETE và mã trạng thái
Java và Spring Boot – MVC và REST API
Spring Boot bài 22: Validation API, ProblemDetail và hợp đồng lỗi
Java và Spring Boot – MVC và REST API
Spring Boot bài 23: Gọi dịch vụ HTTP bằng RestClient và đặt timeout
Java và Spring Boot – MVC và REST API
Spring Boot bài 08: Fragment, layout và tài nguyên CSS trong Spring Boot
Java và Spring Boot – MVC và REST API
Spring Boot bài 24: Gửi email và lập lịch tác vụ trong Spring Boot

Dịch vụ thiết kế Wesbite

NỘI DUNG MỚI CẬP NHẬT

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 05: Đơn vị và kích thước: px, rem, %, min và max

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 02: Selector và class: chọn đúng phần tử cần sửa

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 01: Kết nối CSS với HTML và sửa quy tắc đầu tiên

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 20: Hoàn thiện website và sửa lỗi bằng DevTools

CSS cơ bản – 20 bài từ HTML đến website responsive với Flexbox, Grid và mobile-first

CSS cơ bản – Bài 03: Vì sao CSS không có tác dụng? Cascade và specificity

Giới thiệu

hocvietcode.com là website chia sẻ và cập nhật tin tức công nghệ, chia sẻ kiến thức, kỹ năng. Chúng tôi rất cảm ơn và mong muốn nhận được nhiều phản hồi để có thể phục vụ quý bạn đọc tốt hơn !

Liên hệ quảng cáo: [email protected]

Kết nối với HỌC VIẾT CODE

© hocvietcode.com - Tech888 Co .Ltd since 2019

Đăng nhập

Trở thành một phần của cộng đồng của chúng tôi!
Registration complete. Please check your email.
Đăng nhập bằng google
Đăng kýBạn quên mật khẩu?

Create an account

Welcome! Register for an account
The user name or email address is not correct.
Registration confirmation will be emailed to you.
Log in Lost your password?

Reset password

Recover your password
Password reset email has been sent.
The email could not be sent. Possible reason: your host may have disabled the mail function.
A password will be e-mailed to you.
Log in Register
×