【问题标题】:How to publish .Net core docker application from Windows to Linux machine?如何将 .Net 核心 docker 应用程序从 Windows 发布到 Linux 机器?
【发布时间】:2019-01-20 16:37:48
【问题描述】:

我在安装了 Docker for Windows 的 Windows 10 PC 上使用 Visual Studio 2017 创建了一个支持 Linux docker 的 .Net 核心应用程序。我可以使用以下命令来运行它(控制台应用程序)

docker run MyApp

我有另一台安装了 Docker 的 Linux 机器。如何将 .Net 核心应用程序发布到 Linux 机器上?我需要在 Linux 机器上发布和运行 dockerized 应用程序。

linux 安装了以下 docker 包。

$ sudo yum list installed "*docker*" 加载的插件:amazon-id、rhui-lb、search-disabled-repos 已安装的软件包 docker-engine.x86_64 17.05.0.ce-1.el7.centos @dockerrepo docker-engine-selinux.noarch 17.05.0.ce-1.el7.centos @dockerrepo

【问题讨论】:

  • 你不能使用docker hub有什么原因吗?
  • 我们刚开始使用 docker,需要一些快速演示。
  • 天哪,我们也试过了,但遗憾的是没有“快速演示”,您基本上必须创建整个 CI 基础设施,一些“演示”基本上是可行的解决方案,记住,而 docker使许多事情变得更容易,这不是魔术,没有注册表容器,没有其他办法:连接到您的服务器,从 repo 中拉取,重建映像然后运行它,您可以创建脚本以使其更容易,但是始终需要相同的步骤
  • 我发现了这个问题stackoverflow.com/q/23935141/825920
  • 我强烈推荐使用 docker hub,它为你提供了一个免费的私有仓库和无限的公共仓库。这样你就可以推送到 docker hub,然后从那里拉到 docker 机器上

标签: linux visual-studio docker .net-core


【解决方案1】:

有很多方法可以做到这一点,只需搜索任何用于 CI/CD 的工具。

最简单的方法是手动操作,连接到您的 Linux 服务器,创建一个 git pull 的代码,然后运行您在本地运行的相同命令。

其他选项是将您的 docker 映像的push 执行到容器注册表,然后拉入您的 docker 服务器,您就可以开始了

编辑:

你真的应该看看一些 CI 服务,例如,在我们的环境中,我们使用 GitLab,当我们推送到 master 时,有一个 gitlab.yml 构建项目,然后进行推送:

image: docker:latest
services:
- docker:dind

stages:
- build

api:
  variables:
    IMAGE_NAME: git.lagersoft.com:4567/gumbo/vtae/api:${CI_BUILD_REF}
  stage: build
  only:
    - master
  script:
    - docker build -t ${IMAGE_NAME} -f vtae.api/Dockerfile .
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN ${IMAGE_NAME}
    - docker push ${IMAGE_NAME}

有了这个,我们只需要使用最新版本拉入我们的服务器。

值得注意的是,docker 本身并不处理发布部分,所以如果你开始,你需要手动或使用一些工具(任何 CI 工具,如 gitlab、jenkins、circleci、amazon 代码管道......)学习我会建议手动启动,然后集成一些 CI 工具。

编辑 2

关于 Visual Studio 工具,我不建议将其用于本地开发以外的任何其他用途,因为是的,它仅适用于 Windows,并且仅适用于 Visual Studio(Rider 刚刚集成),所以,在 linux 环境中进行部署,我们使用自己的 docker 和 docker compose 文件,无论如何它们都基于默认值,它们是这样的:

FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY lagersoft.common/lagersoft.common.csproj lagersoft.common/
COPY vtae.redirect/vtae.redirect.csproj vtae.redirect/
COPY vtae.data/vtae.data.csproj vtae.data/
COPY vtae.common/vtae.common.csproj vtae.common/
RUN dotnet restore vtae.redirect/vtae.redirect.csproj
COPY . .
WORKDIR /src/vtae.redirect
RUN dotnet build vtae.redirect.csproj -c Release -o /app

FROM build AS publish
RUN dotnet publish vtae.redirect.csproj -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "vtae.redirect.dll"]

此 docker 文件复制所有相关项目(我讨厌复制部分,但与 Microsoft 的默认文件相同),构建并发布应用程序,另一方面我们有一个 docker-compose添加一些服务(此文件必须在解决方案文件夹中才能访问所有相关项目):

version: '3.4'

services:  
  vtae.redirect.redis:
    image: redis
    volumes:
      - "./volumes/redirect/redis/data:/data"
    container_name: vtae.redirect.redis

  vtae.redirect:
    image: vtae.redirect
    depends_on:
      - vtae.redirect.redis
    build:
      context: .
      dockerfile: vtae.redirect/Dockerfile
    ports: 
      - "8080:80"
    volumes:
      - "./volumes/redirect/data:/data"
    container_name: vtae.redirect
    entrypoint: dotnet /app/vtae.redirect.dll

有了这个部分,只剩下提交,然后拉入服务器并运行docker-compose up命令来运行我们的应用程序(你可以直接从 docker 文件中执行,但它更容易和更易于管理使用 docker compose。

编辑 3

为了在服务器中进行部署,我们使用了两个工具。

  • 首先在提交完成后运行 gitlab ci
  • 它生成 docker 文件中指定的构建并将其推送到我们的 Gitlab 容器注册表,如果它是 amazon、google、azure 等的容器注册表也是如此......
  • 然后它向生产中的服务器发出一个 post 请求,该服务器在一个单独的端口上运行一个特殊的工具
  • 服务器收到 post 请求并对其进行验证,为此我们使用 this tool(朋友是 repo 所有者)
  • 脚本接收请求,检查登录,如果有效,则简单地从我们的 gitlab 容器注册表中拉取并运行 docker-compose up

备注

该工具并不完美,我们正在从 docker 转向使用 kubernetes,您是否可以直接从您的机器或一些 CI 集成连接到您的集群并直接进行部署,无论您选择哪种解决方案,我都推荐你开始了解 kubernetes 可以如何帮助你,遗憾的是要学习更多的层,但它非常有希望,你将能够无痛地发布到 almos 任何云或金属,包括后备、缩放和其他东西。

还有 如果您不想或不能使用容器注册表(我强烈推荐这种方式),您可以使用相同的工具,在执行它的 .sh 中,只需执行 git pull,然后执行 docker build 或 docker compose。 最简单的场景可能是自己创建一个脚本,在其中执行 ssh 到服务器,将文件上传为 zip,然后在服务器中运行它,请记住,Ubuntu 在 microsoft 商店中并且可以运行此脚本,但其他解决方案更“独立”和可扩展,所以,做出你的选择吧!

【讨论】:

  • 该应用程序是使用仅限 Windows 的工具 - Visual-Studio 构建的,它在 Linux 上不可用。对于另一种选择,我没有任何容器注册表。
  • 添加了关于 microsoft 工具的我的 cmets,它只添加了调试功能,因此 soy 在生产中不会丢失任何东西
  • 很好奇,CI服务如何在构建镜像后将镜像复制到生产服务器?现在我需要想办法在 Linux 服务器上运行镜像。
  • 编辑了我的评论以添加我们在服务器中使用的工具来更新容器注册表中的应用程序
  • +1 用于设置 docker 注册表。这是值得的,也是在多个位置使用 same 图像的最佳方式。您可以轻松地将注册表作为容器运行:docs.docker.com/registry/deploying
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多