Service Fabric - 使用 Docker Hub 作为容器注册表(现有的 .net 应用程序)

Posted

技术标签:

【中文标题】Service Fabric - 使用 Docker Hub 作为容器注册表(现有的 .net 应用程序)【英文标题】:Service Fabric - Use Docker Hub As Container Registry (existing .net Application) 【发布时间】:2019-03-12 10:02:18 【问题描述】:

这与@emaia was attempting to ask here 相似但不同。

我在看两件事:

1) 如何将我的 .net 容器化 Service Fabric 应用程序上传到 Docker Hub

看起来基于this article,当您创建 SF Container 项目时,您可以指定 Docker Hub 位置。我是containerizing an existing .net application,想使用 Docker Hub 作为我的注册表。我可以将 SF 的外部人员容器化,然后开始一个新项目吗?

我还将进行代码更改(错误修复、增强等),并且需要将这些更改上传到我的映像中,所以我假设在我将 Docker 设置为我的注册表之后,任何时候我部署它都会标记容器并上传到 Docker Hub?

2) 如何从 Docker Hub 中拉出我的容器以部署到我的 onPrem Service Fabric 集群。我认为这只是像任何其他 SF 应用程序一样的部署,但我想验证一下。还有其他的陷阱吗?

谢谢,

格雷格

更新: 澄清@Diego Mendes

我不是在尝试部署 SF“应用程序”,但是一旦您将编排支持添加到现有的 .net 应用程序,它就会将其变成 SF sln。我正在容器化现有的 .net 4.7 应用程序,然后构建/部署该容器。我想使用 SF 作为编排器。如果我使用 Azure Registry 而不是 Docker Hub,管理起来会容易得多,因为您可以轻松地发布到 Azure Registry,但 Docker Hub 没有发布选项。问题是:

1a) 将该容器放入 Docker Hub Registry 的最佳方法是什么?

我认为最坏的情况是我需要使用“Docker Push”将图像上传到 SF sln 之外?然后我启动一个新的 SF sln 并在创建解决方案时使用容器模板来引用 Docker Hub 位置?似乎有点奇怪。然后我会有两个 .sln 文件,解决方案 A 包含代码并创建图像。然后将该镜像发布到 Docker Hub 并使用没有代码来管理容器的单独 SF 解决方案(解决方案 B)?

1b) 我需要如何更新该图像?

在我将容器映像上传到 Docker 集线器之后,我对如何上传更新的代码进行了更新。它应该与我们将其上传到首位相同。如果我必须做我上面提到的,那么我会维护解决方案 A 中的代码并使用解决方案 B 来编排解决方案 A 生成的图像?我希望这不是这样做的方法,我错过了一些东西。

更新 2:

我认为我们在同一页上。感谢您提供问题第二部分的所有详细信息。我的问题的核心在于第一部分。

我要澄清的是我需要使用多少个解决方案文件。我是否需要一个编译我的代码并创建图像的 Visual Studio 解决方案(解决方案 A),以及一个仅用于编排该图像的单独的 Visual Studio 解决方案(解决方案 B)?如果这是我需要走的路线,那么后续问题是第一个解决方案是否甚至需要是 SF 解决方案,或者我可以使用任何创建 Docker 映像的解决方案。

接下来的步骤是手动上传到 Docker Hub,并查看当我将 SF 解决方案作为我的容器源时,它发生了哪些变化。也许我可以弄清楚并使用一种解决方案来创建和维护该图像。

【问题讨论】:

【参考方案1】:

1) 你不会将 Service Fabric 应用程序部署到 docker hub,而是部署容器镜像,不要尝试将 SF 应用程序与进程关联,就像普通的 docker 镜像一样思考。 SF 应用程序是之后发生的过程。

关于版本控制,尝试将此 docker 映像与非容器化应用程序进行比较,这是一个非容器化应用程序,您将在 CI 服务器(即:VSTS、Jenkins)中构建应用程序,然后创建一个可执行\可部署的应用程序,该应用程序可以例如放在一个 zip 文件中,这个文件会有一个与版本相对应的名称,通常与生成它的构建相同,一个 docker 镜像会有类似的过程,但不同的是,在你将文件放入之前在 zip 文件中,现在您保存为图像格式。

每个镜像都有一个标签,这与非容器化应用程序的版本控制非常相似,当您部署镜像时,您可以通过在构建镜像时指定的标签来识别镜像,当你没有指定一个它将被设置为最新的(你应该避免,我在下面的更新中描述了原因)。

1a)更新

我不明白您对创建图像的担忧,您可以使用 3 个简单的命令在 docker hub 中轻松创建和发布图像(假设您已经有一个 docker 注册表帐户):

docker build -t $(dockerId)/$(imageName) //Create the image
docker login -u $(dockerId) -p $(pswd)   //Authenticate to you docker registry account
docker push $(dockerId)/$(imageName)     //Push the new image

该过程与您对非 SF 映像执行的操作相同,请查看码头 here 描述如何在没有服务结构的 docker registry 上执行操作,以及 here 如何使用 Azure Registry。

.

2) 您的操作方式与在 Azure 集群和任何其他 SF 应用程序中的操作方式完全相同,您提供的链接清楚地描述了它。

2a)更新

要更新容器映像,您可以将 ServiceManifest.xml 更改为容器映像新版本的标记。

不幸的是,文档对此并不是很清楚,大多数示例都使用隐式标签,即最新的,当您不定义标签时,它将始终考虑最新的,如果图像发生变化, 因为标签相同所以它不识别它。

您应该始终明确地为您的服务定义标签,就像这个例子一样,V1MyImageName 的标签:

<ServiceManifest Name="mySvcPkg" Version="1.0.0" ...
   <ServiceTypes>
      <StatelessServiceType ServiceTypeName="mySvcType"..
      </StatelessServiceType>
   </ServiceTypes>
   <CodePackage Name="code" Version="1.0.0">
      <EntryPoint>
         <ContainerHost>
            <ImageName>acrName.azurecr.io/MyImageName:v1</ImageName>
            <Commands></Commands>
         </ContainerHost>
      </EntryPoint>
   </CodePackage>
  <Resources>
    <Endpoints>
      <Endpoint Name="myEndpoint" UriScheme="http" Port="80" Protocol="http"/>
    </Endpoints>
  </Resources>
</ServiceManifest>

当你更新镜像的时候,你给它添加一个新标签,比如V2,同时更新ServiceManifest版本,以显示SF服务包已经改变:

<ServiceManifest Name="mySvcPkg" Version="2.0.1" ...
   <ServiceTypes>
      <StatelessServiceType ServiceTypeName="mySvcType"..
      </StatelessServiceType>
   </ServiceTypes>
   <CodePackage Name="code" Version="2.0.0">
      <EntryPoint>
         <ContainerHost>
            <ImageName>acrName.azurecr.io/MyImageName:v2</ImageName>
            <Commands></Commands>
         </ContainerHost>
      </EntryPoint>
   </CodePackage>
  <Resources>
    <Endpoints>
      <Endpoint Name="myEndpoint" UriScheme="http" Port="80" Protocol="http"/>
    </Endpoints>
  </Resources>
</ServiceManifest>

关于对私有存储库的身份验证,您将其添加到 ServiceManifestImport 中的ApplicationManifest.xml

<ServiceManifestImport>
    ...
    <Policies>
        <ContainerHostPolicies CodePackageRef="Code">
            <RepositoryCredentials AccountName="myregistry" Password="=P==/==/=8=/=+u4lyOB=+=nWzEeRfF=" PasswordEncrypted="false"/>
            <PortBinding ContainerPort="80" EndpointRef="Guest1TypeEndpoint"/>
        </ContainerHostPolicies>
    </Policies>
    ...
</ServiceManifestImport>

当 SF 尝试下载ServiceManifest.xml 中定义的存储库中的图像时,它将使用ApplicationManifest.xml 中提供的凭据在注册表中进行身份验证。

【讨论】:

以上已更新,请看一下,提前致谢。

以上是关于Service Fabric - 使用 Docker Hub 作为容器注册表(现有的 .net 应用程序)的主要内容,如果未能解决你的问题,请参考以下文章

Service Fabric Actors:使用最新版本的 Service Fabric nuget 包部署 Actors 时出现的问题

Service Fabric 反向代理 - 404 - FABRIC_E_SERVICE_DOES_NOT_EXIST

Azure Service Fabric:无法运行本地 Service Fabric 群集

Service Fabric小白入门记录 本地Service Fabric集群安装及设置

Azure Service Fabric 与 Azure Service Fabric Mesh

aZURE Service Fabric