Deploy ứng dụng Spring Boot sử dụng Docker

Trong bài viết này, mình sẽ hướng dẫn các bạn cách deploy một ứng dụng Spring Boot lên Docker các bạn nhé!

Các bước chúng ta cần phải làm là:

  • Tạo một Spring Boot project đơn giản, có khai báo sử dụng database nhưng sẽ không có thao tác nào đến database cả.
  • Viết Dockerfile
  • Deploy ứng dụng lên Docker Container.

OK, bắt đầu nào các bạn.

Tạo Spring Boot project

Mình sẽ sử dụng Spring Tool Suite để tạo một Spring Boot project với Web, Data Jpa Starter và PostgreSQL driver dependencies như sau:

Deploy ứng dụng Spring Boot sử dụng Docker

Kết quả:

Deploy ứng dụng Spring Boot sử dụng Docker

Để đơn giản, mình sẽ mở tập tin SpringBootDockerApplication:

và modify nó một chút để thêm một RESTful Web Service return về chuỗi “Hello Docker! Idle connection to database is 10” như sau:

Mặc định Spring Data Jpa sử dụng Hikari cho phần connection pool và như các bạn thấy, mình sử dụng Hikari để lấy ra số idle connection tới database.

Database configuration được cấu hình trong tập tin application.properties như sau:

Kết quả khi mình chạy chương trình với:

Deploy ứng dụng Spring Boot sử dụng Docker

như sau:

Deploy ứng dụng Spring Boot sử dụng Docker

Bây giờ, mình sẽ viết một Dockerfile để deploy ứng dụng của chúng ta sử dụng Docker Container.


Viết Dockerfile

Mình sẽ tạo mới một tập tin Dockerfile nằm trong thư mục của project:

Deploy ứng dụng Spring Boot sử dụng Docker

Bây giờ, chúng ta sẽ sửa Dockerfile này để xây dựng một Docker Image nhé các bạn.

  • Đầu tiên là mình sẽ sử dụng một Image trên Docker Hub để build Image cho chúng ta.

Image đó có tên là 11.0.11-jre nằm trong repository openjdk. Do đó, câu lệnh FROM của mình sẽ có nội dung như sau:

  • Tiếp theo mình sẽ link thư mục /tmp của Docker Container vào thư mục của Docker (/Applications/Docker.app/Contents/MacOS).

Ở đây, chúng ta sẽ sử dụng câu lệnh VOLUME nhé các bạn:

  • Để chạy ứng dụng, các bạn cần khai báo một số biến môi trường liên quan đến cấu hình database như trên:

Ở đây, mình đang sử dụng PostgreSQL database server được cài đặt trên máy của mình nên mình khai báo database host là host.docker.internal.

  • Giờ mình sẽ copy tập tin spring-boot-docker-0.0.1-SNAPSHOT.jar nằm trong thư mục target của project vào Docker Container.

  • Và cuối cùng thực thi câu lệnh để chạy ứng dụng Spring Boot của chúng ta mỗi khi Docker Container của chúng ta được chạy.

Nội dung toàn bộ của Dockerfile như sau:



Deploy ứng dụng lên Docker Container

Để deploy ứng dụng Spring Boot lên Docker Container từ Dockerfile, trước tiên chúng ta phải tạo Docker Image từ Dockerfile.

Các bạn hãy mở Terminal lên và đi đến thư mục của project, sau đó hãy nhập dòng lệnh sau:

Câu lệnh trên có 2 phần:

  • Phần đầu tiên là chúng ta sẽ dùng Maven để build ứng dụng Spring Boot, mình skip tất cả unit test vì nó không phải là mục tiêu của bài viết này.
  • Phần tiếp theo là dùng Docker để build Docker Image từ Dockerfile.

Sau khi chạy câu lệnh trên, kiểm tra tất cả Docker Image, các bạn sẽ thấy Docker Image mà chúng ta vừa tạo như sau:

Deploy ứng dụng Spring Boot sử dụng Docker

Và bây giờ chúng ta có thể chạy Docker Container từ Docker Image mà chúng ta vừa tạo rồi.

Kết quả:

Deploy ứng dụng Spring Boot sử dụng Docker

Ở đây, mình đã mapping port của máy mình với port của Docker Container là 8080 luôn, nên để kiểm tra kết quả, các bạn cũng truy cập vào http://localhost:8080/hello các bạn nhé!

14 thoughts on “Deploy ứng dụng Spring Boot sử dụng Docker

  1. Cho em hỏi lúc ở hình thứ 2 không có thư mục target. Mà sao hình lúc viết Dokerfile lại có thư mục target vậy? Em không thấy file spring-boot-docker-0.0.1-SNAPSHOT.jar .
    À với em đang dùng gradle chứ không phải maven. Thế thì câu lệnh ở dưới sẽ thay đổi như thế nào ạ?
    mvn clean package && docker build -t spring-boot-docker .
    Thanks

      1. Đây là nội dung trên Dockerfile:
        FROM openjdk:8u141-jre
        VOLUME /tmp
        ADD target/spring-boot-docker-0.0.1-SNAPSHOT.jar app.jar
        ENTRYPOINT exec java -jar app.jar
        Làm giống hệt của bạn.

Add Comment