4. Modül: Docker ile Google App Engine'den Cloud Run'a geçiş

1. Genel Bakış

Bu codelab serisi (kendi hızınızda ilerleyebileceğiniz, uygulamalı eğitimler), bir dizi taşıma işlemi boyunca yol göstererek Google App Engine (Standart) geliştiricilerinin uygulamalarını modernleştirmelerine yardımcı olmayı amaçlar. Bu işlem tamamlandıktan sonra kullanıcılar, uygulamalarını Cloud Run (Google Cloud'un App Engine'in kardeş hizmeti olan kapsayıcı barındırma hizmeti) ve diğer kapsayıcı barındırma hizmetleri için açıkça kapsayıcıya dönüştürerek daha taşınabilir hale getirebilir.

Bu eğiticide, sektörde uygulamaları container'larda geliştirme, gönderme ve çalıştırma konusunda iyi bilinen bir platform olan Docker'ı kullanarak App Engine uygulamalarını Cloud Run'ın tümüyle yönetilen hizmetine dağıtmak üzere container'a dönüştürme işlemi açıklanmaktadır. Python 2 geliştiriciler için bu eğitim 2. Modül Cloud NDB App Engine örnek uygulaması ile BAŞLAR. Python 3 geliştiriciler ise 3. Modül Cloud Datastore örneği ile BAŞLAR.

Öğrenecekleriniz

  • Docker kullanarak uygulamanızı container mimarisine alma
  • Container görüntülerini Cloud Run'a dağıtma

Gerekenler

Anket

Bu codelab'i nasıl kullanacaksınız?

Sadece okuyun Okuyun ve alıştırmaları tamamlayın

2. Arka plan

App Engine ve Cloud Functions gibi PaaS sistemleri, ekibiniz ve uygulamanız için birçok kolaylık sağlar. Örneğin, bu sunucusuz platformlar, sistem yöneticisi/DevOps'un çözümler oluşturmaya odaklanmasını sağlar. Uygulamanız gerektiğinde otomatik olarak ölçeklenebilir, kullanım başına ödeme faturalandırmasıyla maliyetleri kontrol etmenize yardımcı olacak şekilde sıfıra kadar ölçeği azaltılabilir ve çeşitli yaygın geliştirme dillerini kullanır.

Ancak kapsayıcıların esnekliği de oldukça ilgi çekicidir. Herhangi bir dili, kitaplığı veya ikili programı seçebilirsiniz. Google Cloud Run, kullanıcılara hem sunucusuz bilgi işlem kolaylığını hem de container esnekliğini sunarak her iki dünyanın en iyi özelliklerini bir araya getirir.

Cloud Run'ı kullanmayı öğrenmek bu codelab'in kapsamı dışındadır. Bu konu Cloud Run belgelerinde ele alınmıştır. Buradaki amaç, App Engine uygulamanızı Cloud Run (veya diğer hizmetler) için nasıl kapsayacağınızı öğrenmenizi sağlamaktır. Devam etmeden önce bilmeniz gereken birkaç şey var. Öncelikle, uygulama kodunu alıp dağıtmayacağınız için kullanıcı deneyiminizin biraz farklı ve daha düşük düzeyde olacağını belirtmek isteriz.

Bunun yerine, container'lar hakkında bir şeyler öğrenmeniz gerekir. Örneğin, nasıl oluşturulup dağıtılacakları gibi. Ayrıca, App Engine'in web sunucusunu artık kullanmayacağınız için kapsayıcı resmine ne koymak istediğinize de karar verebilirsiniz. Örneğin, bir web sunucusu ekleyebilirsiniz. Bu yolu izlemeyi tercih etmiyorsanız uygulamalarınızı App Engine'de tutmak kötü bir seçenek değildir.

Bu eğitimde, uygulamanızı nasıl kapsayacağınızı, App Engine yapılandırma dosyalarını kapsayıcı yapılandırmasıyla nasıl değiştireceğinizi, kapsayıcıya nelerin gireceğini belirlemeyi ve ardından uygulamanızı nasıl başlatacağınızı öğreneceksiniz. Bunların çoğu App Engine tarafından otomatik olarak işlenir.

Bu taşıma işlemi aşağıdaki adımlardan oluşur:

  1. Kurulum/Ön Hazırlık
  2. Uygulamayı kapsayıcıya alma
    • Yapılandırma dosyalarını değiştirme
    • Uygulama dosyalarını değiştirme

3. Kurulum/Ön Hazırlık

Eğitimin ana bölümüne başlamadan önce projemizi oluşturalım, kodu alalım ve temel uygulamayı dağıtalım. Böylece, çalışır durumda olan bir kodla başladığımızı biliriz.

1. Proje oluşturma

2. Modül veya 3. Modül kod laboratuvarlarını tamamladıysanız aynı projeyi (ve kodu) yeniden kullanmanızı öneririz. Alternatif olarak, yepyeni bir proje oluşturabilir veya mevcut başka bir projeyi yeniden kullanabilirsiniz. Projenin etkin bir faturalandırma hesabına sahip olduğundan ve App Engine'in (uygulama) etkinleştirildiğinden emin olun.

2. Temel örnek uygulamayı edinme

Bu codelab'in ön koşullarından biri, çalışan bir 2. Modül veya 3. Modül örnek uygulamasına sahip olmaktır. Çalışan bir örnek uygulamanız yoksa devam etmeden önce yukarıdaki bağlantılardan birini kullanarak ilgili eğitimi tamamlayın. Aksi takdirde, içeriğine zaten aşinaysanız aşağıdaki 2. veya 3. modül kodunu alarak başlayabilirsiniz.

Sizinkini veya bizimkini kullanmanız fark etmez. Bu eğitimin Python 2 sürümünde BAŞLANGIÇ noktası olarak Modül 2 kodunu, Python 3 sürümünde ise Modül 3 kodunu kullanacağız. Bu 4. Modül codelab'i, her adımda size yol gösterir. Seçeneklerinize bağlı olarak, tamamlandığında 4. Modül depo klasörlerinden (FINISH) birine benzeyen bir kod elde edersiniz.

Python 2 Modülü 2 BAŞLANGIÇ dosyalarının (sizinki veya bizimki) dizini şu şekilde görünmelidir:

$ ls
README.md               appengine_config.py     requirements.txt
app.yaml                main.py                 templates

Kendi Module 2 (2.x) kodunuzu kullanıyorsanız lib klasörünüz de olur. Modül 3 (3.x) BAŞLANGIÇ kodu aşağıdaki gibi görünmelidir. Python 3'te ne lib ne de appengine_config.py kullanılır:

$ ls
README.md               main.py                 templates
app.yaml                requirements.txt

3. Temel uygulamayı (yeniden) dağıtma

Şimdi yapmanız gereken kalan ön hazırlık adımları:

  1. gcloud komut satırı aracı hakkında bilgi edinin
  2. Örnek uygulamayı gcloud app deploy ile yeniden dağıtın.
  3. Uygulamanın App Engine'de sorunsuz çalıştığını onaylayın.

Bu adımları başarıyla uyguladıktan sonra kapsüllemeye hazır olursunuz.

4. Uygulamayı kapsayıcıya alma

Docker, günümüzde sektördeki standart container oluşturma platformudur. Daha önce de belirtildiği gibi, bu aracı kullanırken karşılaşılan zorluklardan biri, kapsayıcı resimlerinizin nasıl oluşturulacağını belirleyen yapılandırma dosyası olan verimli bir Dockerfile oluşturmak için çaba göstermeniz gerekmesidir. Öte yandan Buildpack'ler, uygulamanızın bağımlılıklarını belirlemek için iç gözlem kullandığından çok az çaba gerektirir. Bu sayede Buildpack kapsayıcısı, uygulamanız için mümkün olduğunca verimli hale gelir.

Kapsayıcılar ve Docker hakkında bilgi sahibiyseniz ve Cloud Run için App Engine uygulamanızı kapsayıcılara dönüştürme hakkında daha fazla bilgi edinmek istiyorsanız doğru yerdesiniz. Dilerseniz bu codelab'in aynısı olan ancak Cloud Buildpack'ler içeren 5. Modül codelab'ini de yapabilirsiniz. En temel özelliklere sahip örnek uygulamamız, yukarıda bahsedilen Dockerfile sorunlardan bazılarını önleyecek kadar hafiftir.

Taşıma adımları arasında App Engine yapılandırma dosyalarını değiştirme ve uygulamanızın nasıl başlatılacağını belirtme yer alır. Aşağıda, her platform türü için beklenen yapılandırma dosyalarını özetleyen bir tablo yer almaktadır. App Engine sütununu Docker sütunuyla (ve isteğe bağlı olarak Buildpack'lerle) karşılaştırın:

Açıklama

App Engine

Docker

Buildpack'ler

Genel yapılandırma

app.yaml

Dockerfile

(service.yaml)

Üçüncü taraf kitaplıkları

requirements.txt

requirements.txt

requirements.txt

Üçüncü taraf yapılandırması

app.yaml (appengine_config.py ve lib [yalnızca 2.x])

(yok)

(yok)

Başlangıç

(geçerli değil) veya app.yaml (entrypoint kullanılıyorsa)

Dockerfile

Procfile

Dosyaları yoksayma

.gcloudignore ve .gitignore

.gcloudignore, .gitignore ve .dockerignore

.gcloudignore ve .gitignore

Uygulamanız container mimarisine alındıktan sonra Cloud Run'a dağıtılabilir. Diğer Google Cloud kapsayıcı platformu seçenekleri arasında Compute Engine, GKE ve Anthos yer alır.

Genel yapılandırma

App Engine'den geçiş yapmak, app.yaml yerine container'ın nasıl oluşturulacağını ve çalıştırılacağını özetleyen bir Dockerfile ile değiştirmek anlamına gelir. App Engine, uygulamanızı otomatik olarak başlatır ancak Cloud Run başlatmaz. Dockerfile ENTRYPOINT ve CMD komutları bu amaçla kullanılır. Dockerfile hakkında daha fazla bilgi edinmek için bu Cloud Run dokümanları sayfasını inceleyin. Ayrıca, gunicorn oluşturan bir Dockerfile örneğini de inceleyebilirsiniz.

Dockerfile içinde ENTRYPOINT veya CMD kullanmak yerine Procfile kullanabilirsiniz. Son olarak, .dockerignore, kapsayıcı boyutunuzu düşük tutmak için uygulama dışı dosyaları filtrelemenize yardımcı olur. Bu özelliklerle ilgili daha fazla bilgiyi yakında paylaşacağız.

app.yaml öğesini silip Dockerfile öğesini oluşturma

app.yaml, kapsayıcılarda kullanılmadığı için hemen silin. Kapsayıcı yapılandırma dosyası Dockerfile'dır ve örnek uygulamamız için yalnızca minimum düzeyde bir dosya gerekir. Bu içerikle Dockerfile oluşturun. Kullandığınız Python sürümüne bağlı olarak NNN yerine 2 veya 3 kullanın:

FROM python:NNN-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
ENTRYPOINT ["python", "main.py"]

Dockerfile bölümünün çoğu, kapsayıcının nasıl oluşturulacağını belirtir. AncakENTRYPOINT bölümü, kapsayıcının nasıl başlatılacağını belirtir. Bu durumda, Flask geliştirme sunucusunu yürütmek için python main.py çağrılır. Docker'ı yeni kullanmaya başladıysanız FROM yönergesi, başlangıç için temel görüntüyü belirtir ve "slim" ifadesi, minimum Python dağıtımını ifade eder. Daha fazla bilgiyi Docker Python görüntüleri sayfasında bulabilirsiniz.

Ortadaki komut grubu, çalışma dizinini (/app) oluşturur, uygulama dosyalarını kopyalar ve ardından 3. taraf kitaplıkları kapsayıcıya getirmek için pip install komutunu çalıştırır. WORKDIR, Linux mkdir ve cd komutlarını birleştirir. Bu komut hakkında daha fazla bilgiyi WORKDIR belgelerinde bulabilirsiniz. COPY ve RUN yönergeleri kolay anlaşılır.

Üçüncü taraf kitaplıkları

requirements.txt dosyası aynı kalabilir. Flask, Datastore istemci kitaplığınızla (Cloud Datastore veya Cloud NDB) birlikte bulunmalıdır. Gunicorn gibi WSGI uyumlu başka bir HTTP sunucusu kullanmak istiyorsanız (bu yazı yazıldığı sırada mevcut sürüm 20.0.4'tür) gunicorn==20.0.4 öğesini requirements.txt öğesine ekleyin.

Üçüncü taraf yapılandırması

Python 2 App Engine geliştiricileri, üçüncü taraf kitaplıkların lib klasörüne kopyalandığını, requirements.txt içinde referans verildiğini, app.yaml içinde listelendiğini ve appengine_config.py tarafından desteklendiğini bilir. Python 3 App Engine uygulamaları gibi kapsayıcılar yalnızca requirements.txt kullanır. Bu nedenle, diğer tüm öğeler kaldırılabilir. Yani 2.x App Engine uygulamanız varsa appengine_config.py ve tüm lib klasörlerini hemen silin.

Başlangıç

Python 2 kullanıcıları App Engine'in web sunucusunu başlatmaz ancak kapsayıcıya geçerken bunu yapmanız gerekir. Bu işlem, uygulamanızın nasıl başlatılacağını belirten bir CMD veya ENTRYPOINT yönergesi Dockerfile dosyasına eklenerek yapılır. Bu işlem, Python 3 kullanıcıları için olduğu gibi aşağıda açıklanmıştır.

Python 3 kullanıcıları, app.yaml dosyalarını handlers bölümlerinde script: auto yönergeleri yerine entrypoint yönergeleri içerecek şekilde dönüştürebilir. Python 3 app.yaml'ünüzde entrypoint kullanıyorsanız şöyle görünür:

runtime: python38
entrypoint: python main.py

entrypoint yönergesi, App Engine'e sunucunuzu nasıl başlatacağını söyler. Bu dosyayı neredeyse doğrudan Dockerfile içine (veya uygulamanızı kapsayıcılaştırmak için Buildpack'ler kullanıyorsanız Procfile içine [5. Modül'e bakın]) taşıyabilirsiniz. Bir giriş noktası yönergesinin iki platformda nereye gideceğini özetliyoruz:

  • Docker: Dockerfile satırında: ENTRYPOINT ["python", "main.py"]
  • Buildpack'ler: Procfile satırı: web: python main.py

Flask geliştirme sunucusunu test için kullanabilirsiniz ancak uygulamanızda gunicorn gibi bir üretim sunucusu kullanıyorsanız ENTRYPOINT veya CMD yönergenizi Cloud Run hızlı başlangıç örneğinde olduğu gibi bu sunucuya yönlendirdiğinizden emin olun.

Dosyaları yoksayma

Kapsayıcınızın boyutunu küçültmek ve kapsayıcı resminizi aşağıdaki gibi gereksiz dosyalarla doldurmamak için .dockerignore dosyası oluşturmanızı öneririz:

*.md
*.pyc
*.pyo
.git/
.gitignore
__pycache__

Uygulama dosyaları

2. veya 3. modül uygulamalarının tümü Python 2-3 ile tamamen uyumludur. Bu nedenle, main.py'nın temel bileşenlerinde herhangi bir değişiklik yapılmaz. Yalnızca birkaç satır başlangıç kodu eklenir. Geliştirme sunucusunu başlatmak için main.py dosyasının en altına iki satır ekleyin. Cloud Run'ın uygulamanızı çağırabilmesi için 8080 numaralı bağlantı noktasının açık olması gerekir:

if __name__ == '__main__':
    import os
    app.run(debug=True, threaded=True, host='0.0.0.0',
            port=int(os.environ.get('PORT', 8080)))

5. Derleme ve dağıtma

Docker yapılandırması ve kaynak dosyası güncellemeleri tamamlandığında uygulamayı Cloud Run'da çalıştırmaya hazır olursunuz. Ancak önce hizmetler hakkında kısa bir bilgi verelim.

Hizmetler ve uygulamalar

App Engine öncelikli olarak uygulamaları barındırmak için oluşturulmuş olsa da web hizmetlerini veya bir mikro hizmet koleksiyonundan oluşan uygulamaları barındırmak için de kullanılabilir. Cloud Run'da gerçek bir hizmet veya web arayüzü olan bir uygulama olsun her şey hizmet olarak kabul edilir. Bu nedenle, kullanımını uygulama dağıtımı yerine hizmet dağıtımı olarak değerlendirin.

App Engine uygulamanız birden fazla hizmetten oluşmadığı sürece uygulamalarınızı dağıtırken herhangi bir adlandırma işlemi yapmanız gerekmiyordu. Ancak Cloud Run'da hizmet adı oluşturmanız gerekir. App Engine'in appspot.com alanında ise proje kimliği (ör. https://PROJECT_ID.appspot.com) ve belki de bölge kimliği kısaltması (ör. http://PROJECT_ID.REGION_ID.r.appspot.com) yer alır.

Ancak bir Cloud Run hizmetinin alanında hizmet adı, bölge kimliği kısaltması ve karma bulunur ancak proje kimliği bulunmaz (ör. https://SVC_NAME-HASH-REG_ABBR.a.run.app). Sonuç olarak, hizmet adı düşünmeye başlayın.

Hizmet dağıtma

Container görüntünüzü oluşturmak ve Cloud Run'a dağıtmak için aşağıdaki komutu çalıştırın. İstendiğinde bölgenizi seçin ve daha kolay test için kimliği doğrulanmamış bağlantılara izin verin. SVC_NAME, dağıttığınız hizmetin adı olmak üzere bölgenizi uygun şekilde seçin.

$ gcloud beta run deploy SVC_NAME --source .
Please choose a target platform:
 [1] Cloud Run (fully managed)
 [2] Cloud Run for Anthos deployed on Google Cloud
 [3] Cloud Run for Anthos deployed on VMware
 [4] cancel
Please enter your numeric choice:  1

To specify the platform yourself, pass `--platform managed`. Or, to make this the default target platform, run `gcloud config set run/platform managed`.

Please specify a region:
 [1] asia-east1
 [2] asia-east2
 [3] asia-northeast1
 [4] asia-northeast2
 [5] asia-northeast3
 [6] asia-south1
 [7] asia-southeast1
 [8] asia-southeast2
 [9] australia-southeast1
 [10] europe-north1
 [11] europe-west1
 [12] europe-west2
 [13] europe-west3
 [14] europe-west4
 [15] europe-west6
 [16] northamerica-northeast1
 [17] southamerica-east1
 [18] us-central1
 [19] us-east1
 [20] us-east4
 [21] us-west1
 [22] us-west2
 [23] us-west3
 [24] us-west4
 [25] cancel
Please enter your numeric choice: <select your numeric region choice>

To make this the default region, run `gcloud config set run/region REGION`.

Allow unauthenticated invocations to [SVC_NAME] (y/N)?  y

Building using Dockerfile and deploying container to Cloud Run service [SVC_NAME] in project [PROJECT_ID] region [REGION]
✓ Building and deploying new service... Done.
  ✓ Uploading sources...
  ✓ Building Container... Logs are available at [https://console.cloud.google.com/cloud-build/builds/BUILD-HASH?project=PROJECT_NUM].
  ✓ Creating Revision... Deploying Revision.
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [SVC_NAME] revision [SVC_NAME-00001-vos] has been deployed and is serving 100 percent of traffic.
Service URL: https://SVC_NAME-HASH-REG_ABBR.a.run.app

Dağıtımın başarılı olduğunu onaylamak için tarayıcınızla belirtilen URL'yi ziyaret edin.

gcloud komutunun belirttiği gibi, kullanıcılar yukarıda gösterildiği şekilde çıkışı ve etkileşimi azaltmak için çeşitli varsayılan ayarlar belirleyebilir. Örneğin, tüm etkileşimleri önlemek için bunun yerine aşağıdaki tek satırlık dağıtım komutunu kullanabilirsiniz:

$ gcloud beta run deploy SVC_NAME --source . --platform managed --region REGION --allow-unauthenticated

Bu yöntemi kullanıyorsanız yukarıda etkileşimli olarak yaptığımız gibi dizine eklenmiş menü seçimini değil, aynı hizmet adını SVC_NAME ve istediğiniz REGION adı seçtiğinizden emin olun.

6. Özet/Temizleme

Uygulamanın, App Engine'de olduğu gibi Cloud Run'da da çalıştığını doğrulayın. Bu seriye önceki codelab'lerden herhangi birini yapmadan başladıysanız uygulamanın kendisi değişmez. Ana web sayfasını (/) tüm ziyaretleri kaydeder ve siteyi yeterince ziyaret ettiğinizde aşağıdaki gibi görünür:

visitme uygulaması

Kodunuz artık 2.x veya 3.x olsun, 4. Modül depo klasöründeki kodla eşleşmelidir. 4. Modül'ü tamamladığınız için tebrik ederiz.

İsteğe bağlı: Temizleme

Bir sonraki taşıma codelab'ine geçmeye hazır olana kadar faturalandırılmamak için temizlik yapma konusunda ne yapmalısınız? Artık farklı bir ürün kullandığınız için Cloud Run fiyatlandırma kılavuzunu incelediğinizden emin olun.

İsteğe bağlı: Hizmeti devre dışı bırakma

Bir sonraki eğitime geçmeye henüz hazır değilseniz ek ücret alınmasını önlemek için hizmetinizi devre dışı bırakın. Bir sonraki codelab'e geçmeye hazır olduğunuzda yeniden etkinleştirebilirsiniz. Uygulamanız devre dışıyken ücretlendirmeye neden olacak trafik almaz. Ancak Datastore kullanımınız ücretsiz kotayı aşarsa bu kullanım için de faturalandırılabilirsiniz. Bu nedenle, bu sınırın altında kalmak için yeterli miktarda veri silin.

Diğer yandan, taşımalara devam etmeyecek ve her şeyi tamamen silmek istiyorsanız hizmetinizi silebilir veya projenizi tamamen kapatabilirsiniz.

Sonraki adımlar

Tebrikler, uygulamanızı kapsüllediniz. Bu eğiticiyi tamamladınız. Buradan sonraki adım, 5. modülün codelab'inde (aşağıdaki bağlantı) Cloud Buildpack'lerle aynı işlemi nasıl yapacağınızı öğrenmek veya başka bir App Engine taşıma işlemi gerçekleştirmektir:

  • Henüz yapmadıysanız Python 3'e geçin. Örnek uygulama zaten 2.x ve 3.x ile uyumlu olduğundan tek değişiklik, Docker kullanıcılarının Dockerfile değerini Python 3 görüntüsü kullanacak şekilde güncellemeleriyle ilgilidir.
  • 5. Modül: Cloud Buildpack'ler ile Cloud Run'a taşıma
    • Cloud Buildpacks ile Cloud Run'da çalışacak şekilde uygulamanızı container'a dönüştürme
    • Docker, container'lar veya Dockerfile hakkında hiçbir şey bilmeniz gerekmez.
    • Uygulamanızı Python 3'e taşımış olmanız gerekir.
  • 7. Modül: App Engine Push Görev Sıraları ([push] görev sıralarını kullanıyorsanız gereklidir)
    • 1. modül uygulamasına App Engine taskqueue push görevleri ekler.
    • 8. modülde kullanıcıları Cloud Tasks'a geçişe hazırlar.
  • Modül 3:
    • Cloud NDB'den Cloud Datastore'a Datastore erişimini modernleştirme
    • Bu kitaplık, Python 3 App Engine uygulamaları ve App Engine olmayan uygulamalar için kullanılır.
  • 6. Modül: Cloud Firestore'a taşıma
    • Firebase özelliklerine erişmek için Cloud Firestore'a geçiş yapma
    • Cloud Firestore, Python 2'yi desteklese de bu Codelab yalnızca Python 3'te kullanılabilir.

7. Ek kaynaklar

App Engine taşıma modülüyle ilgili codelab sorunları/geri bildirimleri

Bu codelab ile ilgili sorun bulursanız lütfen göndermeden önce sorununuzu arayın. Arama yapma ve yeni sorunlar oluşturma bağlantıları:

Taşıma kaynakları

2. ve 3. Modül (BAŞLANGIÇ) ile 4. Modül (BİTİŞ) için depo klasörlerinin bağlantılarını aşağıdaki tabloda bulabilirsiniz. Bu dokümanlara, tüm App Engine codelab'lerinin taşınması için kullanılan depodan da erişilebilir. Bu depoyu klonlayabilir veya ZIP dosyası olarak indirebilirsiniz.

Codelab

Python 2

Python 3

2. Modül

code

(kod)

3. Modül

(kod)

code

4. Modül

code

code

App Engine ve Cloud Run kaynakları

Bu özel taşıma işlemiyle ilgili ek kaynakları aşağıda bulabilirsiniz: