docker-compose 简述
Docker 文档编写规范:https://docs.docker.com/compose/compose-file/
docker-compose.override.yml 适用于开发环境
#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"
在此示例中,开发替代配置向主机公开一些端口,使用重定向 URL 定义环境变量,并为开发环境指定连接字符串。 这些设置都只针对开发环境。
docker-compose.prod.yml
生产环境
假设需要为生产环境使用具有不同配置值、端口或连接字符串的另一个 Compose 文件。 可创建另一个重写文件
在 docker-compose 文件中使用环境变量
环境变量存放于.env 文件中,将此 .env 文件放置在执行 docker-compose 命令的文件夹中。
开发人员可方便地从环境变量中获取配置信息,尤其是在生产环境中。 可使用语法 ${MY_VAR} 在 docker-compose 文件中引用环境变量。 docker-compose.prod.yml 文件中的以下行显示如何引用环境变量的值。
IdentityUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105
以下示例展示了 .env 文件,例如用于 eShopOnContainers 应用程序的 .env 文件。
# .env file ESHOP_EXTERNAL_DNS_NAME_OR_IP=host.docker.internal ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP=10.121.122.92
Docker-compose 要求 .env 文件中的每行都是 <variable>=<value> 格式。
运行时环境中设置的值始终会重写 .env 文件中定义的值。 同样,通过命令行参数传递的值也会重写 .env 文件中设置的默认值。
生成优化的 ASP.NET Core Docker 映像
使用简单配置,即可拥有 Docker 映像,同时应用程序还会带有环境。 以下示例显示在此情况下的简单 Dockerfile。
FROM mcr.microsoft.com/dotnet/sdk:6.0 WORKDIR /app ENV ASPNETCORE_URLS http://+:80 EXPOSE 80 COPY . . RUN dotnet restore ENTRYPOINT ["dotnet", "run"]
这样的 Dockerfile 为有效 Dockerfile。 但开发人员可以大幅优化映像,尤其是生产映像。
在生成应用程序时,通过预编译应用程序进行优化,这样可加快实例化过程。 当容器启动时,它应已准备好运行。 请勿在运行时使用 dotnet restore
和 dotnet build
CLI 命令进行还原和编译
.NET 团队在 dotnet/(位于 Docker Hub)中提供了四个基本变体:
- sdk:用于开发和生成方案
- aspnet:用于 ASP.NET 生产方案
- runtime:用于 .NET 生产方案
- runtime-deps:用于自包含应用程序的生产方案
为了更快启动,运行时映像还会自动将 aspnetcore_urls 设置为端口 80,并使用 Ngen 创建程序集的本机映像缓存。