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 |
Kapsayıcılar, Azure Container Registry gibi kayıt defterlerinden çekilen görüntülerden başlatılır. Bu kayıt defteri, Azure Kubernetes Servisi'nin verilerini aldığı yerdir. Bu komutun sonucu, Azure'da gerçekleşen bir görüntünün ağ üzerinden çekilmesidir. İsteğe bağlı olarak, görüntüleri yerel olarak çekebilirsiniz. Bu seçenek, uygulama sunucusu gibi uygulamanızın ihtiyaç duyabileceği bağımlılıklar veya katmanlar gerektiren görüntüler oluştururken yaygındır. |
docker run |
Görüntünün çalışan bir örneği bir kapsayıcıdır ve bu komut, çalışan kapsayıcı uygulamasını çalıştırmak ve bunlarla etkileşime geçmek için gereken tüm katmanları yürütür. Bu komutun sonucu, konak işletim sisteminde çalışan bir uygulama işlemidir. |
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ı olursa Maven, aşağıdaki çıktıda gösterildiği gibi Havayolu Rezervasyonları Web Uygulaması Arşivi için Uçuş Rezervasyon Sistemi'ni Başarıyla Oluşturmuştur AirlinesReservationSample-0.0.1-SNAPSHOT.war:
[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. Her görüntü, verimlilik için önbelleğe alınabilen bir katmandır. 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.
Aşağıdaki diyagramda kapsayıcı görüntüsünün katmanları gösterilmiştir. Dockerfile içindeki komutlar yürütürken katmanlar oluşturulur. En üst katman, Havayolu Rezervasyonları web uygulaması katmanı için okuma/yazma Uçuş Rezervasyon Sistemi'dir. Bu katman, önceki salt okunur katmanların üzerine kurulmuştur.
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 görüntüyü kullanır CBL-Mariner .
CBL-Mariner Linux, yalnızca bulut ortamı için gereken paketleri içeren basit bir işletim sistemidir. Özel paketler ve araçlar aracılığıyla uygulamanızın gereksinimlerine uyacak şekilde özelleştirebilirsiniz. CBL-Mariner Azure doğrulama testlerinden geçer ve Azure aracılarıyla uyumludur. Microsoft, Azure hizmetlerinden IoT altyapısını çalıştırmaya kadar çeşitli kullanım örneklerini desteklemek için CBL-Mariner oluşturur ve test eder. Microsoft bulut hizmetleri ve ilgili ürünlerle kullanmak için dahili olarak önerilen Linux dağıtımıdır.
Not
Microsoft, OpenJDK ile birlikte gelen kapsayıcı görüntüleri sağlar, bu görüntüler Ubuntu, CBL-Mariner, ve distroless görüntülerini içerir. 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 indirilir 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, indirilecek Tomcat sürümünü belirtir. Tomcat'in yeni bir sürümü yayınlanırsa, yeni bir görüntü yalnızca sürüm numarası değiştiğinde getirildiğinden sürüm numarasını güncelleştirmeniz gerekir. Aksi takdirde, önbelleğe alınan görüntü kullanılır. İndirilen Tomcat, kullanım için nihai 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, Microsoft tarafından sağlanan güvenli CBL-Mariner görüntü sırasıyla 0. aşamadan ve 1. aşamadan Tomcat ve Java derleme yapıtlarını kopyalamak için kullanılı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.
Projenizin kök klasöründe containerize-and-deploy-Java-app-to-Azure/Project/Airlines, Dockerfile adlı bir dosya oluşturmak için aşağıdaki komutu kullanın:
vi Dockerfile
Aşağıdaki içeriği Dockerfile'ınıza ekleyin, ardından kaydedip çıkın. Kaydetmek ve çıkmak için ESC tuşuna basın, :wq! yazın ve enter tuşuna basın.
############################################
# 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"]
Not
İsteğe bağlı olarak, ihtiyacınız olan içeriği içeren projenizin kökündeki Dockerfile_Solution dosyasını kullanabilirsiniz.
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.33Tomcat sürümünü yüklenecek şekilde ayarlar. Bu, gerektiğinde en son sürüme güncelleştirilmelidir.RUNRUNkomutu paket listesini güncelleştirir, yüklercurl, Belirtilen Tomcat sürümünü indirir, ayıklar, belirtilen dizine taşır ve gereksiz dosyaları ve paketleri temizler. Bu, görüntünün hafif kalmasını sağlar.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-marinertemel görüntüyü, uygulamanın son dağıtımı için kullanılan OpenJDK 17'ninCBL-MarinerMicrosoft Derlemesi 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 8080Tomcat için varsayılan bağlantı noktası olan 8080 numaralı bağlantı noktasını kullanıma sunar ve uygulamaya dış erişim sağlar.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.