Container hóa ứng dụng Java
Trong đơn vị này, bạn containerize một ứng dụng Java.
Như đã đề cập trước đó, các container chạy trực tiếp trên đầu trang của hệ điều hành máy chủ, nhân và phần cứng như quy trình hệ thống thông thường. Vùng chứa yêu cầu ít tài nguyên hệ thống hơn, dẫn đến dấu chân nhỏ hơn, chi phí thấp hơn và thời gian khởi động ứng dụng nhanh hơn. Những lợi ích này là những trường hợp sử dụng tuyệt vời để xác định tỷ lệ theo yêu cầu.
Có các bộ chứa Windows và Linux. Trong mô-đun này, bạn sử dụng thời gian chạy Docker được sử dụng rộng rãi để xây dựng hình ảnh bộ chứa Linux. Sau đó bạn triển khai hình ảnh bộ chứa Linux cho hệ điều hành máy chủ của máy tính cục bộ của bạn. Cuối cùng, bạn triển khai hình ảnh bộ chứa Linux cho Dịch vụ Azure Kubernetes.
Tổng quan về Docker
Thời gian chạy Docker được sử dụng để xây dựng, kéo, chạy và đẩy hình ảnh bộ chứa, như minh họa trong sơ đồ sau đây:
Bảng sau đây mô tả từng lệnh Docker:
| Lệnh Docker | Sự miêu tả |
|---|---|
docker build |
Xây dựng một hình ảnh bộ chứa bao gồm các hướng dẫn hoặc lớp cần thiết để Docker tạo một bộ chứa đang chạy từ một hình ảnh. Kết quả của lệnh này là một hình ảnh. |
docker pull |
Vùng chứa được khởi tạo từ hình ảnh, được kéo từ các cơ quan đăng ký, chẳng hạn như Azure Container Registry. Sổ đăng ký này là nơi Azure Kubernetes Service kéo từ đó. Kết quả của lệnh này là một mạng kéo hình ảnh, xảy ra trong Azure. Hoặc bạn có thể kéo hình ảnh cục bộ. Tùy chọn này rất phổ biến khi xây dựng hình ảnh yêu cầu quan hệ phụ thuộc hoặc tầng mà ứng dụng của bạn có thể cần, chẳng hạn như máy chủ ứng dụng. |
docker run |
Một thể hiện đang chạy của một hình ảnh là một bộ chứa và lệnh này thực thi tất cả các tầng cần thiết để chạy và tương tác với ứng dụng bộ chứa đang chạy. Kết quả của lệnh này là một quá trình ứng dụng đang chạy trên hệ điều hành máy chủ. |
docker push |
Azure Container Registry lưu trữ hình ảnh để chúng sẵn dùng và đóng mạng cho việc triển khai và mở rộng Azure. |
Sao chép ứng dụng Java
Trước tiên, sao chép Hệ thống Đặt chỗ Chuyến bay cho kho lưu trữ Đặt chỗ Hãng hàng không và điều hướng đến thư mục dự án ứng dụng web của Hãng hàng không.
Ghi
Nếu quá trình tạo Azure Kubernetes Service hoàn tất trong tab CLI của bạn, hãy sử dụng tab đó. Nếu nó vẫn đang chạy, hãy mở một tab mới và điều hướng đến vị trí mà bạn muốn sao chép Hệ thống Đặt chỗ Chuyến bay cho Đặt chỗ Hãng hàng không.
Chạy các lệnh sau:
git clone https://github.com/Azure-Samples/containerize-and-deploy-Java-app-to-Azure.git
cd containerize-and-deploy-Java-app-to-Azure/Project/Airlines
Hoặc, nếu bạn đã cài đặt Java và Maven, bạn có thể chạy lệnh sau trong bảng điều khiển đầu cuối của mình để có được trải nghiệm xây dựng ứng dụng mà không cần Docker. Nếu bạn chưa cài đặt Java và Maven, bạn có thể tiếp tục đến phần tiếp theo một cách an toàn, Tạo tệp Docker. Trong phần đó, bạn sử dụng Docker để kéo Java và Maven xuống để thực thi các bản dựng thay mặt bạn.
mvn clean package
Ghi
Chúng tôi đã sử mvn clean package dụng lệnh này để minh họa cho những thách thức hoạt động khi không sử dụng các bản dựng docker multistage, mà chúng tôi đề cập tới tiếp theo. Một lần nữa, bước này là tùy chọn. Dù bằng cách nào, bạn cũng có thể tiếp tục một cách an toàn mà không cần thực hiện lệnh Maven.
Nếu quá trình này thành công, Maven đã xây dựng thành công Hệ thống đặt chỗ chuyến bay cho máy bay đặt chỗ web lưu trữ artifact AirlinesReservationSample-0.0.1-SNAPSHOT.war, như minh họa trong đầu ra sau đây:
[INFO] Building war: $PROJECT_PATH/containerize-and-deploy-Java-app-to-Azure/Project/Airlines/target/AirlinesReservationSample-0.0.1-SNAPSHOT.war
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11.776 s
[INFO] Finished at: 2024-11-15T09:33:26+09:00
[INFO] ------------------------------------------------------------------------
Hãy tưởng tượng rằng bạn là một nhà phát triển Java và bạn chỉ cần xây dựng AirlinesReservationSample-0.0.1-SNAPSHOT.war. Bước tiếp theo của bạn có thể là làm việc với các kỹ sư vận hành để triển khai thành phần lạ này cho máy chủ tại chỗ hoặc máy ảo. Để ứng dụng khởi động và chạy thành công, các máy chủ và máy ảo phải có sẵn và được cấu hình với các quan hệ phụ thuộc bắt buộc. Quá trình này rất khó khăn và tốn thời gian, đặc biệt là theo yêu cầu khi tải gia tăng đang nhấn ứng dụng của bạn. Với container, những thách thức này được giảm bớt.
Xây dựng Dockerfile
Bây giờ bạn đã sẵn sàng để xây dựng một Dockerfile. Dockerfile là một tài liệu văn bản có chứa tất cả các lệnh mà người dùng sẽ thực hiện trên dòng lệnh để tập hợp một hình ảnh bộ chứa. Mỗi hình ảnh là một lớp có thể được lưu vào bộ đệm ẩn để đạt hiệu quả. Các lớp xây dựng trên đầu trang của nhau.
Ví dụ, Hệ thống Đặt chỗ Chuyến bay cho Đặt chỗ Hãng hàng không cần phải triển khai và chạy bên trong một máy chủ ứng dụng. Máy chủ ứng dụng không được đóng gói bên trong AirlinesReservationSample-0.0.1-SNAPSHOT.war. Đó là sự phụ thuộc bên ngoài cần thiết cho AirlinesReservationSample-0.0.1-SNAPSHOT.war để chạy, lắng nghe và xử lý các yêu cầu HTTP, quản lý phiên người dùng và tạo điều kiện cho việc đặt chuyến bay. Nếu bạn đã sử dụng triển khai truyền thống, không chứa, kỹ sư hoạt động sẽ cài đặt và cấu hình một máy chủ ứng dụng trên một số máy chủ vật lý hoặc máy ảo trước khi triển khai AirlinesReservationSample-0.0.1-SNAPSHOT.war cho nó. Các kỹ sư vận hành này cũng sẽ cần phải đảm bảo rằng JDK đang được sử dụng trên máy của bạn - mvn clean package đó là những gì được sử dụng để biên dịch tệp WAR - trong thực tế tương ứng với cùng một JRE đang được sử dụng bởi máy chủ ứng dụng. Việc quản lý các quan hệ phụ thuộc này rất khó khăn và tốn thời gian.
Với Dockerfile, bạn có thể viết các hướng dẫn hoặc lớp cần thiết để tự động thực hiện mục tiêu này, bằng cách phân lớp trong các bước cần thiết để đảm bảo rằng Hệ thống Đặt chỗ Chuyến bay cho Hãng hàng không có tất cả các phụ thuộc cần thiết để triển khai thời gian chạy bộ chứa Docker. Giải pháp này hấp dẫn khi bạn làm việc với quy mô theo yêu cầu tại các khoảng thời gian không có kế hoạch. Mỗi lớp sử dụng bộ đệm ẩn Docker, chứa trạng thái của hình ảnh bộ chứa tại mỗi mốc hướng dẫn, tối ưu hóa thời gian tính toán và sử dụng lại. Nếu một tầng không thay đổi, các tầng được lưu trong bộ đệm ẩn sẽ được sử dụng. Các trường hợp sử dụng phổ biến đối với lớp được lưu trong bộ đệm ẩn là thời gian chạy Java, máy chủ ứng dụng và các phụ thuộc khác cho Hệ thống Đặt chỗ Chuyến bay cho ứng dụng Web Đặt chỗ Máy bay. Nếu và khi một phiên bản thay đổi trên tầng đã lưu vào bộ đệm ẩn trước đó, một mục nhập được lưu vào bộ đệm ẩn mới sẽ được tạo.
Sơ đồ sau đây mô tả các tầng của ảnh bộ chứa. Khi các lệnh trong Dockerfile được thực thi, các lớp được tạo ra. Lớp trên cùng là hệ thống đặt chỗ chuyến bay đọc/ghi cho lớp ứng dụng web Đặt chỗ máy bay. Tầng đó được xây dựng trên đầu các lớp chỉ đọc trước đó.
Docker có khái niệm về các bản dựng nhiều tầng, một tính năng cho phép bạn tạo một hình ảnh bộ chứa nhỏ hơn với bộ đệm ẩn tốt hơn và dấu chân bảo mật nhỏ hơn, cho phép tăng tối ưu hóa và bảo trì Dockerfile theo thời gian. Ví dụ: bạn có thể phân tách giai đoạn xây dựng bộ chứa để biên dịch và xây dựng ứng dụng từ giai đoạn chạy ứng dụng. Tính năng này cho phép bạn sao chép chỉ các thành phần lạ được tạo trong quá trình xây dựng vào hình ảnh bộ chứa sản xuất, làm giảm dấu chân. Vì hình ảnh bộ chứa được lưu vào bộ đệm ẩn, nếu không có thay đổi, có thể sử dụng lại ảnh đã lưu trong bộ đệm ẩn, giảm chi phí và thời gian tải xuống từ mạng.
Các dịch vụ tiếp xúc trong môi trường sản xuất phải được quản lý thận trọng nhằm đảm bảo an ninh. Vì vậy, môi trường sản xuất sử dụng và vận hành một hình ảnh container an toàn. Ví dụ này sử dụng hình CBL-Mariner ảnh do Microsoft cung cấp.
CBL-Mariner Linux là một hệ điều hành nhẹ, chỉ chứa các gói cần thiết cho môi trường đám mây. Bạn có thể tùy chỉnh thông qua các gói và công cụ tùy chỉnh để phù hợp với yêu cầu của ứng dụng. CBL-Mariner qua các kiểm tra xác thực Azure và tương thích với các tác nhân Azure. Microsoft xây dựng và kiểm tra để CBL-Mariner các trường hợp sử dụng khác nhau, từ các dịch vụ Azure đến hỗ trợ cơ sở hạ tầng IoT. Đây là bản phân phối Linux được đề xuất nội bộ để sử dụng với các dịch vụ đám mây của Microsoft và các sản phẩm liên quan.
Ghi
Microsoft cung cấp hình ảnh vùng chứa đi kèm với OpenJDK, bao gồm Ubuntu, CBL-Marinervà hình distroless ảnh. Hình distroless ảnh có kích thước hình ảnh nhỏ nhất, nhưng việc chạy Tomcat trên đó là một thách thức. Để có được thiết kế nhẹ, distroless hình ảnh loại bỏ nhiều lệnh và công cụ, bao gồm vỏ, có nghĩa là bạn không thể gọi cho catalina.sh bắt đầu Tomcat. Hình distroless ảnh phù hợp để chạy JAR thực thi, chẳng hạn như được sử dụng với Spring Boot hoặc Quarkus.
Trong ví dụ sau đây, cùng một phiên bản Microsoft Build của OpenJDK được sử dụng ở cả giai đoạn bản dựng và giai đoạn cuối cùng. Phương pháp này đảm bảo rằng bạn xây dựng mã nguồn với cùng một phiên bản JDK mà Tomcat triển khai dịch vụ sử dụng, giúp tránh hành vi không mong muốn do phiên bản không khớp.
Hình ảnh sau đây mô tả bản dựng nhiều giai đoạn và những gì đang diễn ra trong mỗi giai đoạn dựa trên các lệnh được chỉ định trong Dockerfile:
Trong giai đoạn 0, Tomcat được tải xuống và trích xuất vào một thư mục được xác định bởi một biến môi trường trên hình ảnh Ubuntu. Biến TOMCAT_VERSION xác định phiên bản Tomcat cần tải xuống. Nếu một phiên bản mới của Tomcat được phát hành, bạn nên cập nhật số phiên bản, vì hình ảnh mới chỉ được tải khi số phiên bản thay đổi. Nếu không, hình ảnh được lưu trong bộ đệm ẩn sẽ được sử dụng. Tomcat đã tải xuống được sao chép vào môi trường giai đoạn cuối cùng để sử dụng.
Trong giai đoạn 1, Maven được cài đặt trên một hình ảnh Ubuntu, và mã nguồn đã tạo và các tập tin cấu hình được sao chép lại trước khi xây dựng dự án Maven. Mỗi lớp được lưu vào bộ đệm ẩn, vì vậy hình ảnh hệ điều hành và các lớp hình ảnh Maven sử dụng lại bộ nhớ cache. Nếu tệp cấu hình, tệp mã nguồn hoặc thư mục web được cập nhật, các lớp từ các thay đổi trở đi sẽ được xây dựng lại. Nếu bản dựng hoàn tất thành công mà không có lỗi trong quá trình biên dịch, một thành phần lạ có tên là AirlinesReservationSample-0.0.1-SNAPSHOT.war sẽ được tạo dưới thư mục đích. Giả liệu này được sao chép vào môi trường giai đoạn cuối cùng để sử dụng.
Trong giai đoạn cuối cùng, CBL-Mariner hình ảnh an toàn do Microsoft cung cấp sẽ được sử dụng để sao chép các hiện vật bản dựng Tomcat và Java từ giai đoạn 0 và giai đoạn 1 tương ứng. Người dùng có tên app sở hữu tất cả các tệp được sử dụng trong dự án và app ứng dụng cũng chạy như người dùng thay vì có root đặc quyền. Thiết lập này đảm bảo rằng hình ảnh bộ chứa có thể được vận hành an toàn mà không cần cấp quyền không cần thiết. Cuối cùng, số cổng 8080 được hiển thị và tập lệnh catalina.sh được thực thi để bắt đầu Tomcat. Khi thao tác này chạy trên Máy tính Docker cục bộ, bạn có thể truy cập ứng dụng này qua URL http://localhost:8080/AirlinesReservationSample.
Trong thư mục gốc của dự án, bộ chứa và triển khai Java-app-to-Azure/Project/Airlines, hãy sử dụng lệnh sau đây để tạo một tệp có tên là Dockerfile:
vi Dockerfile
Thêm nội dung sau vào Dockerfile của bạn, sau đó lưu và thoát. Để lưu và thoát, nhấn ESC, nhập :wq!, rồi nhấn Enter.
############################################
# Tomcat Intall stage
############################################
FROM mcr.microsoft.com/openjdk/jdk:17-ubuntu AS tomcat
ENV CATALINA_HOME=/usr/local/tomcat
# Configure Tomcat Version (Be sure to use the latest version)
ENV TOMCAT_VERSION=10.1.33
# Install Tomcat and required packages
RUN apt-get update ; \
apt-get install -y curl ; \
curl -O https://downloads.apache.org/tomcat/tomcat-10/v${TOMCAT_VERSION}/bin/apache-tomcat-${TOMCAT_VERSION}.tar.gz ; \
tar xzf apache-tomcat-${TOMCAT_VERSION}.tar.gz ; \
mv apache-tomcat-${TOMCAT_VERSION} ${CATALINA_HOME} ; \
rm apache-tomcat-${TOMCAT_VERSION}.tar.gz && \
apt-get remove --purge -y curl && \
apt-get autoremove -y && \
apt-get clean
############################################
# Build stage (Compiles with Java 17)
############################################
FROM mcr.microsoft.com/openjdk/jdk:17-ubuntu AS build
WORKDIR /build
# Install Maven
RUN apt-get update && apt-get install -y maven && mvn --version
# Copy source code
COPY pom.xml .
COPY src ./src
COPY web ./web
# Build the project
RUN mvn clean package
############################################
# Package final stage
############################################
FROM mcr.microsoft.com/openjdk/jdk:17-mariner
# Configure the location of the Tomcat installation
ENV CATALINA_HOME=/usr/local/tomcat
# Configure the path to the Tomcat binaries
ENV PATH=$CATALINA_HOME/bin:$PATH
# This is the user that runs the Tomcat process
USER app
# Copy the Tomcat installation from the Tomcat stage
COPY --chown=app:app --from=tomcat ${CATALINA_HOME} ${CATALINA_HOME}
# Copy the Tomcat configuration files
COPY --chown=app:app tomcat-users.xml ${CATALINA_HOME}/conf
# Copy the compiled WAR file from the build stage
COPY --chown=app:app --from=build /build/target/*.war ${CATALINA_HOME}/webapps/AirlinesReservationSample.war
# Expose the default Tomcat port
EXPOSE 8080
# Start Tomcat
CMD ["catalina.sh", "run"]
Ghi
Bạn có thể tùy chọn sử dụng tệp Dockerfile_Solution trong gốc của dự án, chứa nội dung bạn cần.
Dockerfile được chia thành ba giai đoạn, được mô tả trong các bảng sau đây:
Giai đoạn cài đặt Tomcat:
Lệnh Docker Sự miêu tả FROMFROM mcr.microsoft.com/openjdk/jdk:17-ubuntu AS tomcatđặt hình ảnh cơ sở cho Bản dựng OpenJDK 17 của Microsoft trên Ubuntu và đặt tên cho giai đoạn nàytomcat. Đây là nơi Tomcat được cài đặt.ENVENV CATALINA_HOME=/usr/local/tomcatđặt biến môi trường cho thư mục cài đặt Tomcat.ENVENV TOMCAT_VERSION=10.1.33đặt phiên bản Tomcat cần cài đặt. Thao tác này sẽ được cập nhật lên phiên bản mới nhất nếu cần.RUNRUNLệnh này sẽ cập nhật danh sách gói,curlcài đặt , tải xuống phiên bản Tomcat đã xác định, trích xuất, di chuyển nó vào thư mục được chỉ định và dọn dẹp các tệp và gói không cần thiết. Điều này đảm bảo rằng ảnh vẫn nhẹ.Giai đoạn Build, được biên soạn bằng Java 17:
Lệnh Docker Sự miêu tả FROMFROM mcr.microsoft.com/openjdk/jdk:17-ubuntu AS buildđặt hình ảnh cơ sở cho Bản dựng OpenJDK 17 của Microsoft trên Ubuntu và đặt tên cho giai đoạn nàybuild. Giai đoạn này được dùng để biên soạn ứng dụng Java.WORKDIRWORKDIR /buildđặt thư mục làm việc bên trong bộ/buildchứa thành , nơi mã nguồn được sao chép và biên dịch.RUNRUN apt-get update && apt-get install -y maven && mvn --versioncài đặt Maven, một công cụ tự động hóa bản dựng được sử dụng cho các dự án Java và xác minh việc cài đặt.COPYCOPY pom.xml .sao chép tệp cấu hình Maven vào thư mục làm việc. Tệp này rất cần thiết để xây dựng dự án.COPYCOPY src ./srcsao chép thư mục mã nguồn vào bộ chứa. Đây là nơi có mã ứng dụng Java.COPYCOPY web ./websao chép thư mục tài nguyên web vào bộ chứa. Điều này bao gồm các tài nguyên ứng dụng web cần thiết cho bản dựng.RUNRUN mvn clean packagethực thi quá trình xây dựng Maven, mà biên dịch các ứng dụng Java và gói nó vào một tập tin WAR.Giai đoạn cuối cùng của Gói:
Lệnh Docker Sự miêu tả FROMFROM mcr.microsoft.com/openjdk/jdk:17-marinerđặt hình ảnh cơ sở thành Bản dựng Của Microsoft của OpenJDK 17CBL-Marinertrên , được sử dụng để triển khai ứng dụng cuối cùng.ENVENV CATALINA_HOME=/usr/local/tomcatđặt biến môi trường cho thư mục cài đặt Tomcat, tương tự như giai đoạn cài đặt.ENVENV PATH=$CATALINA_HOME/bin:$PATHthêm thư mục bin Tomcat vào hệ thốngPATH, cho phép chạy các lệnh Tomcat dễ dàng.USERUSER appxác định người dùng chạy quy trình Tomcat, tăng cường bảo mật bằng cách không chạy với tư cách người dùng gốc.COPYCOPY --chown=app:app --from=tomcat ${CATALINA_HOME} ${CATALINA_HOME}sao chép cài đặt Tomcat từ giai đoạntomcat, đặt quyền sở hữu cho ngườiappdùng.COPYCOPY --chown=app:app tomcat-users.xml ${CATALINA_HOME}/confsao chép tệp cấu hình người dùng Tomcat vào bộ chứa, đặt quyền sở hữu cho ngườiappdùng.COPYCOPY --chown=app:app --from=build /build/target/*.war ${CATALINA_HOME}/webapps/AirlinesReservationSample.warsao chép tệp WAR được biên dịch từ giaibuildđoạn vào thư mục Tomcat webapps , đặt quyền sở hữu cho ngườiappdùng.EXPOSEEXPOSE 8080hiển thị cổng 8080, cổng mặc định cho Tomcat, cho phép truy cập bên ngoài vào ứng dụng.CMDCMD ["catalina.sh", "run"]xác định lệnh để bắt đầu Tomcat khi bộ chứa đang chạy.
Để biết thêm thông tin về việc xây dựng Dockerfile, hãy xem tham khảo Dockerfile.