Xây dựng và chạy hình ảnh vùng chứa cho ứng dụng Java

Đã hoàn thành

Trong đơn vị này, bạn xây dựng và chạy hình ảnh bộ chứa. Như bạn đã học trước đó, một trường hợp đang chạy của một hình ảnh là một bộ chứa.

Xây dựng ảnh bộ chứa

Bây giờ bạn đã xây dựng thành công Dockerfile, bạn có thể hướng dẫn Docker xây dựng hình ảnh bộ chứa cho bạn.

Ghi

Đảm bảo thời gian chạy Docker của bạn được đặt cấu hình để xây dựng các bộ chứa Linux. Cấu hình này rất quan trọng vì Dockerfile chúng tôi đang sử dụng hình ảnh bộ chứa tham chiếu (JDK/JRE) cho kiến trúc Linux.

Lệnh bạn sử dụng để xây dựng hình ảnh bộ chứa là docker build. Bạn sử dụng đối -t số để xác định nhãn bộ chứa và . là vị trí để Docker tìm Dockerfile. Chạy lệnh sau:

docker build -t flightbookingsystemsample .

Đầu ra sau đây là điển hình:

docker build -t flightbookingsystemsample .
[+] Building 45.2s (18/18) FINISHED     docker:desktop-linux
 => [internal] load build definition from Dockerfile    0.0s
 => => transferring dockerfile: 2.07kB                  0.0s
 => [internal] load metadata for mcr.microsoft.com/openjdk/jdk:17-ubuntu    0.7s
 => [internal] load metadata for mcr.microsoft.com/openjdk/jdk:17-mariner   0.8s
 => [internal] load .dockerignore                       0.0s
 => => transferring context: 2B                         0.0s
 => [internal] load build context                       0.4s
 => => transferring context: 9.89MB                     0.4s
 => [stage-2 1/4] FROM mcr.microsoft.com/openjdk/jdk:17-mariner@sha256:79****************************************f1ee692d5b8c36f0824510    15.9s
 => => resolve mcr.microsoft.com/openjdk/jdk:17-mariner@sha256:796b833b91****************************************5b8c36f0824510             0.0s

...

 => => extracting sha256:8f818432a4****************************************1791ae8c3b79ca                 2.4s
 => => extracting sha256:1820580505****************************************087e3a0df74b60                 7.1s
 => [build 1/7] FROM mcr.microsoft.com/openjdk/jdk:17-ubuntu@sha256:7982bc2eb79838d70bcc025371c514b7f7fde75f9981906c65eff04e9170627e       15.5s
 => => resolve mcr.microsoft.com/openjdk/jdk:17-ubuntu@sha256:7982bc2eb79838d70bcc025371c514b7f7fde75f9981906c65eff04e9170627e              0.0s

...

 => => extracting sha256:6414378b64****************************************b23a54cb3684ac                 2.4s
 => => extracting sha256:8debc97485****************************************80f38d9f1cb399                 6.5s
 => [build 2/7] WORKDIR /build                          0.4s
 => [tomcat 2/2] RUN apt-get update ;     apt-get install -y curl ;     curl -O https://downloads.apache.org/tomcat/tomcat-10/v10.1.33/bin/apache-tomcat-10.1.33.tar.gz ;     tar xzf apache-tomcat-10.1.33.tar.  23.4s
 => [build 3/7] RUN apt-get update && apt-get install -y maven && mvn --version                          14.5s
 => [build 4/7] COPY pom.xml .                          0.0s
 => [build 5/7] COPY src ./src                          0.0s
 => [build 6/7] COPY web ./web                          0.1s
 => [build 7/7] RUN mvn clean package                  13.4s
 => [stage-2 2/4] COPY --chown=app:app --from=tomcat /usr/local/tomcat /usr/local/tomcat                  0.2s
 => [stage-2 3/4] COPY --chown=app:app tomcat-users.xml /usr/local/tomcat/conf                            0.0s
 => [stage-2 4/4] COPY --chown=app:app --from=build /build/target/*.war /usr/local/tomcat/webapps/AirlinesReservationSample.war             0.1s
 => exporting to image                                  0.2s
 => => exporting layers                                 0.1s
 => => writing image sha256:43d4ab3ab0****************************************c4807bce5af7b4              0.0s
 => => naming to docker.io/library/flightbookingsystemsample

Các bản dựng đa giai đoạn xử lý các quy trình một cách hiệu quả. Cụ thể là, các quy trình không có quan hệ phụ thuộc được thực thi song song. Ví dụ, trong trường hợp này, việc tải xuống Tomcat trong giai đoạn 0 và việc cài đặt và biên soạn Maven ở giai đoạn 1 là các quy trình độc lập. Do đó, khi bạn docker buildthực hiện , quá trình Tomcat và quá trình Maven được thực hiện đồng thời. Tuy nhiên, giai đoạn cuối cùng sao chép các hiện vật từ giai đoạn 0 và giai đoạn 1, vì vậy nó không thể được thực hiện cho đến khi các quy trình trước đó được hoàn tất. Vì vậy, giai đoạn cuối cùng chờ đợi cho các quá trình trước đó để kết thúc và tiến hành khi nó trở nên có thể làm như vậy.

Ngoài ra, nếu bạn docker build chỉnh sửa một phần mã nguồn của chương trình và chạy lại, bạn có thể mong đợi quá trình hoàn tất nhanh hơn lần đầu tiên. Bộ chứa được thiết kế để sử dụng cấu trúc tầng với bộ đệm ẩn và các tầng không thay đổi được tái sử dụng từ bộ đệm ẩn. Ví dụ: nếu không có thay đổi nào trong các phiên bản java, Tomcat hoặc Maven, các hình ảnh đã tải xuống trước đó sẽ được tái sử dụng. Khi sửa đổi được thực hiện cho mã nguồn, chỉ phần sau của quá trình, trong đó liên quan đến việc thay thế mã nguồn và xây dựng lại các dự án để thay thế các đồ tạo tác, cần phải được thay đổi. Chú ý đến cách bạn viết lệnh Docker để xây dựng hiệu quả bằng cách sử dụng lại bộ đệm ẩn càng nhiều càng tốt.

Docker cũng có thể hiển thị các hình ảnh sẵn dùng, hữu ích cho việc xem những gì có sẵn để chạy. Chạy lệnh sau:

docker images

Đầu ra sau đây là điển hình:

docker images
REPOSITORY                  TAG      IMAGE ID     CREATED        SIZE
flightbookingsystemsample   latest   43d4ab3ab045 30 minutes ago 475MB

Chạy ảnh bộ chứa

Bây giờ bạn đã xây dựng thành công một hình ảnh bộ chứa, bạn có thể chạy nó.

Bạn sử dụng lệnh docker run để chạy ảnh bộ chứa. Đối -p ####:#### số chuyển tiếp lưu lượng truy cập HTTP localhost - cổng đầu tiên, trước dấu hai chấm - đến bộ chứa lúc chạy - cổng thứ hai, sau dấu hai chấm. Dockerfile chỉ định rằng máy chủ ứng dụng Tomcat đang lắng nghe lưu lượng truy cập HTTP trên cổng 8080. Vì vậy, đó là cảng container mà bạn cần phải tiếp xúc. Cuối cùng, bạn cần thẻ hình ảnh để flightbookingsystemsample cho Docker biết nên chạy hình ảnh nào. Chạy lệnh sau:

docker run -p 8080:8080 flightbookingsystemsample

Đầu ra sau đây là điển hình:

docker run -p 8080:8080 flightbookingsystemsample
15-Nov-2024 12:11:12.229 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name:   Apache Tomcat/10.1.33
15-Nov-2024 12:11:12.236 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Nov 7 2024 22:28:55 UTC
15-Nov-2024 12:11:12.236 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 10.1.33.0
15-Nov-2024 12:11:12.237 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
15-Nov-2024 12:11:12.237 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            6.10.11-linuxkit
15-Nov-2024 12:11:12.237 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
15-Nov-2024 12:11:12.238 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /usr/lib/jvm/msopenjdk-17
15-Nov-2024 12:11:12.238 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           17.0.13+11-LTS
15-Nov-2024 12:11:12.238 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Microsoft
15-Nov-2024 12:11:12.238 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         /usr/local/tomcat
15-Nov-2024 12:11:12.239 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         /usr/local/tomcat
15-Nov-2024 12:11:12.262 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties
15-Nov-2024 12:11:12.262 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
15-Nov-2024 12:11:12.263 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
15-Nov-2024 12:11:12.264 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
15-Nov-2024 12:11:12.264 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dorg.apache.catalina.security.SecurityListener.UMASK=0027
15-Nov-2024 12:11:12.265 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.lang=ALL-UNNAMED
15-Nov-2024 12:11:12.266 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.io=ALL-UNNAMED
15-Nov-2024 12:11:12.267 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util=ALL-UNNAMED
15-Nov-2024 12:11:12.267 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util.concurrent=ALL-UNNAMED
15-Nov-2024 12:11:12.268 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
15-Nov-2024 12:11:12.268 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/usr/local/tomcat
15-Nov-2024 12:11:12.268 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/usr/local/tomcat
15-Nov-2024 12:11:12.269 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp
15-Nov-2024 12:11:12.271 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent The Apache Tomcat Native library which allows using OpenSSL was not found on the java.library.path: [/usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib]
15-Nov-2024 12:11:12.699 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
15-Nov-2024 12:11:12.760 INFO [main] org.apache.catalina.startup.Catalina.load Server initialization in [845] milliseconds
15-Nov-2024 12:11:12.855 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
15-Nov-2024 12:11:12.855 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/10.1.33]
15-Nov-2024 12:11:12.891 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/usr/local/tomcat/webapps/AirlinesReservationSample.war]
15-Nov-2024 12:11:15.150 INFO [main] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
15-Nov-2024 12:11:17.112 INFO [main] com.sun.xml.ws.server.MonitorBase.createRoot Metro monitoring rootname successfully set to: com.sun.metro:pp=/,type=WSEndpoint,name=/AirlinesReservationSample-PriceAndSeats-PriceAndSeatsPort
15-Nov-2024 12:11:17.400 INFO [main] com.sun.xml.ws.transport.http.servlet.WSServletDelegate.<init> WSSERVLET14: XML-WS servlet initializing
WARNING:Error in the metadata of the table SEATS: table's row count in the metadata is 5 but 6 records have been found and loaded by UCanAccess. All will work fine, but it's better to repair your database.
15-Nov-2024 12:11:18.281 INFO [main] com.sun.xml.ws.transport.http.servlet.WSServletContextListener.contextInitialized WSSERVLET12: XML-WS context listener initializing
15-Nov-2024 12:11:18.282 INFO [main] com.sun.xml.ws.transport.http.servlet.WSServletContextListener.contextInitialized WSSERVLET12: XML-WS context listener initializing
15-Nov-2024 12:11:18.320 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/usr/local/tomcat/webapps/AirlinesReservationSample.war] has finished in [5,428] ms
15-Nov-2024 12:11:18.322 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/ROOT]
15-Nov-2024 12:11:18.363 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/ROOT] has finished in [40] ms
15-Nov-2024 12:11:18.363 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/docs]
15-Nov-2024 12:11:18.404 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/docs] has finished in [41] ms
15-Nov-2024 12:11:18.406 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/examples]
15-Nov-2024 12:11:18.716 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/examples] has finished in [310] ms
15-Nov-2024 12:11:18.717 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/manager]
15-Nov-2024 12:11:18.753 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/manager] has finished in [37] ms
15-Nov-2024 12:11:18.754 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/host-manager]
15-Nov-2024 12:11:18.795 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/host-manager] has finished in [40] ms
15-Nov-2024 12:11:18.802 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
15-Nov-2024 12:11:18.840 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [6079] milliseconds

Mở cửa sổ trình duyệt và truy cập trang đích Đặt chỗ Chuyến bay cho Hãng hàng không tại http://localhost:8080/AirlinesReservationSample/. Trình duyệt của bạn sẽ trông giống như ảnh chụp màn hình sau đây:

Ảnh chụp màn hình hiển thị ứng dụng đang chạy.

Bạn có thể tùy chọn đăng nhập với bất kỳ người dùngtomcat-users.xml nào - ví dụ: someuser@azure.com: password.

Để dừng bộ chứa, nhấn CTRL+C bên trong CLI.