Bagikan melalui


Menentukan aplikasi multi-kontainer Anda dengan docker-compose.yml

Tip

Konten ini adalah kutipan dari eBook, .NET Microservices Architecture for Containerized .NET Applications, tersedia di .NET Docs atau sebagai PDF yang dapat diunduh gratis dan dapat dibaca secara offline.

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

Dalam panduan ini, file docker-compose.yml diperkenalkan di bagian Langkah 4. Tentukan layanan Anda di docker-compose.yml saat membangun aplikasi Docker multikontainer. Namun, ada cara tambahan untuk menggunakan file docker-compose yang layak dijelajahi secara lebih detail.

Misalnya, Anda dapat secara eksplisit menjelaskan bagaimana Anda ingin menyebarkan aplikasi multikontainer Anda di file docker-compose.yml. Secara opsional, Anda juga dapat menjelaskan bagaimana Anda akan membangun gambar Docker kustom Anda. (Gambar Docker kustom juga dapat dibangun dengan Docker CLI.)

Pada dasarnya, Anda menentukan setiap kontainer yang ingin Anda sebarkan ditambah karakteristik tertentu untuk setiap penyebaran kontainer. Setelah Anda memiliki file deskripsi penyebaran multikontainer, Anda dapat menyebarkan seluruh solusi dalam satu tindakan yang diorkestrasi oleh perintah CLI docker-compose up, atau Anda dapat menyebarkannya secara transparan dari Visual Studio. Jika tidak, Anda harus menggunakan Docker CLI untuk menyebarkan kontainer demi kontainer dalam beberapa langkah dengan menggunakan docker run perintah dari baris perintah. Oleh karena itu, setiap layanan yang ditentukan dalam docker-compose.yml harus menentukan persis satu gambar atau build. Kunci lain bersifat opsional, dan dianalogikan dengan docker run pasangan baris perintahnya.

Kode YAML berikut adalah definisi dari kemungkinan file docker-compose.yml global tetapi tunggal untuk sampel eShopOnContainers. Kode ini bukan file docker-compose aktual dari eShopOnContainers. Sebaliknya, ini adalah versi yang disederhanakan dan dikonsolidasikan dalam satu file, yang bukan cara terbaik untuk bekerja dengan file docker-compose, seperti yang akan dijelaskan nanti.

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

Kunci akar dalam file ini adalah layanan. Di bawah kunci itu, Anda menentukan layanan yang ingin Anda sebarkan dan jalankan saat menjalankan docker-compose up perintah atau saat Anda menyebarkan dari Visual Studio dengan menggunakan file docker-compose.yml ini. Dalam hal ini, file docker-compose.yml memiliki beberapa layanan yang ditentukan, seperti yang dijelaskan dalam tabel berikut.

Nama layanan Deskripsi
webmvc Kontainer termasuk aplikasi ASP.NET Core MVC yang menggunakan layanan mikro dari sisi server C#
catalog-api Kontainer termasuk layanan mikro Catalog ASP.NET Core Web API
ordering-api Kontainer termasuk layanan mikro Ordering ASP.NET Core Web API
sqldata Kontainer yang berjalan SQL Server untuk Linux, menyimpan database layanan mikro
basket-api Kontainer dengan layanan mikro Basket ASP.NET Core Web API
basketdata Kontainer yang menjalankan layanan cache REDIS, dengan database ke basket sebagai cache REDIS

Kontainer API Layanan Web sederhana

Berfokus pada satu kontainer, kontainer-api catalog-microservice memiliki definisi yang mudah:

  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

Layanan dalam kontainer ini memiliki konfigurasi dasar berikut:

  • Ini didasarkan pada gambar eshop/catalog-api kustom. Demi kesederhanaan, tidak ada build: pengaturan kunci dalam file. Ini berarti bahwa gambar harus telah dibuat sebelumnya (dengan build docker) atau telah diunduh (dengan perintah penarikan docker) dari daftar Docker apa pun.

  • Kode ini menentukan variabel lingkungan bernama ConnectionString dengan string koneksi yang akan digunakan oleh Kerangka Kerja Entitas untuk mengakses instans SQL Server yang berisi model data katalog. Dalam hal ini, kontainer SQL Server yang sama memegang beberapa database. Oleh karena itu, Anda membutuhkan lebih sedikit memori di mesin pengembangan Anda untuk Docker. Namun, Anda juga dapat menyebarkan satu kontainer SQL Server untuk setiap database layanan mikro.

  • Nama SQL Server adalah sqldata, yang merupakan nama yang sama yang digunakan untuk kontainer yang menjalankan instans SQL Server untuk Linux. Ini nyaman; dapat menggunakan resolusi nama ini (internal ke host Docker) akan menyelesaikan alamat jaringan sehingga Anda tidak perlu mengetahui IP internal untuk kontainer yang Anda akses dari kontainer lain.

Karena string koneksi didefinisikan oleh variabel lingkungan, Anda dapat mengatur variabel tersebut melalui mekanisme yang berbeda dan pada waktu yang berbeda. Misalnya, Anda dapat mengatur string koneksi yang berbeda saat menyebarkan ke produksi di host akhir, atau dengan melakukannya dari alur CI/CD Anda di Azure DevOps Services atau sistem DevOps pilihan Anda.

  • Ini mengekspos port 80 untuk akses internal ke layanan catalog-api dalam host Docker. Host saat ini adalah VM Linux karena didasarkan pada gambar Docker untuk Linux, tetapi Anda dapat mengonfigurasi kontainer untuk berjalan pada gambar Windows sebagai gantinya.

  • Ini meneruskan port 80 yang diekspos pada kontainer ke port 5101 pada komputer host Docker (Linux VM).

  • Ini menautkan layanan web ke layanan sqldata (instans SQL Server untuk database Linux yang berjalan dalam kontainer). Ketika Anda menentukan dependensi ini, kontainer catalog-api tidak akan dimulai sampai kontainer sqldata telah dimulai; Aspek ini penting karena catalog-api harus mengaktifkan dan menjalankan database SQL Server terlebih dahulu. Namun, dependensi kontainer semacam ini tidak cukup dalam banyak kasus, karena Docker hanya memeriksa di tingkat kontainer. Terkadang layanan (dalam hal ini SQL Server) mungkin masih belum siap, jadi disarankan untuk menerapkan logika coba lagi dengan backoff eksponensial di layanan mikro klien Anda. Dengan begitu, jika kontainer dependensi tidak siap untuk waktu yang singkat, aplikasi akan tetap tangguh.

  • Ini dikonfigurasi untuk memungkinkan akses ke server eksternal: pengaturan extra_hosts memungkinkan Anda mengakses server atau mesin eksternal di luar host Docker (yaitu, di luar VM Linux default, yang merupakan host Docker pengembangan), seperti instans SQL Server lokal pada PC pengembangan Anda.

Ada juga pengaturan lain yang lebih canggih docker-compose.yml yang akan kita bahas di bagian berikut.

Menggunakan file docker-compose untuk menargetkan beberapa lingkungan

docker-compose.*.ymlFile adalah file definisi dan dapat digunakan oleh beberapa infrastruktur yang memahami format tersebut. Alat yang paling mudah adalah perintah docker-compose.

Oleh karena itu, dengan menggunakan perintah docker-compose, Anda dapat menargetkan skenario utama berikut.

Lingkungan pengembangan

Ketika Anda mengembangkan aplikasi, penting untuk dapat menjalankan aplikasi di lingkungan pengembangan yang terisolasi. Anda dapat menggunakan perintah CLI docker-compose untuk membuat lingkungan atau Visual Studio, yang menggunakan docker-compose di bawah sampul.

File docker-compose.yml memungkinkan Anda mengonfigurasi dan mendokumentasikan semua dependensi layanan aplikasi Anda (layanan lain, cache, database, antrean, dll.). Dengan menggunakan perintah CLI docker-compose, Anda dapat membuat dan memulai satu atau beberapa kontainer untuk setiap dependensi dengan satu perintah (docker-compose up).

File docker-compose.yml adalah file konfigurasi yang ditafsirkan oleh mesin Docker tetapi juga berfungsi sebagai file dokumentasi yang nyaman tentang komposisi aplikasi multikontainer Anda.

Lingkungan pengujian

Bagian penting dari setiap proses penyebaran berkelanjutan (CD) atau integrasi berkelanjutan (CI) adalah pengujian unit dan pengujian integrasi. Pengujian otomatis ini memerlukan lingkungan yang terisolasi sehingga tidak terpengaruh oleh pengguna atau perubahan lain dalam data aplikasi.

Dengan Docker Compose, Anda dapat membuat dan menghancurkan lingkungan yang terisolasi dengan sangat mudah dalam beberapa perintah dari prompt perintah atau skrip Anda, seperti perintah berikut:

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

Penyebaran produksi

Anda juga dapat menggunakan Compose untuk menyebarkan ke Docker Engine jarak jauh. Kasus umumnya adalah menyebarkan ke satu instans host Docker (seperti VM produksi atau server yang disediakan dengan Docker Machine).

Jika Anda menggunakan orkestrator lain (Azure Service Fabric, Kubernetes, dll.), Anda mungkin perlu menambahkan pengaturan konfigurasi penyiapan dan metadata seperti yang ada di docker-compose.yml, tetapi dalam format yang diperlukan oleh orkestrator lain.

Bagaimanapun, docker-compose adalah alat dan format metadata yang nyaman untuk alur kerja pengembangan, pengujian, dan produksi, meskipun alur kerja produksi mungkin berbeda pada orkestrator yang Anda gunakan.

Menggunakan beberapa file docker-compose untuk menangani beberapa lingkungan

Saat menargetkan lingkungan yang berbeda, Anda harus menggunakan beberapa file tulis. Pendekatan ini memungkinkan Anda membuat beberapa varian konfigurasi tergantung pada lingkungan.

Mengesampingkan file docker-compose dasar

Anda dapat menggunakan satu file docker-compose.yml seperti dalam contoh yang disederhanakan yang ditunjukkan di bagian sebelumnya. Namun, itu tidak disarankan untuk sebagian besar aplikasi.

Secara default, Compose membaca dua file, docker-compose.yml dan file docker-compose.override.yml opsional. Seperti yang ditunjukkan pada Gambar 6-11, saat Anda menggunakan Visual Studio dan mengaktifkan dukungan Docker, Visual Studio juga membuat file docker-compose.vs.debug.g.yml tambahan untuk men-debug aplikasi, Anda dapat melihat file ini di folder obj\Docker\ di folder solusi utama.

Files in a docker compose project.

Gambar 6-11. file docker-compose di Visual Studio 2019

docker-compose struktur file proyek:

  • .dockerignore - digunakan untuk mengabaikan file
  • docker-compose.yml - digunakan untuk menyusun layanan mikro
  • docker-compose.override.yml - digunakan untuk mengonfigurasi lingkungan layanan mikro

Anda dapat mengedit file docker-compose dengan editor apa pun, seperti Visual Studio Code atau Sublime, dan menjalankan aplikasi dengan perintah docker-compose up.

Menurut konvensi, file docker-compose.yml berisi konfigurasi dasar Anda dan pengaturan statis lainnya. Itu berarti bahwa konfigurasi layanan tidak boleh berubah tergantung pada lingkungan penyebaran yang Anda targetkan.

File docker-compose.override.yml, seperti namanya, berisi pengaturan konfigurasi yang mengambil alih konfigurasi dasar, seperti konfigurasi yang bergantung pada lingkungan penyebaran. Anda juga dapat memiliki beberapa file penimpaan dengan nama yang berbeda. File penimpaan biasanya berisi informasi tambahan yang diperlukan oleh aplikasi tetapi khusus untuk lingkungan atau penyebaran.

Menargetkan beberapa lingkungan

Kasus penggunaan umum adalah ketika Anda menentukan beberapa file tulis sehingga Anda dapat menargetkan beberapa lingkungan, seperti produksi, penahapan, CI, atau pengembangan. Untuk mendukung perbedaan ini, Anda dapat membagi konfigurasi Buat menjadi beberapa file, seperti yang ditunjukkan pada Gambar 6-12.

Diagram of three docker-compose files set to override the base file.

Gambar 6-12. Beberapa file docker-compose mengambil alih nilai di file docker-compose.yml dasar

Anda dapat menggabungkan beberapa file docker-compose*.yml untuk menangani lingkungan yang berbeda. Anda mulai dengan file docker-compose.yml dasar. File dasar ini berisi pengaturan konfigurasi dasar atau statis yang tidak berubah tergantung pada lingkungan. Misalnya, aplikasi eShopOnContainers memiliki file docker-compose.yml berikut (disederhanakan dengan lebih sedikit layanan) sebagai file dasar.

#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

Nilai dalam file docker-compose.yml dasar tidak boleh berubah karena lingkungan penyebaran target yang berbeda.

Jika Anda fokus pada definisi layanan webmvc, misalnya, Anda dapat melihat bagaimana informasi itu jauh sama tidak peduli lingkungan apa yang mungkin Anda targetkan. Anda memiliki informasi berikut:

  • Nama layanan: webmvc.

  • Gambar kustom kontainer: eshop/webmvc.

  • Perintah untuk membangun gambar Docker kustom, menunjukkan Dockerfile mana yang akan digunakan.

  • Dependensi pada layanan lain, sehingga kontainer ini tidak dimulai sampai kontainer dependensi lainnya dimulai.

Anda dapat memiliki konfigurasi tambahan, tetapi poin pentingnya adalah bahwa dalam file docker-compose.yml dasar, Anda hanya ingin mengatur informasi yang umum di seluruh lingkungan. Kemudian di docker-compose.override.yml atau file serupa untuk produksi atau penahapan, Anda harus menempatkan konfigurasi yang khusus untuk setiap lingkungan.

Biasanya, docker-compose.override.yml digunakan untuk lingkungan pengembangan Anda, seperti dalam contoh berikut dari eShopOnContainers:

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

Dalam contoh ini, konfigurasi penimpaan pengembangan mengekspos beberapa port ke host, menentukan variabel lingkungan dengan URL pengalihan, dan menentukan string koneksi untuk lingkungan pengembangan. Semua pengaturan ini hanya untuk lingkungan pengembangan.

Saat Anda menjalankan docker-compose up (atau meluncurkannya dari Visual Studio), perintah membaca penimpaan secara otomatis seolah-olah menggabungkan kedua file.

Misalkan Anda menginginkan file Buat lain untuk lingkungan produksi, dengan nilai konfigurasi, port, atau string koneksi yang berbeda. Anda dapat membuat file penimpaan lain, seperti file bernama docker-compose.prod.yml dengan pengaturan dan variabel lingkungan yang berbeda. File tersebut mungkin disimpan dalam repositori Git yang berbeda atau dikelola dan diamankan oleh tim yang berbeda.

Cara menyebarkan dengan file penimpaan tertentu

Untuk menggunakan beberapa file ambil alih, atau file ambil alih dengan nama yang berbeda, Anda dapat menggunakan opsi -f dengan perintah docker-compose dan menentukan file. Tulis menggabungkan file dalam urutan yang ditentukan pada baris perintah. Contoh berikut menunjukkan cara menyebarkan dengan mengambil alih file.

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

Menggunakan variabel lingkungan dalam file docker-compose

Sangat nyaman, terutama di lingkungan produksi, untuk dapat mendapatkan informasi konfigurasi dari variabel lingkungan, seperti yang telah kami tunjukkan dalam contoh sebelumnya. Anda dapat mereferensikan variabel lingkungan dalam file docker-compose Anda menggunakan sintaks ${MY_VAR}. Baris berikut dari file docker-compose.prod.yml menunjukkan cara mereferensikan nilai variabel lingkungan.

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

Variabel lingkungan dibuat dan diinisialisasi dengan cara yang berbeda, tergantung pada lingkungan host Anda (Linux, Windows, kluster Cloud, dll.). Namun, pendekatan yang nyaman adalah menggunakan file .env. File docker-compose mendukung mendeklarasikan variabel lingkungan default dalam file .env. Nilai-nilai untuk variabel lingkungan ini adalah nilai default. Tetapi mereka dapat ditimpa oleh nilai yang mungkin telah Anda tentukan di setiap lingkungan Anda (OS host atau variabel lingkungan dari kluster Anda). Anda menempatkan file .env ini di folder tempat perintah docker-compose dijalankan.

Contoh berikut menunjukkan file .env seperti file .env untuk aplikasi eShopOnContainers.

# .env file

ESHOP_EXTERNAL_DNS_NAME_OR_IP=host.docker.internal

ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP=10.121.122.92

Docker-compose mengharapkan setiap baris dalam file .env berada dalam format <variable>=<value>.

Nilai yang diatur dalam lingkungan run-time selalu mengambil alih nilai yang ditentukan di dalam file .env. Dengan cara yang sama, nilai yang diteruskan melalui argumen baris perintah juga mengambil alih nilai default yang diatur dalam file .env.

Sumber daya tambahan

Membangun gambar ASP.NET Core Docker yang dioptimalkan

Jika Anda menjelajahi Docker dan .NET pada sumber di Internet, Anda akan menemukan Dockerfiles yang menunjukkan kesederhanaan membangun gambar Docker dengan menyalin sumber Anda ke dalam kontainer. Contoh-contoh ini menyarankan bahwa dengan menggunakan konfigurasi sederhana, Anda dapat memiliki gambar Docker dengan lingkungan yang dikemas dengan aplikasi Anda. Contoh berikut menunjukkan Dockerfile sederhana dalam vena ini.

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

Dockerfile seperti ini akan berhasil. Namun, Anda dapat mengoptimalkan gambar Anda secara substansial, terutama gambar produksi Anda.

Dalam model kontainer dan layanan mikro, Anda terus memulai kontainer. Cara umum menggunakan kontainer tidak menghidupkan ulang kontainer tidur, karena kontainer dapat digunakan. Orkestrator (seperti Kubernetes dan Azure Service Fabric) membuat instans gambar baru. Artinya, Anda perlu mengoptimalkan dengan melakukan prakompilasi aplikasi saat dibangun sehingga proses instansiasi akan lebih cepat. Ketika kontainer dimulai, kontainer harus siap dijalankan. Jangan pulihkan dan kompilasi pada waktu proses menggunakan dotnet restore perintah CLI dan dotnet build seperti yang mungkin Anda lihat di posting blog tentang .NET dan Docker.

Tim .NET telah melakukan pekerjaan penting untuk menjadikan .NET dan ASP.NET Core sebagai kerangka kerja yang dioptimalkan kontainer. Tidak hanya .NET kerangka kerja ringan dengan jejak memori kecil; tim telah berfokus pada gambar Docker yang dioptimalkan untuk tiga skenario utama dan menerbitkannya di daftar Docker Hub di dotnet/, dimulai dengan versi 2.1:

  1. Pengembangan: Prioritasnya adalah kemampuan untuk dengan cepat melakukan iterasi dan debug perubahan, dan ketika ukurannya sekunder.

  2. Build: Prioritasnya adalah mengkompilasi aplikasi, dan gambar mencakup biner dan dependensi lainnya untuk mengoptimalkan biner.

  3. Produksi: Fokusnya adalah menyebarkan dan memulai kontainer dengan cepat, sehingga gambar-gambar ini terbatas pada biner dan konten yang diperlukan untuk menjalankan aplikasi.

Tim .NET menyediakan empat varian dasar di dotnet/ (di Docker Hub):

  1. sdk: untuk skenario pengembangan dan build
  2. aspnet: untuk skenario produksi ASP.NET
  3. runtime: untuk skenario produksi .NET
  4. runtime-deps: untuk skenario produksi aplikasi mandiri

Untuk startup yang lebih cepat, gambar runtime juga secara otomatis mengatur aspnetcore_urls ke port 80 dan menggunakan Ngen untuk membuat cache gambar asli assembly.

Sumber daya tambahan