在Windows主机上通过Docker合成混合Windows和Linux容器

u4dcyp6a  于 2023-01-12  发布在  Docker
关注(0)|答案(1)|浏览(181)
    • bounty将于明天过期**。回答此问题可获得+100的声望奖励。marymk正在寻找规范答案

我在尝试通过docker-compose在Windows主机上混合Windows和Linux容器时遇到了问题,如https://devblogs.microsoft.com/premier-developer/mixing-windows-and-linux-containers-with-docker-compose/中所示。
我克隆了这篇文章的原始存储库(https://github.com/RandyPatterson/DockerComposeMultiPlatform),并且已经用新链接替换了Dockerfiles中的每个过时的基本映像,您可以在下面看到所有相关文件。我可以让它手动运行,方法是首先切换到Linux守护进程,为API启动一个容器,然后切换到Windows守护进程,为Web应用程序启动一个容器。
根据https://stackoverflow.com/a/72260359,docker-compose也应该执行此操作,包括为相应的平台构建它,并且当我在Windows守护程序上运行docker-compose up -d时,它首先通过将ApiTier Dockerfile的Linux映像拉到第一个RUN行来正常启动,然后我在该行中得到错误hcsshim::CreateComputeSystem 186c82040b2e396b4b6e4c4063c2c8f562e855469630b82415e51043f6cb1773: An adapter was not found.

    • 停靠-编写. yml**
version: '2.4'
services:
  webtier:
    image: webtier:win
    platform: windows
    ports:
      - 80
    build:
      context: .\WebTier
      dockerfile: Dockerfile
    depends_on:
      - apitier
    environment:
      ApiHost: "apitier"

  apitier:
    image: apitier:linux
    platform: linux
    expose: 
      - 80
    build:
      context: .\ApiTier
      dockerfile: Dockerfile
    • 应用层\停靠文件**
FROM mcr.microsoft.com/dotnet/aspnet:2.1 AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:2.1 AS build
WORKDIR "/src/ApiTier"
COPY . .
RUN dotnet build "WebApi.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "WebApi.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "WebApi.dll"]
    • Web层\停靠文件**
FROM mcr.microsoft.com/dotnet/framework/aspnet:4.7.2
WORKDIR /inetpub/wwwroot
COPY docker/ .
    • 一米三米一x**
Client:
 Cloud integration: v1.0.29
 Version:           20.10.21
 API version:       1.41
 Go version:        go1.18.7
 Git commit:        baeda1f
 Built:             Tue Oct 25 18:08:16 2022
 OS/Arch:           windows/amd64
 Context:           default
 Experimental:      true

Server: Docker Desktop 4.15.0 (93002)
 Engine:
  Version:          20.10.21
  API version:      1.41 (minimum version 1.24)
  Go version:       go1.18.7
  Git commit:       3056208
  Built:            Tue Oct 25 18:03:04 2022
  OS/Arch:          windows/amd64
  Experimental:     true
    • 一米四分一秒**
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.9.0
OpenSSL version: OpenSSL 1.1.1g  21 Apr 2020
    • Windows的Docker守护程序json**
{
  "experimental": true,
  "features": {
    "buildkit": false
  }
}
    • 适用于Linux的Docker守护程序json**
{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "experimental": true,
  "features": {
    "buildkit": true
  }
}
igetnqfo

igetnqfo1#

先做步骤,后做细节:
1.切换Docker以使用Windows容器
1.在Docker引擎中,将experimental设置为true(我看到它在您的终端上已经是true)。
1.在Docker设置(在“常规”下)中选择“使用Docker合成V2”。
1.运行docker-compose up -d命令。
你分享的示例repo在我这边构建失败了,但是我找到了一个更好的示例,而且它工作了(当然是用一些mods:))
示例停靠器-compose.yml:

version: '3.8'
services:
  nanoserver:
    container_name: nanoserver
    image: mcr.microsoft.com/windows/servercore/iis:windowsservercore-20H2
  sql2017:
    container_name: sql2017
    platform: linux
    mem_limit: 4GB
    environment:
      - ACCEPT_EULA=Y
      - MSSQL_PID=Developer
      - SA_PASSWORD=Mypass1.
    ports:
      - '1433:1433'
    image: mcr.microsoft.com/mssql/server:2017-latest

我用的是和你一样的docker版本(服务器端和客户端),但是我觉得需要docker-compose的v2版本:

$ docker-compose version
Docker Compose version v2.13.0

确保在Docker设置中选择“使用Docker合成V2”。x1c 0d1x
参考文献:

相关问题