Thứ Bảy, 18 tháng 9, 2021

Bài đọc thêm: Kết hợp docker-compose vào chu trình của Maven trong việc phát triển ứng dụng

Xây dựng môi trường hỗ trợ làm việc nhóm với Docker

Bài đọc thêm: Kết hợp docker-compose vào chu trình của Maven trong việc phát triển ứng dụng

 

Mục đích: Sau bài viết số 5 về “Ứng dụng docker để tạo lập môi trường phát triển ứng dụng với Maven”, chúng ta nhận thấy rằng việc thực hiện phát triển ứng dụng với Maven kết hợp với docker trải quá các bước sau

1.       Tạo project và phát triển ứng dụng

2.       Thực hiện cấu hình multi-stage build thông qua việc

a.       Cấu hình service cung cấp cho ứng dụng thực thi kiểm thử (từ DB, web container, service hỗ trợ, …) với file yaml

b.       Tạo các image với multi-stage build thông qua các dockerfile (từ việc tạo image, đến đưa gói ứng dụng vào bên trong image để có thể hỗ trợ test khi các image được load thành container)

3.       Load các image trở thành các docker container để thực thi

Với các bước nêu trên, chúng ta nhận thấy tại bước 2b, khả năng gói ứng dụng mong đợi là bảng – version mới nhất có thể không được đưa vào trong image. Quá trình nêu trên, chúng ta thấy có sự tách biệt giữa phát triển và kiểm thử. Trong khi đó, maven hỗ trợ chúng một lifecycle để có thể thực hiện điều đó cùng với giải pháp tích hợp docker-compose như là plugin vào trong maven để quá trình build ứng dụng với maven sẽ kích hoạt luôn cấu hình build các services kèm theo và triển khai luôn kiểm thử trong quá trình phát triển ứng dụng cũng như đảm bảo phiên bản mới nhất vừa phát triển là bản có trong image. Bài viết này chúng ta sẽ cùng tìm cách thức tích hợp docker-compose vào chu trình phát triển ứng dụng sử dụng maven toolkit kết hợp với docker-compose plugin. Trong bài viết này, chúng ta cũng sẽ cấu hình trực tiếp vào ứng dụng đang phát triển để có triển build của ứng dụng sẽ thực thi luôn cả việc build image, nạp image sau khi build trở thành docker container chạy để test ứng dụng đang được phát triển.

Yêu cầu về kiến thức cơ bản

·         Nắm vững là đã thực hiện xong bài viết “Xây dựng môi trường hỗ trợ làm việc nhóm với Docker” (tham khảo tại địa chỉ http://www.kieutrongkhanh.net/search/label/Docker )

·         Nắm vững và đã thực hiên xong ứng dụng trong bài viết  5 về “Ứng dụng docker để tạo lập môi trường phát triển ứng dụng với Maven” (tham khảo tại địa chỉ http://www.kieutrongkhanh.net/2021/09/bai-5-ung-dung-docker-e-tao-lap-moi.html )

·         Nắm vững các kiến thức về docker từ khái niệm đến việc cài đặt docker desktop (tham khảo tại địa chỉ Docker Documentation | Docker Documentation)

·         Nắm vững kiến thức và các sử dụng tài nguyên trên Docker Hub (tham khảo tại địa chỉ Docker Hub - Container Image Library | Docker )

·         Tìm hiểu các lệnh docker-compose (tham khảo tại địa chỉ Compose file | Docker Documentation)

·         Tìm hiểu cú pháp lệnh của tập tin YAML (tham khảo tại địa chi YAML Ain’t Markup Language (YAML™) Version 1.2)

·         Nắm vững và đã thức hiện phát triển ứng dụng web với mô hình MVC2 sử dụng ant tool (tham khảo tại địa chỉ http://www.kieutrongkhanh.net/search/label/Servlet%26JSP , http://www.kieutrongkhanh.net/search/label/Video_Servlet, http://www.kieutrongkhanh.net/search/label/Video_JSP )

·         Nắm vững và đã thức hiện phát triển ứng dụng web với mô hình MVC2 sử dụng Maven (tham khảo tại địa chỉ http://www.kieutrongkhanh.net/2021/02/xay-dung-ung-dung-java-web-voi-maven.html )

·         Nắm vững cấu trúc của gói ứng web được deploy vào web container (war file) (tham khảo tại địa chỉ Application Developer's Guide (7.0.109) - Deployment (apache.org))

Công cụ thực hiện

·         Docker Desktop (Docker Desktop for Mac and Windows | Docker)

·         Microsoft SQL Server Management Studio (Download SQL Server Management Studio (SSMS) - SQL Server Management Studio (SSMS) | Microsoft Docs) hay DBeaver (DBeaver Community | Free Universal Database Tool) hay bất kỳ công cụ hỗ trợ kết nối dữ liệu với DBMS (tool Netbeans IDE cũng hỗ trợ trong Services/Database)

·         Netbeans từ 8.x trở lên (tham khảo tại địa chỉ Welcome to Apache NetBeans)

·         Maven đã được cấu hình trên máy thực hiện (tham khảo tại địa chỉ http://www.kieutrongkhanh.net/2021/02/xay-dung-ung-dung-java-web-voi-maven.html)

 

Docker Compose Maven Plugin

·         Đây là một plugin dành cho maven để đưa docker-compose thành các lệnh thực thi trong maven

·         Được nhúng vào chu kỳ vận hành của Maven một cách đơn giản với mục tiêu có thể ứng dụng docker-compose trong việc đưa ứng dụng đang phát triển vào trong thành phần image được build để từ đó có thể load các docker container với các dịch vụ tương ứng hỗ trợ kiểm thử ứng dụng trong quá trình build và thực thi ứng dụng trên môi trường hỗ trợ làm việc nhóm

o   Đây là một plugin có trên maven repository và chỉ cần đưa vào file cấu hình pom.xml

o   Hỗ trợ các lệnh trong maven tương tự như cú pháp lệnh của docker-compose. Chúng ta tham khảo thêm cách sử dụng tại địa chỉ docker-compose-maven-plugin/README.md at master · syncdk/docker-compose-maven-plugin (github.com)

o   Chúng ta có thể tham khảo thêm một ví dụ cơ bản tại docker-compose-maven-plugin-example (0.0.1) (daggerok.github.io)

o   Định hướng của chúng ta trong việc đưa plugin này vào trong chu trình hoạt động của Maven như sau

Ứng dụng Docker Compose Maven Plugin vào trong ứng dụng Maven đang phát triển

·         Chúng ta thực hiện mở lại ứng dụng chúng ta đã thực hiện trong bài 5 trong công cụ Netbeans. Cấu trúc File của Project đang được thể hiện trong File Explorer như sau

o   Cấu trúc thư mục nhìn bên phía project explorer

o   Chúng ta đang sử dụng lại tiếp tục nội dung cuối cùng trong bài số 5 để thực hiện bổ sung cấu hình vào tập tin pom.xml để thiết lập nhúng docker compose trong quá trình maven thực hiện

o   File pom.xml chúng ta đang có nội dung như sau

·         Để thực hiện đưa plugin của docker compose vào chu trình của maven, chúng ta chỉ cần bổ sung plugin vào file pom.xml ở dòng 42 như sau

o   Trong file cấu hình, từ dòng 43 đến 45, chúng ta đang xác định plugin docker compose plugin chúng ta sẽ sử dụng với version là 4.0.0 (version mới nhất tại thời điểm chúng tôi viết bài viết này)

o   Từ dòng 46 đến dòng 50 chúng ta thực hiện cấu hình việc thực thi hỗ trợ cho maven kích hoạt docker compose như sau

§  Dòng 47, chúng ta xác định vị chứa file yaml. Trong bài lần trước chúng ta đã đặt tên file này là docker-compose.yml và đặt trong thư mục docker ngay dưới thư mục của project. Do vậy, chúng ta xác định groovy script với ${project.basedir} để xác định chính là thư mục project và đường dẫn đến file docker chúng ta đã tạo ra trong bài 5

§  Dòng 48, chúng ta đang thiết nội đưa thêm việc build image tại thời điểm docker-compose up được maven kích hoạt

§  Dòng 49, với thiết lập removeVolumns với mong muốn khi docker-compose down được kích hoạt thì sẽ thực hiện remove tất cả các volume liên quan đến các service docker đã đươc thiết lập

o   Với việc thiết lập thực thi trong chu trình của maven từ dòng 51 đến dòng 59, chúng ta đang thực thi việc build image với lệnh docker-compose build để test việc tạo ra image sau khi project được build

o   Ở biết thiết lập này, chúng ta mới chỉ muốn test thử việc build image có thể thực hiện như thế nào. Chúng ta hoàn toàn chưa nạp service lên docker container. Nội dung này sẽ được trình bày trong phần dưới của bài viết

·         Do việc thiết lập của chúng ta đã có việc build luôn gói ứng dụng cần deploy, chúng ta sẽ loại bỏ bớt stage build trong dockerfile liên quan đến nạp image services của tomcat trong file web.Dockerfile như sau

o   Ở đây, build Context của docker sẽ đươc chọn mặc định là thư mục gốc của project cho nên cùng với việc tích hợp với maven,việc gói deploy đã được build theo life cycle của maven cho nên chúng ta chỉ cần thực hiện việc deploy ứng dụng vào tomcat  với gói war

o   Quá trình build của maven đã chúng ta cấu hình thực hiện compile và đóng gói deploy war như hình thể hiện chu trình thực hiện ở phần đầu bài và kết quả build được đặt trong thư mục target. Do vậy, từ build context chúng ta chỉ cần đến thư mục target và đưa gói war vào trong thư mục deploy của image tomcat container, cụ thể là ở thư mục webapps và đổi tên thành demo.war.

o   Quá trình cho thấy, chúng ta luôn đưa phiên bản mới nhất của dự án đang phát triển – latest vào môi trường image theo định hướng làm việc nhóm để kiểm thử

·         Chúng thực bắt đầu sử dụng maven để build ứng dụng và kích hoạt lifecycle của maven theo việc cấu hình từ file pom và thực hiện các nội dung liên quan đến kích hoạt docker-compose để build image theo thông số cấu hình service trong file yaml

o   Chúng ta thực hiện lệnh mvn clean install trên console lệnh (command prompt, terminal, …) hay sử dụng maven goal trong Netbeans

o   Quá trình thực thi bởi maven diễn ra cơ bản như sau

§  Thực hiện download docker compose maven plugin từ repository

§  Thực hiện download các plugin khác được cấu hình trong ứng dụng

§  Thực hiện compile source code

§  Thực hiện đóng gói war

§  Thực hiện build image

….

….

§  Chúng ta nhìn thấy việc thư thi qua các bước trên và đã có test image của web lẫn db

·         Sau các bước test thử thấy plugin đã sử dụng tốt, chúng ta bổ sung cấu hình trong file pom.xml để hoàn tất việc hoàn tất chu trình phát triển ứng dụng bằng cách là nạp các image build xong container để test chạy thứ

o   Chúng ta bổ sung thêm 02 nội dung liên quan thực thi là up and down tương ứng với lệnh khi chúng ta nạp image trở thành docker container và gỡ các docker container ra khỏi docker host

o   Chúng ta thực hiện chạy mvn clean install lại, quá trình sẽ giống như ở trên tuy nhiên sau bước build thì việc nạp image vào container sẽ diễn ra sau khi build image xong, maven kích hoạt docker-compose up

 

o   Bắt đầu thực hiện nạp các service từ các docker image đã được build đã có các docker container về db MySQL cũng như tomcat server

§  Docker container cho db và webserver đã được nạp. Chúng ta có thể nhìn trên docker desktop thấy container đang chạy

§  Cùng các image đã build

§  Cùng các volume được tạo trong file cấu hình dockerFile

o   Chúng ta test ứng dụng để thấy chạy khá tốt. Chúng ta có thể cấu hình bước này thành test tư động trong Maven luôn để thuận lợi cho việc deploy, kiểm thử trong qui trình phát triển phần mềm

·         Để dừng việc chu trình maven đang chạy, chúng ta nhấn stop trên output trên tool Netbeans

·         Để gỡ các docker container ra khỏi docker host chúng ta có thể dùng lệnh maven với mvc docker-compose down

o   Kết quả thực thi

§  Chúng ta nhận thấy việc docker container bị stop, remove kèm theo các volume của chúng cũng gỡ luôn theo nội dung cấu hình của removeVolume là true trong phần configure của file pom.xml (đã giải thích ở phần trên)

§  Chúng ta có thể nhìn thấy trên docker desktop

 

o   Chúng ta vừa hoàn tất việc đưa plugin docker compose kết hợp trong chu trình phát triển và kiểm thử ứng dụng

Các lưu ý trong quá trình thực hiện

·         Khi chúng ta thực hiện lệnh build với maven và có sử dụng plugin trong bài và nếu có lỗi xuất hiện như sau

o   Lỗi này phát sinh là do việc cấu hình trong file yaml sai cú pháp hay dockerfile có lỗi.

o   Ở đây, chúng tôi ví dụ gõ sai tùy tiện một dòng lệnh cú pháp file yaml như chữ alias như sau

§  Đó là nguyên nhân báo lỗi với (root) Additional property alias is not allowed

o   Tương tự như vậy với lỗi không tương thích version là do trong file yaml quí vị ghi chỉ 2 hay 3 mà không phải 2.x hay 3.x

o   Nội dung trên chỉ cần xóa bỏ alias đi là mọi việc chạy bình thường

 

Chúc mừng quí vị đã hoàn tất việc sử dụng docker compose maven plugin tích hợp vào chu trình phát triển phần mềm kết hợp docker compose để triển khai và test thử nghiệm trên môi trường làm việc chung thiết lập cho nhóm. Nội dung này giúp quí vị nhìn tổng quát life cycle và tận dụng tối ưu các công cụ hỗ trợ để đảm bảo tính hiệu quả trong công việc phát triển ứng dụng và luôn đảm bảo control được quá trình phát triển cũng như quá trình deploy với version là mới nhất

Hy vọng nội dung của bài viết này hỗ trợ quí vị trong công việc và nghiên cứu học tập.

Rất mong sự góp ý chân thành và chia sẻ của quí vị về loạt series này. Hẹn gặp quí vị ở các bài tiếp theo trong loạt series này.

Không có nhận xét nào:

Đăng nhận xét