在 Windows 主机上通过 docker-compose 混合 Windows 和 Linux 容器

mar*_*ymk 6 containers cross-platform docker docker-compose docker-desktop

我在尝试通过 Windows 主机上的 docker-compose 混合 Windows 和 Linux 容器时遇到问题,如https://devblogs.microsoft.com/premier-developer/mixing-windows-and-linux-containers-with-docker中所示-撰写/

我克隆了本文的原始存储库(https://github.com/RandyPatterson/DockerComposeMultiPlatform),并已使用新链接替换了 Dockerfiles 中的每个过时的基础映像,您可以在下面看到所有相关文件。我可以通过首先切换到 Linux 守护程序、为 API 启动一个容器,然后切换到 Windows 守护程序并为 Web 应用程序启动一个容器来手动运行它。

根据/sf/answers/5058225161/,docker-compose 也应该这样做,包括为相应的平台构建它,当我docker-compose up -d在 Windows 守护程序上运行时,它首先通过拉取 ApiTier 的 Linux 映像来正常启动Dockerfile 直到第一RUN行,然后我收到错误hcsshim::CreateComputeSystem 186c82040b2e396b4b6e4c4063c2c8f562e855469630b82415e51043f6cb1773: An adapter was not found.

docker-compose.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

Run Code Online (Sandbox Code Playgroud)

ApiTier\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"]
Run Code Online (Sandbox Code Playgroud)

WebTier\Dockerfile

FROM mcr.microsoft.com/dotnet/framework/aspnet:4.7.2
WORKDIR /inetpub/wwwroot
COPY docker/ .
Run Code Online (Sandbox Code Playgroud)

docker version

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
Run Code Online (Sandbox Code Playgroud)

docker-compose version

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
Run Code Online (Sandbox Code Playgroud)

适用于 Windows 的 Docker 守护进程 json

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"]
Run Code Online (Sandbox Code Playgroud)

适用于 Linux 的 Docker 守护进程 json

FROM mcr.microsoft.com/dotnet/framework/aspnet:4.7.2
WORKDIR /inetpub/wwwroot
COPY docker/ .
Run Code Online (Sandbox Code Playgroud)

小智 2

首先是步骤,稍后是详细信息:

\n
    \n
  1. 将 docker 切换为使用 Windows 容器
  2. \n
  3. 在Docker引擎中,将experimental设置为true(我看到它在你这边已经是true了)。
  4. \n
  5. 在 docker 设置(常规下)中选择“使用 Docker Compose V2”。
  6. \n
  7. 运行docker-compose up -d命令。
  8. \n
\n

您共享的示例存储库未能在我这边构建,但我找到了一个更好的示例,并且它可以工作(当然需要一些模组:))

\n

示例 docker-compose.yml:

\n
version: \'3.8\'\nservices:\n  nanoserver:\n    container_name: nanoserver\n    image: mcr.microsoft.com/windows/servercore/iis:windowsservercore-20H2\n  sql2017:\n    container_name: sql2017\n    platform: linux\n    mem_limit: 4GB\n    environment:\n      - ACCEPT_EULA=Y\n      - MSSQL_PID=Developer\n      - SA_PASSWORD=Mypass1.\n    ports:\n      - \'1433:1433\'\n    image: mcr.microsoft.com/mssql/server:2017-latest\n
Run Code Online (Sandbox Code Playgroud)\n

我使用与您相同的 docker 版本(服务器和客户端)。但是,我认为需要 docker-compose v2:

\n
$ docker-compose version\nDocker Compose version v2.13.0\n
Run Code Online (Sandbox Code Playgroud)\n

确保在 Docker 设置中选择“使用 Docker Compose V2”。\n在此输入图像描述

\n

参考文献:

\n\n