Java uygulamasını kapsayıcıya alma

Tamamlandı

Bu ünitede bir Java uygulamasını kapsayıcıya alırsınız.

Daha önce belirtildiği gibi kapsayıcılar, normal sistem işlemleri olarak doğrudan konak işletim sistemi, çekirdek ve donanım üzerinde çalışır. Kapsayıcılar daha az sistem kaynağı gerektirir ve bu da daha küçük bir ayak izi, daha az ek yük ve daha hızlı uygulama başlatma süreleri sağlar. Bu avantajlar, isteğe bağlı ölçeklendirme için harika kullanım örnekleridir.

Windows kapsayıcıları ve Linux kapsayıcıları vardır. Bu modülde, linux kapsayıcı görüntüsü oluşturmak için yaygın olarak kullanılan Docker çalışma zamanını kullanacaksınız. Ardından Linux kapsayıcı görüntüsünü yerel makinenizin konak işletim sistemine dağıtırsınız. Son olarak, Linux kapsayıcı görüntüsünü Azure Kubernetes Service'e dağıtacaksınız.

Docker'a genel bakış

Docker çalışma zamanı, aşağıdaki diyagramda gösterildiği gibi kapsayıcı görüntülerini derlemek, çekmek, çalıştırmak ve göndermek için kullanılır:

Docker derleme, çekme, gönderme ve çalıştırma komutlarını gösteren ve istemciyi, Docker hostu ve registry’yi bağlayan diyagram.

Aşağıdaki tabloda her Docker komutu açıklanmaktadır:

Docker komutu Açıklama
docker build Docker'ın bir görüntüden çalışan bir kapsayıcı oluşturması için gereken yönergelerden veya katmanlardan oluşan bir kapsayıcı görüntüsü oluşturur. Bu komutun sonucu bir görüntüdür.
docker pull Bir imajı, istemci tarafından seçilen Docker daemon'un imaj deposuna registry'den indirir. Mevcut görüntü katmanları yeniden kullanılabilir. Bu modülde, yerel Docker ortamınız geliştirme sırasında registry’lerden görüntüler kullanır; daha sonra AKS düğümleri uygulama görüntüsünü dağıtım için Azure Container Registry'den çeker.
docker run Görüntüden yeni bir kapsayıcı oluşturur ve başlatır. Kapsayıcı, komut satırı geçersiz kılmalarına tabi olarak yapılandırılmış başlangıç işlemini çalıştırır. Görüntü katmanları kapsayıcının dosya sistemini sağlar; Dockerfile derleme yönergeleri kapsayıcı başlatıldığında yeniden yürütülmez.
docker push Azure Container Registry, görüntüleri hazır olacak şekilde depolar ve Azure dağıtımları ve ölçeklendirmesi için ağı kapatır.

Java uygulamasını kopyalama

İlk olarak, Havayolu Rezervasyonları deposu için Uçuş Rezervasyon Sistemi'ni kopyalayın ve Airlines web uygulaması proje klasörüne gidin.

Not

CLI sekmenizde Azure Kubernetes Service oluşturma işlemi tamamlandıysa bu sekmeyi kullanın. Hala çalışıyorsa yeni bir sekme açın ve Havayolu Rezervasyonları için Uçuş Rezervasyon Sistemi'ni kopyalamayı tercih ettiğiniz konuma gidin.

Aşağıdaki komutları çalıştırın:

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

İsteğe bağlı olarak, Java ve Maven yüklüyse, uygulamayı Docker olmadan oluşturma deneyimine ilişkin bir bilgi edinmek için terminal konsolunuzda aşağıdaki komutu çalıştırabilirsiniz. Java ve Maven yüklü değilse docker dosyası oluşturma adlı sonraki bölüme güvenle geçebilirsiniz. Bu bölümde, derlemeleri sizin yerinize yürütmek üzere Java ve Maven'ı indirmek için Docker'ı kullanacaksınız.

mvn clean package

Not

Docker çok aşamalı derlemelerini kullanmamanın operasyonel zorluklarını göstermek için mvn clean package komutunu kullandık; bunları daha sonra ele alacağız. Bu adım isteğe bağlıdır. Her iki durumda da Maven komutunu yürütmeden güvenle devam edebilirsiniz.

İşlem başarılı olduysa Maven, aşağıdaki geçmiş çıktıda gösterildiği gibi Havayolu Rezervasyonları web uygulaması arşivi için Uçuş Rezervasyon Sistemi'ni başarıyla oluşturdu AirlinesReservationSample-0.0.1-SNAPSHOT.war. Derleme zaman damganız ve süreniz farklılık gösterebilir:

[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] ------------------------------------------------------------------------

Java geliştiricisi olduğunuzu ve AirlinesReservationSample-0.0.1-SNAPSHOT.war'u yeni oluşturduğunuzu düşünün. Sonraki adımınız büyük olasılıkla işlem mühendisleriyle birlikte çalışarak bu yapıtı şirket içi sunucuya veya sanal makineye dağıttırmaktır. Uygulamanın başarıyla başlatılıp çalışması için sunucuların ve sanal makinelerin kullanılabilir olması ve gerekli bağımlılıklarla yapılandırılması gerekir. Bu işlem, özellikle artan yük uygulamanıza isabet ettiğinde isteğe bağlı olarak zorlayıcı ve zaman alıcı bir işlemdir. Kapsayıcılarda bu zorluklar ortadan kaldırıldı.

Dockerfile oluşturma

Artık dockerfile oluşturmaya hazırsınız. Dockerfile, kullanıcının bir kapsayıcı görüntüsünü derlemek için komut satırında yürüteceği tüm komutları içeren bir metin belgesidir. Kapsayıcı görüntüsü birden çok salt okunur dosya sistemi katmanı içerebilir. Docker, değiştirilmemiş adımlar için önbelleğe alınmış derleme sonuçlarını yeniden kullanabilir. Katmanlar üst üste birikir.

Örneğin, Havayolu Rezervasyonları için Uçuş Rezervasyon Sistemi'nin bir uygulama sunucusuna dağıtılması ve içinde çalıştırılması gerekir. Uygulama sunucusu AirlinesReservationSample-0.0.1-SNAPSHOT.war içinde paketlenmez. Bu, AirlinesReservationSample-0.0.1-SNAPSHOT.war için HTTP isteklerini çalıştırmak, dinlemek ve işlemek, kullanıcı oturumlarını yönetmek ve uçuş rezervasyonlarını kolaylaştırmak için gereken bir dış bağımlılıktır. Geleneksel, kapsayıcılı olmayan bir dağıtım kullandıysanız, işlem mühendisleri AirlinesReservationSample-0.0.1-SNAPSHOT.war'u dağıtmadan önce bazı fiziksel sunucuya veya sanal makineye bir uygulama sunucusu yükleyip yapılandırır. Bu işlem mühendislerinin ayrıca makinenizde kullanılan JDK'nin ( mvn clean package WAR dosyasını derlemek için kullanılan) uygulama sunucusu tarafından kullanılan JRE'ye karşılık geldiğini de sağlaması gerekir. Bu bağımlılıkları yönetmek zordur ve zaman alır.

Dockerfile ile, Havayolu Rezervasyonları için Uçuş Rezervasyon Sistemi'nin Docker kapsayıcı çalışma zamanına dağıtmak için gereken tüm bağımlılıklara sahip olduğundan emin olmak için gereken adımları katmanlayarak bu hedefe otomatik olarak ulaşmak için gereken yönergeleri veya katmanları yazabilirsiniz. Bu çözüm, planlanmamış aralıklarla isteğe bağlı ölçekle çalışırken ilgi çekicidir. Her katman, her eylemsel dönüm noktasındaki kapsayıcı imajının durumunu içeren Docker önbelleğini kullanarak hesaplama süresini optimize eder ve yeniden kullanım sağlar. Katman değişmiyorsa, önbelleğe alınmış katmanlar kullanılır. Önbelleğe alınan katmanlar için yaygın kullanım örnekleri Java çalışma zamanı, uygulama sunucusu ve Havayolu Rezervasyonları için Uçuş Rezervasyon Sistemi Web uygulaması için diğer bağımlılıklardır. Bir önbelleğe alınmış katmandaki sürüm değişirse veya değiştiğinde, yeni bir önbelleğe alınmış giriş oluşturulur.

Kapsayıcı görüntüsü salt okunur dosya sistemi katmanları içerir. Bu örnekte Dockerfile, Tomcat ve Flight Booking System WAR dosyasını derleme zamanında görüntüye kopyalar. Docker, imajdan bir kapsayıcı oluşturduğunda ayrı bir yazılabilir katman ekler. Her kapsayıcının yazılabilir katmanı, imaj katmanlarını değiştirmeden kendi dosya sistemi değişikliklerini kaydeder.

Not

Kapsayıcının yazılabilir katmanında depolanan dosyalar için eklemeler, değişiklikler ve silmeler orijinal imaj yerine kapsayıcıyı etkiler. Görüntü katmanından gelen dosyalarda yazmada kopyalama davranışı kullanılır.

Docker'ın çok aşamalı yapılar kavramı, daha iyi önbellekleme ve daha küçük bir güvenlik ayak izi ile daha küçük bir kapsayıcı görüntüsü oluşturmanızı sağlayan ve Dockerfile'ın zamanla daha iyi optimize edilip bakımının yapılmasına olanak tanıyan bir özelliktir. Örneğin, uygulamayı derleme ve oluşturma aşamasını uygulamayı çalıştırma aşamasından ayırabilirsiniz. Bu özellik, yalnızca derleme sırasında üretilen dosyaları üretim kapsayıcı görüntüsüne kopyalamanızı sağlar, böylece ayak izini azaltır. Kapsayıcı görüntüleri önbelleğe alındığından, değişiklik yapılmazsa önbelleğe alınan görüntüler yeniden kullanılabilir ve ağdan indirme maliyeti ve süresi azalır.

Üretim ortamında kullanıma sunulan hizmetlerin güvenlik açısından dikkatle yönetilmesi gerekir. Bu nedenle, üretim ortamı güvenli bir kapsayıcı görüntüsü kullanır ve çalıştırır. Örnek, Microsoft tarafından sağlanan bir Azure Linux görüntüsü kullanır.

Son aşamada Azure Linux 3.0 üzerinde Microsoft Build OpenJDK 17 kullanılır. 17-azurelinux etiketi bu tabanı açıkça adlandırır. Eski 17-mariner etiket, Azure Linux görüntüsünü yansıtan bir uyumluluk diğer adı olarak kalır; kullanımdan kaldırılan 17-mariner-cm1 ve 17-mariner-cm2 görüntülerle karıştırılmamalıdır. Daha fazla bilgi için bkz. Microsoft Build OpenJDK kapsayıcı görüntüleri.

Not

Microsoft, OpenJDK ile birlikte sunulan, distroless, Azure Linux ve Ubuntu görüntüleri de dahil olmak üzere kapsayıcı görüntüleri sağlar. Görüntü distroless en küçük boyuta sahiptir, ancak üzerinde Tomcat çalıştırmak zordur. Hafif bir tasarım elde etmek için, distroless görüntü kabuk dahil olmak üzere birçok komutu ve aracı kaldırır, bu da Tomcat'i başlatmak için catalina.sh'i çağıramayacağınız anlamına gelir. Görüntü distroless , Spring Boot veya Quarkus ile kullanılanlar gibi yürütülebilir JAR'leri çalıştırmak için uygundur.

Aşağıdaki örnekte, hem derleme aşamasında hem de son aşamada OpenJDK'nin Microsoft Derlemesi'nin aynı sürümü kullanılmıştır. Bu yaklaşım, kaynak kodu Tomcat'in hizmet dağıtımının kullandığı JDK'nin aynı sürümüyle derlemenizi sağlar ve bu da sürüm uyuşmazlıklarından kaynaklanan beklenmeyen davranışları önlemeye yardımcı olur.

Aşağıdaki görüntüde, Çok aşamalı derleme ve Dockerfile'da belirtilen komutlara göre her aşamada nelerin oluştuğu anlatılıyor:

Tomcat yükleme, kod derleme ve çalışma zamanı aşamalarında görüntü katmanları oluşturan Dockerfile yönergelerini gösteren diyagram.

0. aşamada Tomcat sürüme özgü apache arşivinden indirilir, SHA-512 sağlama toplamıyla doğrulanır ve Ubuntu görüntüsündeki bir ortam değişkeni tarafından belirtilen bir dizine ayıklanır. TOMCAT_VERSION değişkeni sürümü, TOMCAT_SHA512 derleme bağımsız değişkeni ise beklenen sağlama toplamını belirtir. Desteklenen daha yeni bir sürüm seçerken her iki değeri de birlikte güncelleştirin. Docker, yönergeleri ve girişleri değişmeden önbelleğe alınmış yükleme katmanını yeniden kullanabilir. Tomcat yüklemesi kullanım için son aşama ortamına kopyalanır.

1. aşamada Maven bir Ubuntu görüntüsüne yüklenir ve oluşturulan kaynak kodu ve yapılandırma dosyaları Maven projesi oluşturulmadan önce kopyalanır. Her katman önbelleğe alınır, bu nedenle işletim sistemi görüntüsü ve Maven görüntü katmanları önbelleği yeniden kullanabilir. Yapılandırma dosyaları, kaynak kod dosyaları veya web dizini güncelleştirilirse, değişikliklerden gelen katmanlar yeniden oluşturulur. Derleme, derleme sırasında hata olmadan başarıyla tamamlanırsa hedef dizin altındaAirlinesReservationSample-0.0.1-SNAPSHOT.war adlı bir yapıt oluşturulur. Bu artifakt, son aşama ortamında kullanılması için kopyalanır.

Son aşamada, Tomcat ve Java sırasıyla 0. ve 1. aşamadaki derleme yapıtları Azure Linux 3.0'da Microsoft Build OpenJDK 17 görüntüsüne kopyalanır. app adlı bir kullanıcı projede kullanılan tüm dosyalara sahip olur ve uygulama, app ayrıcalıklarına sahip olmak yerine, root kullanıcısı olarak çalıştırılır. Bu kurulum, gereksiz izinler vermeden kapsayıcı görüntüsünün güvenli bir şekilde çalıştırılmasını sağlar. Son olarak, 8080 numaralı bağlantı noktası kullanıma sunulur ve catalina.sh betiği Tomcat'i başlatmak için yürütülür. Bu işlem yerel Docker Desktop'ınız üzerinde çalıştırıldığında URL http://localhost:8080/AirlinesReservationSampleüzerinden erişebilirsiniz.

containerize-and-deploy-Java-app-to-Azure/Project/Airlines içinde, Dockerfile adlı bir dosya oluşturmak için kurulu bir metin düzenleyici kullanın. Aşağıdaki içeriği ekleyin ve dosyayı kaydedin:

Important

Genel kullanıma sunacağınız bir imaj oluşturmadan önce Apache Tomcat indirme sayfasında desteklenen geçerli Tomcat 10.1.x sürümünü denetleyin ve güvenlik bildirimlerini gözden geçirin. Apache'nin yayımladığı sürüm bilgilerini kullanarak TOMCAT_SHA512 ve TOMCAT_VERSION birlikte güncelleştirin. Apache arşivinde kalan bir artefakt, sürümünün güncel olduğu veya önerildiğini göstermez.

############################################
# Tomcat Intall stage
############################################
FROM mcr.microsoft.com/openjdk/jdk:17-ubuntu AS tomcat

ENV CATALINA_HOME=/usr/local/tomcat

# Configure the reviewed Tomcat version and checksum
ENV TOMCAT_VERSION=10.1.61
ARG TOMCAT_SHA512=35120a2b1182bac3d55438fbec0dc581d03b0f1c16ce692a930f3bb6a1097cf896b94b389152257071a87cb2928ac8c15f1bad08387c14acc7c17dbc1bb598fb

# Install Tomcat and required packages
RUN apt-get update && \
    apt-get install -y --no-install-recommends curl ca-certificates && \
    curl -fSL \
      "https://archive.apache.org/dist/tomcat/tomcat-10/v${TOMCAT_VERSION}/bin/apache-tomcat-${TOMCAT_VERSION}.tar.gz" \
      -o /tmp/tomcat.tar.gz && \
    echo "${TOMCAT_SHA512}  /tmp/tomcat.tar.gz" | sha512sum -c - && \
    mkdir -p "${CATALINA_HOME}" && \
    tar -xzf /tmp/tomcat.tar.gz --strip-components=1 -C "${CATALINA_HOME}" && \
    rm /tmp/tomcat.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-azurelinux

# 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"]

Not

Bu alıştırma için bu ünitede gösterilen Dockerfile dosyasını kullanın. Uygulama, aşağıdaki birimlerdeki URL'lerin webapps/AirlinesReservationSample.war bağlamını kullanması için /AirlinesReservationSample/ konumuna kopyalanmalıdır. Farklı bir WAR dosya adı, varsayılan Tomcat uygulama context’ini değiştirir.

Dockerfile, aşağıdaki tablolarda açıklanan üç aşamaya ayrılır:

  • Tomcat yükleme aşaması:

    Docker komutu Açıklama
    FROM FROM mcr.microsoft.com/openjdk/jdk:17-ubuntu AS tomcat temel görüntüyü Ubuntu üzerinde OpenJDK 17'nin Microsoft Derlemesi olarak ayarlar ve bu aşamayı adlandırır tomcat. Tomcat'in yüklü olduğu yer burasıdır.
    ENV ENV CATALINA_HOME=/usr/local/tomcat Tomcat yükleme dizini için bir ortam değişkeni ayarlar.
    ENV ENV TOMCAT_VERSION=10.1.61 bu örnek için sabitlenmiş Tomcat yayınını ayarlar. Desteklenen sürümleri gözden geçirin ve gerektiğinde TOMCAT_SHA512 ile birlikte güncelleştirin.
    ARG ARG TOMCAT_SHA512 derleme bağımsız değişkeni olarak seçilen arşiv için Apache'nin yayımlanan SHA-512 sağlama toplamını sağlar.
    RUN curl ve CA sertifikalarını yükler, ardından sürüme özgü Apache arşivini indirmek için curl -fSL kullanır. -f HTTP hatalarında başarısız olur; -L yeniden yönlendirmeleri izler. Arşiv, sha512sum -c - ile --strip-components=1 kullanılarak CATALINA_HOME içine çıkarılmadan önce doğrulanır. && Temizleme sırasında hataları maskelemek yerine zincir hata durumunda durur. Son olarak, arşivi ve gereksiz paketleri kaldırır ve paket önbelleğini temizler.
  • Java 17 kullanılarak gerçekleştirilen Derleme aşaması:

    Docker komutu Açıklama
    FROM FROM mcr.microsoft.com/openjdk/jdk:17-ubuntu AS build temel görüntüyü Ubuntu üzerinde OpenJDK 17'nin Microsoft Derlemesi olarak ayarlar ve bu aşamayı adlandırır build. Bu aşama Java uygulamasını derlemek için kullanılır.
    WORKDIR WORKDIR /build kapsayıcısının içindeki çalışma dizinini /buildolarak ayarlar; burada kaynak kod kopyalanır ve derlanır.
    RUN RUN apt-get update && apt-get install -y maven && mvn --version Java projeleri için kullanılan bir derleme otomasyon aracı olan Maven'i yükler ve yüklemesini doğrular.
    COPY COPY pom.xml . Maven yapılandırma dosyasını çalışma dizinine kopyalar. Bu dosya, projeyi oluşturmak için gereklidir.
    COPY COPY src ./src kaynak kod dizinini kapsayıcıya kopyalar. Java uygulama kodu burada bulunur.
    COPY COPY web ./web web kaynakları dizinini kapsayıcıya kopyalar. Bu, oluşturma için gereken web uygulaması kaynaklarını içerir.
    RUN RUN mvn clean package Maven derleme sürecini yürütür, bu süreç Java uygulamasını derler ve WAR dosyasına paketler.
  • Paket son aşaması:

    Docker komutu Açıklama
    FROM FROM mcr.microsoft.com/openjdk/jdk:17-azurelinux, temel görüntüyü uygulamanın son dağıtımı için kullanılan Azure Linux 3.0 üzerinde Microsoft Build OpenJDK 17 olarak ayarlar.
    ENV ENV CATALINA_HOME=/usr/local/tomcat Tomcat yükleme dizini için ortam değişkenini, yükleme aşamasına benzer şekilde ayarlar.
    ENV ENV PATH=$CATALINA_HOME/bin:$PATH Tomcat bin dizinini sisteme PATHekler ve Tomcat komutlarının kolayca çalıştırılmasını sağlar.
    USER USER app , Tomcat işleminin çalıştığı kullanıcıyı belirtir ve kök kullanıcı olarak çalışmayarak güvenliği artırır.
    COPY COPY --chown=app:app --from=tomcat ${CATALINA_HOME} ${CATALINA_HOME} Tomcat kurulumunu aşamasındaki tomcat'den kopyalar ve sahipliğini app kullanıcısına ayarlar.
    COPY COPY --chown=app:app tomcat-users.xml ${CATALINA_HOME}/conf Tomcat kullanıcı yapılandırma dosyasını kapsayıcıya kopyalar ve sahipliğini app kullanıcıya ayarlar.
    COPY Derlenmiş WAR dosyasını COPY --chown=app:app --from=build /build/target/*.war ${CATALINA_HOME}/webapps/AirlinesReservationSample.war aşamasından Tomcat build dizinine kopyalayıp sahipliğini kullanıcıya ayarlar.
    EXPOSE EXPOSE 8080, uygulamanın TCP 8080 bağlantı noktasını dinlemesinin beklendiğini belirtir. Bir host bağlantı noktası yayımlamaz. Sonraki birim, bağlantı noktasını -p 8080:8080 üzerinde docker run seçeneğiyle yayımlar.
    CMD CMD ["catalina.sh", "run"] kapsayıcı çalıştırıldığında Tomcat'i başlatmak için komutunu belirtir.

Dockerfile yapısı hakkında daha fazla bilgi için bkz. Dockerfile başvurusu.