Java 앱용 컨테이너 이미지 빌드 및 실행

완료됨

이 단원에서는 컨테이너 이미지를 빌드하고 실행합니다. 앞에서 알아보았습니다. 이미지의 실행 중인 인스턴스는 컨테이너입니다.

컨테이너 이미지 빌드

이제 Dockerfile을 성공적으로 생성했으므로 Docker에 컨테이너 이미지를 빌드하도록 지시할 수 있습니다.

비고

Docker 런타임이 Linux 컨테이너를 빌드하도록 구성되어 있는지 확인합니다. 이 구성은 우리가 사용하는 Dockerfile이 Linux 아키텍처의 JDK/JRE 컨테이너 이미지를 참조하기 때문에 중요합니다.

컨테이너 이미지를 빌드하는 데 사용하는 명령은 .입니다 docker build. 인수를 -t 사용하여 컨테이너 레이블을 지정하고 . Docker에서 Dockerfile을 찾을 수 있는 위치입니다. 다음 명령을 실행합니다.

docker build -t flightbookingsystemsample .

다음과 같은 출력이 일반적입니다.

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

다단계 빌드는 프로세스를 효율적으로 처리합니다. 특히 종속성이 없는 프로세스는 병렬로 실행됩니다. 예를 들어 이 경우 0단계에서 Tomcat을 다운로드하고 1단계에서 Maven의 설치 및 컴파일은 독립적인 프로세스입니다. 따라서 실행할 docker build때 Tomcat 프로세스와 Maven 프로세스가 동시에 수행됩니다. 그러나 최종 단계에서는 0단계와 1단계의 아티팩트가 복사되므로 이전 프로세스가 완료될 때까지 실행할 수 없습니다. 따라서 최종 단계는 이전 프로세스가 완료될 때까지 기다렸다가 완료될 수 있게 되면 진행됩니다.

또한 프로그램의 소스 코드 일부를 편집하고 다시 실행하는 docker build 경우 프로세스가 처음보다 더 빨리 완료되기를 기대할 수 있습니다. 컨테이너는 캐싱이 있는 레이어 구조를 사용하도록 설계되었으며 변경되지 않은 계층은 캐시에서 다시 사용됩니다. 예를 들어 Java, Tomcat 또는 Maven 버전에 변경 내용이 없는 경우 이전에 다운로드한 이미지가 다시 사용됩니다. 소스 코드를 수정하는 경우 소스 코드를 바꾸고 아티팩트를 바꾸기 위해 프로젝트를 다시 빌드하는 프로세스의 후반부만 변경해야 합니다. 캐시를 최대한 많이 재사용하여 효율적으로 빌드하기 위해 Docker 명령을 작성하는 방법에 주의하세요.

Docker는 상주하는 사용 가능한 이미지를 표시할 수도 있습니다. 이는 실행할 수 있는 이미지를 보는 데 유용합니다. 다음 명령을 실행합니다.

docker images

다음과 같은 출력이 일반적입니다.

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

컨테이너 이미지 실행

이제 컨테이너 이미지를 성공적으로 빌드했으므로 실행할 수 있습니다.

명령을 docker run 사용하여 컨테이너 이미지를 실행합니다. 인수는 -p ####:#### 콜론 앞의 첫 번째 포트인 localhost HTTP 트래픽을 런타임 시 컨테이너에 전달하고, 두 번째 포트는 콜론 다음으로 전달합니다. Dockerfile은 Tomcat 앱 서버가 포트 8080에서 HTTP 트래픽을 수신 대기하고 있음을 지정합니다. 그러므로 노출해야 할 컨테이너 포트가 바로 여기입니다. 마지막으로 실행할 이미지를 Docker에 알리기 위해 이미지 태그 flightbookingsystemsample 가 필요합니다. 다음 명령을 실행합니다.

docker run -p 8080:8080 flightbookingsystemsample

다음과 같은 출력이 일반적입니다.

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

브라우저 창을 열고 http://localhost:8080/AirlinesReservationSample/에서 항공편 예약을 위한 예약 시스템의 랜딩 페이지를 방문하세요. 브라우저는 다음 스크린샷과 유사하게 표시됩니다.

실행 중인 앱을 보여 주는 스크린샷

필요에 따라 tomcat-users.xml 모든 사용자(예: someuser@azure.com: password.)로 로그인할 수 있습니다.

컨테이너를 중지하려면 CLI 내에서 Ctrl+C 를 누릅니다.