Bài 15. Build docker image cho ứng dụng Java Spring Boot

Giới thiệu

Hôm nay, mình sẽ đi qua một ví dụ khác về cách xây dựng một Docker Image cho một ứng dụng Java Spring Boot và chạy nó trên Ubuntu Server. Ứng dụng Java Spring Boot chúng sẽ lấy Source Code từ Github và sau đó sẽ được Build trên trên Docker Image, ứng dụng này dùng thư viện Spring Boot để xây dựng ứng dụng Web Application.

Chuẩn bị

Chúng ta sẽ sử dụng source code từ kho lưu trữ java17_app. Máy tính của bạn cần phải cài đặt Git, Docker và chạy trên Ubuntu Server.

Bước 1: Cài đặt Docker trên Ubuntu Server (Nếu chưa có)

Trước tiên, chúng ta cần cài đặt Docker trên Ubuntu Server. Chạy các lệnh sau:

sudo apt-get update
sudo apt-get install -y docker.io
sudo systemctl start
docker sudo systemctl enable docker 

Bước 2: Clone source code từ GitHub

Tiếp theo, chúng ta sẽ clone source code từ kho lưu trữ GitHub.

cd ~
git clone https://github.com/dothiengiang0001/java17_app
cd java17_app

Xây dựng Image

Bước 1: Viết Dockerfile và Nginx Config

- Dockerfile là tệp tin text chứa các chỉ dẫn để Docker Build Image của bạn. Trong thư mục gốc của dự án vừa clone về, tạo một file tên là Dockerfile và thêm vào các dòng sau:

# Sử dụng hình ảnh Gradle chính thức để build
# Hình ảnh này có sẵn Gradle và JDK 17
FROM gradle:7.4.2-jdk17 AS build

# Đặt thư mục làm việc trong container là /app
WORKDIR /app

# Mở cổng 8081 (nếu ứng dụng của bạn sử dụng cổng này, điều này không bắt buộc)
EXPOSE 8081

# Sao chép các file cấu hình Gradle vào container
COPY build.gradle settings.gradle ./

# Sao chép thư mục src vào container
COPY src ./src

# Chạy lệnh Gradle để build ứng dụng và bỏ qua các bài test
RUN gradle clean build -x test

# Sử dụng hình ảnh JDK chính thức để chạy ứng dụng
FROM openjdk:17-jdk-slim

# Đặt thư mục làm việc trong container là /app
WORKDIR /app

# Sao chép file jar đã build từ bước trước vào hình ảnh này
COPY --from=build /app/build/libs/*.jar app.jar

# Định nghĩa lệnh để chạy ứng dụng
ENTRYPOINT ["java", "-jar", "app.jar"]

Bước 2: Build Image từ Dockerfile

Chạy lệnh sau để Build Image cho ứng dụng .NET Core:

# Xóa tất cả container đang chạy (nếu có)
docker container rm -f $(docker ps -aq)

# Xóa tất cả image đang chạy (nếu có)
docker image rm -f $(docker images -aq)

# build ứng dụng dựa trên Dockerfile
docker build -t java17-app .

Lệnh trên sẽ Build một Docker Image với tên java17-app từ thư mục hiện tại (dấu chấm).

Bước 3: Kiểm tra image

Liệt kê các Image có trong Docker Host:

docker images

Bạn sẽ thấy có Image với tên là java17-app.

Bước 4: Push image lên Docker Hub (Tùy chọn)

Nếu bạn muốn chia sẻ Docker Image của mình với người khác hoặc deploy trên một server khác, bạn có thể Push Image lên Docker Hub.

1. Đăng nhập vào Docker Hub:

docker login

2. Tag Docker image:

# cú pháp
docker tag java17-app <username>/<image_name>:<image_tag>
# ví dụ
docker tag java17-app dothiengiang0001/java17-app:v1

3. Push Docker image lên Docker Hub:

# cú pháp
docker push <username>/<image_name>:<image_tag>
# ví dụ
docker push dothiengiang0001/java17-app:v1

 

Thực thi tạo container từ image

Yêu cầu

  • Đưa container xuống chạy ngầm
  • Đặt tên cho containerjava17-app:v1
  • Tạo cổng kết nối thông từ 8081 trên host vào cổng 5000 bên trong container

Tạo container từ image đã tạo:

# chạy với tên container tên java17-app-container qua image dothiengiang0001/java17-app:v1
docker run -d --name java17-app-container -p 5000:8081 dothiengiang0001/java17-app:v1
# kiểm tra container
docker ps

Test thành quả

Mở trên Ubuntu bằng lệnh:

curl localhost:5000

 

Test trên browser google chrome

Thực hiện mở cổng kết nối qua Virtual Box:

- Lần này chúng ta mở cổng 5000 expose ra ngoài:

Trên Google Chrome chúng ta truy cập 127.0.0.120:5000 như thiết lập trên và xem kết quả:

Kết luận

Trong bài viết này, chúng ta đã đi qua quy trình chi tiết để xây dựng và triển khai một ứng dụng Java Spring Boot sử dụng Docker trên Ubuntu Server từ source code được clone từ GitHub. Các bước từ chuẩn bị mã nguồn, cài đặt Docker, viết Dockerfile, xây dựng Image, kiểm tra Image, đẩy Image lên Docker Hub, và cuối cùng là chạy container từ Image đã tạo đều được thực hiện một cách tuần tự và rõ ràng. Với việc sử dụng Docker, chúng ta không chỉ đảm bảo tính nhất quán trong môi trường triển khai mà còn tăng cường khả năng mở rộng và quản lý ứng dụng dễ dàng hơn.


Tác giả: Đỗ Thiên Giang

Chú ý: Tất cả các bài viết trên TEDU.COM.VN đều thuộc bản quyền TEDU, yêu cầu dẫn nguồn khi trích lại trên website khác.

Lên trên