Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Petunjuk / Saran
Konten ini adalah kutipan dari eBook, Arsitektur Layanan Mikro .NET untuk Aplikasi .NET Kontainer, tersedia di .NET Docs atau sebagai PDF gratis yang dapat diunduh yang dapat dibaca secara offline.
Dalam panduan ini, file docker-compose.yml diperkenalkan di bagian Langkah 4. Tentukan layanan Anda di docker-compose.yml saat membuat aplikasi Docker multi-kontainer. Namun, ada cara tambahan untuk menggunakan file docker-compose yang patut dijelajahi lebih rinci.
Misalnya, Anda dapat secara eksplisit menjelaskan bagaimana Anda ingin menyebarkan aplikasi multi-kontainer Anda dalam 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 multi-kontainer, 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 tepat satu citra atau build. Kunci lain bersifat opsional, dan dianalogikan dengan rekan-rekan baris perintah mereka docker run .
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 tersebut, 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 |
| pemesanan API | Kontainer yang termasuk layanan mikro yang disebut "Ordering ASP.NET Core Web API" |
| sqldata | Kontainer yang menjalankan 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 keranjang sebagai cache REDIS. |
Kontainer API Layanan Web sederhana
Berfokus pada satu kontainer, layanan mikro kontainer catalog-api 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 kontainer ini memiliki konfigurasi dasar berikut:
Ini didasarkan pada gambar eshop/catalog-api kustom. Demi kemudahan, tidak terdapat "build: kunci pengaturan" dalam file. Ini berarti bahwa gambar harus telah dibuat sebelumnya (dengan build docker) atau telah diunduh (dengan perintah penarikan docker) dari registri Docker apa pun.
Ini mendefinisikan 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. Proses ini sangat praktis; dengan dapat menggunakan penyelesaian nama ini (yang bersifat internal bagi 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 perlu mengaktifkan dan menjalankan database SQL Server terlebih dahulu. Namun, dependensi kontainer semacam ini tidak cukup dalam banyak kasus, karena Docker hanya memeriksa pada 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
File docker-compose.*.yml 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 tersebut atau Visual Studio, yang menggunakan docker-compose di balik layar.
File docker-compose.yml memungkinkan Anda mengonfigurasi dan mendokumen semua dependensi layanan aplikasi Anda (layanan lain, cache, database, antrean, dll.). Dengan menggunakan perintah docker-compose CLI, 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 multi-kontainer 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 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 menerapkan ke satu instance host Docker.
Jika Anda menggunakan orkestrator lain (misalnya, Azure Service Fabric atau Kubernetes), 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 bervariasi pada orkestrator yang Anda gunakan.
Menggunakan beberapa file docker-compose untuk menangani beberapa lingkungan
Saat menargetkan lingkungan yang berbeda, Anda harus menggunakan beberapa file compose. Pendekatan ini memungkinkan Anda membuat beberapa varian konfigurasi tergantung pada lingkungan.
Mengambil alih 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 penelusuran kesalahan aplikasi, Anda dapat melihat file ini di folder obj\Docker\ di folder solusi utama.
Gambar 6-11. file docker-compose di Visual Studio 2019
struktur file proyek docker-compose:
- .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 penggantian dengan nama yang berbeda. File pembaruan biasanya berisi informasi tambahan yang diperlukan oleh aplikasi tetapi khusus untuk lingkungan tertentu atau penyebaran.
Menargetkan beberapa lingkungan
Kasus penggunaan umum adalah ketika Anda menentukan beberapa file compose 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.
Gambar 6-12. Beberapa file docker-compose menggantikan nilai-nilai dalam 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 terlepas dari 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 telah 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 dalam file docker-compose.override.yml atau serupa untuk produksi atau pengujian, Anda harus menempatkan konfigurasi yang spesifik 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 Compose lain untuk lingkungan produksi, dengan nilai konfigurasi, port, atau string koneksi yang berbeda. Anda dapat membuat berkas override lain, seperti berkas 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 mendeploy dengan file override tertentu
Untuk menggunakan beberapa file override, atau file penggantian dengan nama yang berbeda, Anda dapat menggunakan opsi -f dengan perintah docker-compose dan menentukan file. Compose menggabungkan file sesuai urutan yang ditentukan pada baris perintah. Contoh berikut menunjukkan cara menyebarkan dengan file override.
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
Menggunakan variabel lingkungan dalam file docker-compose
Ini 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 deklarasikan variabel lingkungan default dalam file .env. Nilai-nilai ini untuk variabel lingkungan adalah nilai default. Namun, pengaturan ini dapat digantikan oleh nilai yang mungkin telah Anda tentukan di setiap lingkungan Anda, seperti 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
Gambaran Umum Docker Compose
https://docs.docker.com/compose/overview/Beberapa file Buat
https://docs.docker.com/compose/multiple-compose-files/
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 dengan pendekatan 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 secara substansial mengoptimalkan gambar Anda, terutama gambar produksi Anda.
Dalam model kontainer dan layanan mikro, Anda terus memulai kontainer. Cara umum menggunakan kontainer tidak akan memulai ulang kontainer yang terhenti, karena kontainer bersifat sekali pakai. 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 untuk dijalankan. Jangan pulihkan dan kompilasi saat waktu berjalan menggunakan dotnet restore dan dotnet build perintah CLI 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 merupakan kerangka kerja yang ringan dengan penggunaan memori yang kecil; tim telah berfokus pada image Docker yang telah dioptimalkan untuk tiga skenario utama dan menerbitkannya di registri Docker Hub pada dotnet/, dimulai sejak versi 2.1:
- Pengembangan: Prioritasnya adalah kemampuan untuk melakukan iterasi dan debug perubahan dengan cepat, dan di mana ukurannya sekunder.
- Build: Prioritasnya adalah mengkompilasi aplikasi, dan gambar mencakup biner dan dependensi lainnya untuk mengoptimalkan biner.
- 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 beberapa varian dasar di dotnet/, misalnya:
- sdk: untuk skenario pengembangan dan pembangunan
- aspnet: untuk skenario produksi ASP.NET
- runtime: untuk skenario produksi .NET
- 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 rakitan.
Sumber daya tambahan
Membangun Gambar Docker yang Dioptimalkan dengan ASP.NET Corehttps://learn.microsoft.com/archive/blogs/stevelasker/building-optimized-docker-images-with-asp-net-core
Membangun Gambar Docker untuk Aplikasi .NEThttps://learn.microsoft.com/dotnet/core/docker/building-net-docker-images