Java uygulamasını kapsayıcıya alma
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:
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:
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 FROMFROM mcr.microsoft.com/openjdk/jdk:17-ubuntu AS tomcattemel görüntüyü Ubuntu üzerinde OpenJDK 17'nin Microsoft Derlemesi olarak ayarlar ve bu aşamayı adlandırırtomcat. Tomcat'in yüklü olduğu yer burasıdır.ENVENV CATALINA_HOME=/usr/local/tomcatTomcat yükleme dizini için bir ortam değişkeni ayarlar.ENVENV TOMCAT_VERSION=10.1.61bu örnek için sabitlenmiş Tomcat yayınını ayarlar. Desteklenen sürümleri gözden geçirin ve gerektiğindeTOMCAT_SHA512ile birlikte güncelleştirin.ARGARG TOMCAT_SHA512derleme 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.RUNcurlve CA sertifikalarını yükler, ardından sürüme özgü Apache arşivini indirmek içincurl -fSLkullanır.-fHTTP hatalarında başarısız olur;-Lyeniden yönlendirmeleri izler. Arşiv,sha512sum -c -ile--strip-components=1kullanılarakCATALINA_HOMEiç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 FROMFROM mcr.microsoft.com/openjdk/jdk:17-ubuntu AS buildtemel görüntüyü Ubuntu üzerinde OpenJDK 17'nin Microsoft Derlemesi olarak ayarlar ve bu aşamayı adlandırırbuild. Bu aşama Java uygulamasını derlemek için kullanılır.WORKDIRWORKDIR /buildkapsayıcısının içindeki çalışma dizinini/buildolarak ayarlar; burada kaynak kod kopyalanır ve derlanır.RUNRUN apt-get update && apt-get install -y maven && mvn --versionJava projeleri için kullanılan bir derleme otomasyon aracı olan Maven'i yükler ve yüklemesini doğrular.COPYCOPY pom.xml .Maven yapılandırma dosyasını çalışma dizinine kopyalar. Bu dosya, projeyi oluşturmak için gereklidir.COPYCOPY src ./srckaynak kod dizinini kapsayıcıya kopyalar. Java uygulama kodu burada bulunur.COPYCOPY web ./webweb kaynakları dizinini kapsayıcıya kopyalar. Bu, oluşturma için gereken web uygulaması kaynaklarını içerir.RUNRUN mvn clean packageMaven 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 FROMFROM 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.ENVENV CATALINA_HOME=/usr/local/tomcatTomcat yükleme dizini için ortam değişkenini, yükleme aşamasına benzer şekilde ayarlar.ENVENV PATH=$CATALINA_HOME/bin:$PATHTomcat bin dizinini sistemePATHekler ve Tomcat komutlarının kolayca çalıştırılmasını sağlar.USERUSER app, Tomcat işleminin çalıştığı kullanıcıyı belirtir ve kök kullanıcı olarak çalışmayarak güvenliği artırır.COPYCOPY --chown=app:app --from=tomcat ${CATALINA_HOME} ${CATALINA_HOME}Tomcat kurulumunu aşamasındakitomcat'den kopyalar ve sahipliğiniappkullanıcısına ayarlar.COPYCOPY --chown=app:app tomcat-users.xml ${CATALINA_HOME}/confTomcat kullanıcı yapılandırma dosyasını kapsayıcıya kopyalar ve sahipliğiniappkullanıcıya ayarlar.COPYDerlenmiş WAR dosyasını COPY --chown=app:app --from=build /build/target/*.war ${CATALINA_HOME}/webapps/AirlinesReservationSample.waraşamasından Tomcatbuilddizinine kopyalayıp sahipliğini kullanıcıya ayarlar.EXPOSEEXPOSE 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üzerindedocker runseçeneğiyle yayımlar.CMDCMD ["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.