Aracılığıyla paylaş


docker-compose.yml ile çok kapsayıcılı uygulamanızı tanımlama

İpucu

Bu içerik, .NET Docs'ta veya çevrimdışı olarak okunabilen ücretsiz indirilebilir bir PDF olarak sağlanan Kapsayıcılı .NET Uygulamaları için .NET Mikro Hizmet Mimarisi e-Kitabı'ndan bir alıntıdır.

Kapsayıcılı .NET Uygulamaları için .NET Mikro Hizmetler Mimarisi eKitap kapak küçük resmi.

Bu kılavuzda , docker-compose.yml dosyası 4. Adım bölümünde sunulmuştur. Çok kapsayıcılı bir Docker uygulaması oluştururken hizmetlerinizi docker-compose.yml içinde tanımlayın. Ancak docker-compose dosyalarını kullanmanın daha ayrıntılı bir şekilde keşfedilmesi gereken başka yolları da vardır.

Örneğin, çok kapsayıcılı uygulamanızı docker-compose.yml dosyasında nasıl dağıtmak istediğinizi açıkça açıklayabilirsiniz. İsteğe bağlı olarak, özel Docker görüntülerinizi nasıl oluşturabileceğinizi de açıklayabilirsiniz. (Docker CLI ile özel Docker görüntüleri de oluşturulabilir.)

Temel olarak, dağıtmak istediğiniz kapsayıcıların her birini ve her kapsayıcı dağıtımı için belirli özellikleri tanımlarsınız. Çok kapsayıcılı dağıtım açıklaması dosyanız olduğunda, çözümün tamamını docker-compose up CLI komutuyla tek bir eylemde dağıtabilir veya Visual Studio'dan saydam bir şekilde dağıtabilirsiniz. Aksi takdirde, komut satırından komutunu kullanarak kapsayıcıları birden çok adımda dağıtmak için Docker CLI'yi kullanmanız docker run gerekir. Bu nedenle, docker-compose.yml içinde tanımlanan her hizmet tam olarak bir görüntü veya derleme belirtmelidir. Diğer tuşlar isteğe bağlıdır ve komut satırı karşılıklarına docker run benzerdir.

Aşağıdaki YAML kodu, eShopOnContainers örneği için olası genel ancak tek bir docker-compose.yml dosyasının tanımıdır. Bu kod, eShopOnContainers'ın gerçek docker-compose dosyası değildir. Bunun yerine, daha sonra açıklanacağı gibi docker-compose dosyalarıyla çalışmanın en iyi yolu olmayan tek bir dosyada basitleştirilmiş ve birleştirilmiş bir sürümdür.

version: '3.4'

services:
  webmvc:
    image: eshop/webmvc
    environment:
      - CatalogUrl=http://catalog-api
      - OrderingUrl=http://ordering-api
      - BasketUrl=http://basket-api
    ports:
      - "5100:80"
    depends_on:
      - catalog-api
      - ordering-api
      - basket-api

  catalog-api:
    image: eshop/catalog-api
    environment:
      - ConnectionString=Server=sqldata;Initial Catalog=CatalogData;User Id=sa;Password=[PLACEHOLDER]
    expose:
      - "80"
    ports:
      - "5101:80"
    #extra hosts can be used for standalone SQL Server or services at the dev PC
    extra_hosts:
      - "CESARDLSURFBOOK:10.0.75.1"
    depends_on:
      - sqldata

  ordering-api:
    image: eshop/ordering-api
    environment:
      - ConnectionString=Server=sqldata;Database=Services.OrderingDb;User Id=sa;Password=[PLACEHOLDER]
    ports:
      - "5102:80"
    #extra hosts can be used for standalone SQL Server or services at the dev PC
    extra_hosts:
      - "CESARDLSURFBOOK:10.0.75.1"
    depends_on:
      - sqldata

  basket-api:
    image: eshop/basket-api
    environment:
      - ConnectionString=sqldata
    ports:
      - "5103:80"
    depends_on:
      - sqldata

  sqldata:
    environment:
      - SA_PASSWORD=[PLACEHOLDER]
      - ACCEPT_EULA=Y
    ports:
      - "5434:1433"

  basketdata:
    image: redis

Bu dosyadaki kök anahtar hizmetlerdir. Bu anahtarın altında, bu docker-compose.yml dosyasını kullanarak komutu yürütürken docker-compose up veya Visual Studio'dan dağıtım yaparken dağıtmak ve çalıştırmak istediğiniz hizmetleri tanımlarsınız. Bu durumda, docker-compose.yml dosyasında aşağıdaki tabloda açıklandığı gibi birden çok hizmet tanımlanmıştır.

Service name Açıklama
webmvc Sunucu tarafı C'den mikro hizmetleri kullanan ASP.NET Core MVC uygulamasını içeren kapsayıcı#
catalog-api Katalog ASP.NET Core Web API mikro hizmetini içeren kapsayıcı
ordering-api Sipariş ASP.NET Core Web API mikro hizmetini içeren kapsayıcı
sqldata Linux için SQL Server çalıştıran ve mikro hizmet veritabanlarını tutan kapsayıcı
basket-api Sepet ASP.NET Core Web API mikro hizmeti içeren kapsayıcı
basketdata REDIS önbellek hizmetini çalıştıran kapsayıcı; sepet veritabanı REDIS önbelleği olarak

Basit bir Web Hizmeti API kapsayıcısı

Tek bir kapsayıcıya odaklanan catalog-api container-microservice basit bir tanıma sahiptir:

  catalog-api:
    image: eshop/catalog-api
    environment:
      - ConnectionString=Server=sqldata;Initial Catalog=CatalogData;User Id=sa;Password=[PLACEHOLDER]
    expose:
      - "80"
    ports:
      - "5101:80"
    #extra hosts can be used for standalone SQL Server or services at the dev PC
    extra_hosts:
      - "CESARDLSURFBOOK:10.0.75.1"
    depends_on:
      - sqldata

Bu kapsayıcılı hizmet aşağıdaki temel yapılandırmaya sahiptir:

  • Özel eshop/catalog-api görüntüsünü temel alır. Basitlik adına, dosyada derleme: anahtar ayarı yoktur. Bu, görüntünün daha önce oluşturulmuş (docker derlemesi ile) veya herhangi bir Docker kayıt defterinden indirilmiş (docker pull komutuyla) olması gerektiği anlamına gelir.

  • Entity Framework tarafından katalog veri modelini içeren SQL Server örneğine erişmek için kullanılacak bağlantı dizesi ile ConnectionString adlı bir ortam değişkeni tanımlar. Bu durumda, aynı SQL Server kapsayıcısı birden çok veritabanı tutar. Bu nedenle, Docker için geliştirme makinenizde daha az belleğe ihtiyacınız vardır. Ancak, her mikro hizmet veritabanı için bir SQL Server kapsayıcısı da dağıtabilirsiniz.

  • SQL Server adı , Linux için SQL Server örneğini çalıştıran kapsayıcı için kullanılan aynı ad olan sqldata'dır. Bu uygundur; Bu ad çözümlemesini kullanabilmek (Docker konağı için iç) ağ adresini çözümlediğinden, diğer kapsayıcılardan eriştiğiniz kapsayıcıların iç IP'sini bilmeniz gerekmez.

bağlantı dizesi bir ortam değişkeni tarafından tanımlandığından, bu değişkeni farklı bir mekanizma aracılığıyla ve farklı bir zamanda ayarlayabilirsiniz. Örneğin, son konaklarda üretime dağıtım yaparken veya Azure DevOps Services'teki CI/CD işlem hatlarınızdan veya tercih ettiğiniz DevOps sisteminden farklı bir bağlantı dizesi ayarlayabilirsiniz.

  • Docker konağı içindeki catalog-api hizmetine iç erişim için 80 numaralı bağlantı noktasını kullanıma sunar. Konak şu anda linux için Docker görüntüsünü temel alan bir Linux VM'dir, ancak kapsayıcıyı bunun yerine bir Windows görüntüsünde çalışacak şekilde yapılandırabilirsiniz.

  • Kapsayıcıdaki kullanıma sunulan 80 numaralı bağlantı noktasını Docker konak makinesindeki (Linux VM) 5101 numaralı bağlantı noktasına iletir.

  • Web hizmetini sqldata hizmetine (kapsayıcıda çalışan Linux veritabanı için SQL Server örneği) bağlar. Bu bağımlılığı belirttiğinizde, sqldata kapsayıcısı başlatılana kadar catalog-api kapsayıcısı başlatılmaz; katalog-api'nin önce SQL Server veritabanının çalışır durumda olması gerektiğinden bu özellik önemlidir. Ancak Docker yalnızca kapsayıcı düzeyinde denetimler gerçekleştirdiğinden bu tür kapsayıcı bağımlılığı çoğu durumda yeterli değildir. Bazen hizmet (bu durumda SQL Server) hala hazır olmayabilir, bu nedenle istemci mikro hizmetlerinizde üstel geri alma ile yeniden deneme mantığı uygulamanız önerilir. Bu şekilde, bir bağımlılık kapsayıcısı kısa bir süre için hazır değilse, uygulama yine de dayanıklı olur.

  • Dış sunuculara erişime izin verecek şekilde yapılandırılmıştır: extra_hosts ayarı, geliştirme bilgisayarınızdaki yerel SQL Server örneği gibi Docker konağı dışındaki dış sunuculara veya makinelere (yani bir geliştirme Docker ana bilgisayarı olan varsayılan Linux VM'nin dışında) erişmenizi sağlar.

Ayrıca, aşağıdaki bölümlerde ele alacağımız daha gelişmiş docker-compose.yml başka ayarlar da vardır.

Birden çok ortamı hedeflemek için docker-compose dosyalarını kullanma

Dosyalar docker-compose.*.yml tanım dosyalarıdır ve bu biçimi anlayan birden çok altyapı tarafından kullanılabilir. En basit araç docker-compose komutudur.

Bu nedenle, docker-compose komutunu kullanarak aşağıdaki ana senaryoları hedefleyebilirsiniz.

Geliştirme ortamları

Uygulama geliştirirken, bir uygulamayı yalıtılmış bir geliştirme ortamında çalıştırabilmek önemlidir. Docker-compose CLI komutunu kullanarak bu ortamı veya kapakların altında docker-compose kullanan Visual Studio'yu oluşturabilirsiniz.

docker-compose.yml dosyası, uygulamanızın tüm hizmet bağımlılıklarını (diğer hizmetler, önbellek, veritabanları, kuyruklar vb.) yapılandırmanızı ve belgeleymenizi sağlar. docker-compose CLI komutunu kullanarak, tek bir komutla (docker-compose up) her bağımlılık için bir veya daha fazla kapsayıcı oluşturabilir ve başlatabilirsiniz.

docker-compose.yml dosyaları Docker altyapısı tarafından yorumlanan yapılandırma dosyalarıdır, ancak aynı zamanda çok kapsayıcılı uygulamanızın bileşimi hakkında kullanışlı belge dosyaları görevi görür.

Ortamları test etme

Birim testleri ve tümleştirme testleri, sürekli dağıtım (CD) veya sürekli tümleştirme (CI) işlemlerinin önemli bir parçasıdır. Bu otomatikleştirilmiş testler, kullanıcılardan veya uygulama verilerindeki diğer değişikliklerden etkilenmemeleri için yalıtılmış bir ortam gerektirir.

Docker Compose ile, aşağıdaki komutlar gibi komut isteminizden veya betiklerinizden birkaç komutla bu yalıtılmış ortamı çok kolay bir şekilde oluşturabilir ve yok edebilirsiniz:

docker-compose -f docker-compose.yml -f docker-compose-test.override.yml up -d
./run_unit_tests
docker-compose -f docker-compose.yml -f docker-compose-test.override.yml down

Üretim dağıtımları

Uzak docker altyapısına dağıtmak için Oluştur'u da kullanabilirsiniz. Tipik bir durum, tek bir Docker konak örneğine dağıtmaktır.

Başka bir düzenleyici (örneğin, Azure Service Fabric veya Kubernetes) kullanıyorsanız, docker-compose.yml'dakiler gibi kurulum ve meta veri yapılandırma ayarlarını diğer düzenleyicinin gerektirdiği biçimde eklemeniz gerekebilir.

Her durumda docker-compose geliştirme, test ve üretim iş akışları için kullanışlı bir araç ve meta veri biçimidir, ancak üretim iş akışı kullandığınız düzenleyiciye göre farklılık gösterebilir.

Çeşitli ortamları işlemek için birden çok docker-compose dosyası kullanma

Farklı ortamları hedeflerken birden çok oluşturma dosyası kullanmanız gerekir. Bu yaklaşım, ortama bağlı olarak birden çok yapılandırma değişkeni oluşturmanıza olanak tanır.

Temel docker-compose dosyasını geçersiz kılma

Önceki bölümlerde gösterilen basitleştirilmiş örneklerde olduğu gibi tek bir docker-compose.yml dosyası kullanabilirsiniz. Ancak, çoğu uygulama için bu önerilmez.

Oluştur varsayılan olarak, bir docker-compose.yml ve isteğe bağlı bir docker-compose.override.yml dosyası olmak üzere iki dosyayı okur. Şekil 6-11'de gösterildiği gibi, Visual Studio'yu kullanırken ve Docker desteğini etkinleştirirken, Visual Studio uygulamada hata ayıklamak için ek bir docker-compose.vs.debug.g.yml dosyası da oluşturur. Bu dosyaya ana çözüm klasöründeki obj\Docker\ klasöründe göz atabilirsiniz.

Docker compose projesindeki dosyalar.

Şekil 6-11. Visual Studio 2019'da docker-compose dosyaları

docker-compose proje dosyası yapısı:

  • .dockerignore - dosyaları yoksaymak için kullanılır
  • docker-compose.yml - mikro hizmetler oluşturmak için kullanılır
  • docker-compose.override.yml - mikro hizmet ortamını yapılandırmak için kullanılır

Docker-compose dosyalarını Visual Studio Code veya Sublime gibi herhangi bir düzenleyiciyle düzenleyebilir ve uygulamayı docker-compose up komutuyla çalıştırabilirsiniz.

Kural gereği, docker-compose.yml dosyası temel yapılandırmanızı ve diğer statik ayarlarınızı içerir. Bu, hizmet yapılandırmasının hedeflediğiniz dağıtım ortamına bağlı olarak değişmemesi gerektiği anlamına gelir.

adından da anlaşılacağı gibi docker-compose.override.yml dosyası, dağıtım ortamına bağlı yapılandırma gibi temel yapılandırmayı geçersiz kılan yapılandırma ayarlarını içerir. Farklı adlara sahip birden çok geçersiz kılma dosyanız da olabilir. Geçersiz kılma dosyaları genellikle uygulamanın ihtiyaç duyduğu ancak bir ortama veya dağıtıma özgü ek bilgiler içerir.

Birden çok ortamı hedefleme

Tipik bir kullanım örneği, üretim, hazırlama, CI veya geliştirme gibi birden çok ortamı hedeflemek için birden çok oluşturma dosyası tanımlamanızdır. Bu farklılıkları desteklemek için Oluşturma yapılandırmanızı Şekil 6-12'de gösterildiği gibi birden çok dosyaya bölebilirsiniz.

Temel dosyayı geçersiz kılmak için ayarlanan üç docker-compose dosyasının diyagramı.

Şekil 6-12. Temel docker-compose.yml dosyasındaki değerleri geçersiz kılmaya yönelik birden çok docker-compose dosyası

Farklı ortamları işlemek için birden çok docker-compose*.yml dosyasını birleştirebilirsiniz. Temel docker-compose.yml dosyasıyla başlarsınız. Bu temel dosya, ortama bağlı olarak değişmeyen temel veya statik yapılandırma ayarlarını içerir. Örneğin, eShopOnContainers uygulaması temel dosya olarak aşağıdaki docker-compose.yml dosyasına (daha az hizmetle basitleştirilmiş) sahiptir.

#docker-compose.yml (Base)
version: '3.4'
services:
  basket-api:
    image: eshop/basket-api:${TAG:-latest}
    build:
      context: .
      dockerfile: src/Services/Basket/Basket.API/Dockerfile
    depends_on:
      - basketdata
      - identity-api
      - rabbitmq

  catalog-api:
    image: eshop/catalog-api:${TAG:-latest}
    build:
      context: .
      dockerfile: src/Services/Catalog/Catalog.API/Dockerfile
    depends_on:
      - sqldata
      - rabbitmq

  marketing-api:
    image: eshop/marketing-api:${TAG:-latest}
    build:
      context: .
      dockerfile: src/Services/Marketing/Marketing.API/Dockerfile
    depends_on:
      - sqldata
      - nosqldata
      - identity-api
      - rabbitmq

  webmvc:
    image: eshop/webmvc:${TAG:-latest}
    build:
      context: .
      dockerfile: src/Web/WebMVC/Dockerfile
    depends_on:
      - catalog-api
      - ordering-api
      - identity-api
      - basket-api
      - marketing-api

  sqldata:
    image: mcr.microsoft.com/mssql/server:2019-latest

  nosqldata:
    image: mongo

  basketdata:
    image: redis

  rabbitmq:
    image: rabbitmq:3-management

Temel docker-compose.yml dosyasındaki değerler farklı hedef dağıtım ortamları nedeniyle değişmemelidir.

Örneğin webmvc hizmet tanımına odaklanırsanız, hangi ortamı hedeflediğiniz fark etmez, bu bilgilerin ne kadar aynı olduğunu görebilirsiniz. Aşağıdaki bilgilere sahipsiniz:

  • Hizmet adı: webmvc.

  • Kapsayıcının özel görüntüsü: eshop/webmvc.

  • Hangi Dockerfile dosyasının kullanılacağını gösteren özel Docker görüntüsünü derleme komutu.

  • Diğer hizmetlere bağımlılıklar olduğundan, diğer bağımlılık kapsayıcıları başlatılana kadar bu kapsayıcı başlatılmaz.

Ek yapılandırmanız olabilir, ancak önemli olan temel docker-compose.yml dosyasında yalnızca ortamlar arasında ortak olan bilgileri ayarlamak istemenizdir. Ardından üretim veya hazırlama için docker-compose.override.yml veya benzer dosyalara her ortam için özel yapılandırma yerleştirmelisiniz.

Genellikle docker-compose.override.yml, eShopOnContainers'dan alınan aşağıdaki örnekte olduğu gibi geliştirme ortamınız için kullanılır:

#docker-compose.override.yml (Extended config for DEVELOPMENT env.)
version: '3.4'

services:
# Simplified number of services here:

  basket-api:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=http://0.0.0.0:80
      - ConnectionString=${ESHOP_AZURE_REDIS_BASKET_DB:-basketdata}
      - identityUrl=http://identity-api
      - IdentityUrlExternal=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5105
      - EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
      - EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
      - EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
      - AzureServiceBusEnabled=False
      - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
      - OrchestratorType=${ORCHESTRATOR_TYPE}
      - UseLoadTest=${USE_LOADTEST:-False}

    ports:
      - "5103:80"

  catalog-api:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=http://0.0.0.0:80
      - ConnectionString=${ESHOP_AZURE_CATALOG_DB:-Server=sqldata;Database=Microsoft.eShopOnContainers.Services.CatalogDb;User Id=sa;Password=[PLACEHOLDER]}
      - PicBaseUrl=${ESHOP_AZURE_STORAGE_CATALOG_URL:-http://host.docker.internal:5202/api/v1/catalog/items/[0]/pic/}
      - EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
      - EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
      - EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
      - AzureStorageAccountName=${ESHOP_AZURE_STORAGE_CATALOG_NAME}
      - AzureStorageAccountKey=${ESHOP_AZURE_STORAGE_CATALOG_KEY}
      - UseCustomizationData=True
      - AzureServiceBusEnabled=False
      - AzureStorageEnabled=False
      - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
      - OrchestratorType=${ORCHESTRATOR_TYPE}
    ports:
      - "5101:80"

  marketing-api:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=http://0.0.0.0:80
      - ConnectionString=${ESHOP_AZURE_MARKETING_DB:-Server=sqldata;Database=Microsoft.eShopOnContainers.Services.MarketingDb;User Id=sa;Password=[PLACEHOLDER]}
      - MongoConnectionString=${ESHOP_AZURE_COSMOSDB:-mongodb://nosqldata}
      - MongoDatabase=MarketingDb
      - EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
      - EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME}
      - EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD}
      - identityUrl=http://identity-api
      - IdentityUrlExternal=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5105
      - CampaignDetailFunctionUri=${ESHOP_AZUREFUNC_CAMPAIGN_DETAILS_URI}
      - PicBaseUrl=${ESHOP_AZURE_STORAGE_MARKETING_URL:-http://host.docker.internal:5110/api/v1/campaigns/[0]/pic/}
      - AzureStorageAccountName=${ESHOP_AZURE_STORAGE_MARKETING_NAME}
      - AzureStorageAccountKey=${ESHOP_AZURE_STORAGE_MARKETING_KEY}
      - AzureServiceBusEnabled=False
      - AzureStorageEnabled=False
      - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
      - OrchestratorType=${ORCHESTRATOR_TYPE}
      - UseLoadTest=${USE_LOADTEST:-False}
    ports:
      - "5110:80"

  webmvc:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=http://0.0.0.0:80
      - PurchaseUrl=http://webshoppingapigw
      - IdentityUrl=http://10.0.75.1:5105
      - MarketingUrl=http://webmarketingapigw
      - CatalogUrlHC=http://catalog-api/hc
      - OrderingUrlHC=http://ordering-api/hc
      - IdentityUrlHC=http://identity-api/hc
      - BasketUrlHC=http://basket-api/hc
      - MarketingUrlHC=http://marketing-api/hc
      - PaymentUrlHC=http://payment-api/hc
      - SignalrHubUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5202
      - UseCustomizationData=True
      - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY}
      - OrchestratorType=${ORCHESTRATOR_TYPE}
      - UseLoadTest=${USE_LOADTEST:-False}
    ports:
      - "5100:80"
  sqldata:
    environment:
      - SA_PASSWORD=[PLACEHOLDER]
      - ACCEPT_EULA=Y
    ports:
      - "5433:1433"
  nosqldata:
    ports:
      - "27017:27017"
  basketdata:
    ports:
      - "6379:6379"
  rabbitmq:
    ports:
      - "15672:15672"
      - "5672:5672"

Bu örnekte, geliştirme geçersiz kılma yapılandırması bazı bağlantı noktalarını konağa gösterir, yeniden yönlendirme URL'leri ile ortam değişkenlerini tanımlar ve geliştirme ortamı için bağlantı dizesi belirtir. Bu ayarların tümü yalnızca geliştirme ortamına yöneliktir.

Komutunu çalıştırdığınızda docker-compose up (veya Visual Studio'dan başlattığınızda), komut her iki dosyayı birleştiriyormuş gibi geçersiz kılmaları otomatik olarak okur.

Üretim ortamı için farklı yapılandırma değerlerine, bağlantı noktalarına veya bağlantı dizesi sahip başka bir Compose dosyası istediğinizi varsayalım. Farklı ayarlara ve ortam değişkenlerine sahip adlı docker-compose.prod.yml dosya gibi başka bir geçersiz kılma dosyası oluşturabilirsiniz. Bu dosya farklı bir Git deposunda depolanabilir veya farklı bir ekip tarafından yönetilip güvenli hale getirilebilir.

Belirli bir geçersiz kılma dosyasıyla dağıtma

Birden çok geçersiz kılma dosyası veya farklı ada sahip bir geçersiz kılma dosyası kullanmak için docker-compose komutuyla -f seçeneğini kullanabilir ve dosyaları belirtebilirsiniz. Oluştur, dosyaları komut satırında belirtilen sırayla birleştirir. Aşağıdaki örnekte geçersiz kılma dosyalarıyla dağıtma gösterilmektedir.

docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

Docker-compose dosyalarında ortam değişkenlerini kullanma

Özellikle üretim ortamlarında, önceki örneklerde gösterildiği gibi ortam değişkenlerinden yapılandırma bilgilerini alabilmek kullanışlıdır. ${MY_VAR} söz dizimini kullanarak docker-compose dosyalarınızdaki bir ortam değişkenine başvurabilirsiniz. bir docker-compose.prod.yml dosyasındaki aşağıdaki satır, ortam değişkeninin değerine nasıl başvuracaklarını gösterir.

IdentityUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105

Ortam değişkenleri, konak ortamınıza (Linux, Windows, Bulut kümesi vb.) bağlı olarak farklı şekillerde oluşturulur ve başlatılır. Ancak, kullanışlı bir yaklaşım bir .env dosyası kullanmaktır. Docker-compose dosyaları.env dosyasında varsayılan ortam değişkenlerini bildirmeyi destekler. Ortam değişkenleri için bu değerler varsayılan değerlerdir. Ancak ortamlarınızın her birinde tanımlamış olabileceğiniz değerler (kümenizdeki konak işletim sistemi veya ortam değişkenleri) tarafından geçersiz kılınabilir. Bu .env dosyasını docker-compose komutunun yürütüldüğü klasöre yerleştirirsiniz.

Aşağıdaki örnekte, eShopOnContainers uygulaması için .env dosyası gibi bir .env dosyası gösterilmektedir.

# .env file

ESHOP_EXTERNAL_DNS_NAME_OR_IP=host.docker.internal

ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP=10.121.122.92

Docker-compose bir .env dosyasındaki her satırın variable>=<value> biçiminde <olmasını bekler.

Çalışma zamanı ortamında ayarlanan değerler her zaman .env dosyasının içinde tanımlanan değerleri geçersiz kılar. Benzer şekilde, komut satırı bağımsız değişkenleri aracılığıyla geçirilen değerler de .env dosyasında ayarlanan varsayılan değerleri geçersiz kılar.

Ek kaynaklar

İyileştirilmiş ASP.NET Core Docker görüntüleri oluşturma

docker ve .NET'i internet üzerindeki kaynaklarda keşfediyorsanız, kaynağınızı bir kapsayıcıya kopyalayarak Docker görüntüsü oluşturmanın basitliğini gösteren Dockerfiles'ı bulacaksınız. Bu örneklerde basit bir yapılandırma kullanarak uygulamanızla birlikte paketlenmiş ortamı içeren bir Docker görüntüsüne sahip olabilirsiniz. Aşağıdaki örnekte bu damarda basit bir Dockerfile gösterilmektedir.

FROM mcr.microsoft.com/dotnet/sdk:8.0
WORKDIR /app
ENV ASPNETCORE_URLS http://+:80
EXPOSE 80
COPY . .
RUN dotnet restore
ENTRYPOINT ["dotnet", "run"]

Bunun gibi bir Dockerfile çalışır. Ancak görüntülerinizi, özellikle de üretim görüntülerinizi önemli ölçüde iyileştirebilirsiniz.

Kapsayıcı ve mikro hizmetler modelinde kapsayıcıları sürekli olarak başlatırsınız. Kapsayıcıları kullanmanın tipik yolu, kapsayıcı atılabilir olduğundan uyuyan kapsayıcıyı yeniden başlatmaz. Düzenleyiciler (Kubernetes ve Azure Service Fabric gibi) yeni görüntü örnekleri oluşturur. Bunun anlamı, örnek oluşturma işleminin daha hızlı olması için, oluşturulduğu sırada uygulamayı önceden derleyerek iyileştirmeniz gerektiğidir. Kapsayıcı başlatıldığında, çalıştırılmaya hazır olmalıdır. .NET ve Docker hakkındaki blog gönderilerinde görebileceğiniz gibi ve dotnet build CLI komutlarını kullanarak dotnet restore çalışma zamanında geri yüklemeyin ve derleyin.

.NET ekibi, .NET ve ASP.NET Core'un kapsayıcı için iyileştirilmiş bir çerçeve haline getirmek için önemli çalışmalar yapıyor. .NET yalnızca küçük bellek ayak izine sahip basit bir çerçeve değildir; Ekip, üç ana senaryo için en iyi duruma getirilmiş Docker görüntülerine odaklanmış ve bunları sürüm 2.1'den başlayarak dotnet/ konumundaki Docker Hub kayıt defterinde yayımlamıştır:

  • Geliştirme: Öncelik, değişiklikleri hızla yineleme ve hata ayıklama özelliğidir ve boyut ikincildir.
  • Derleme: Öncelik uygulamayı derlemektir ve görüntü ikili dosyaları ve ikili dosyaları iyileştirmek için diğer bağımlılıkları içerir.
  • Üretim: Odak, kapsayıcıların hızlı dağıtılması ve başlatılmasıdır, bu nedenle bu görüntüler uygulamayı çalıştırmak için gereken ikili dosyalar ve içerikle sınırlıdır.

.NET ekibi dotnet/ içinde bazı temel çeşitlemeler sağlar, örneğin:

  • sdk: geliştirme ve derleme senaryoları için
  • aspnet: ASP.NET üretim senaryoları için
  • çalışma zamanı: .NET üretim senaryoları için
  • runtime-deps: bağımsız uygulamaların üretim senaryoları için

Daha hızlı başlangıç için çalışma zamanı görüntüleri de aspnetcore_urls otomatik olarak 80 numaralı bağlantı noktasına ayarlar ve Ngen kullanarak derlemelerin yerel görüntü önbelleğini oluşturur.

Ek kaynaklar