【问题标题】:Using C# Docker api to query docker engine from inside container使用 C# Docker api 从容器内部查询 docker 引擎
【发布时间】:2019-06-28 09:52:29
【问题描述】:

我刚刚开始将 Docker 视为将我们的传统 C++ 服务器应用程序移动到容器中的一种方式(这样我们就可以在同一台物理机器上运行多个隔离的服务器)。这一切都很好(在我的 Windows 10 机器上),我可以准备图像并运行容器,一切正常。所以,然后我认为能够在容器内有一个小的 REST api 会很方便,这样外部客户端就可以找到有关正在运行的服务器/容器的信息。我找到了一个 c# api

https://github.com/microsoft/Docker.DotNet

使用这样的代码在本地工作

HttpContext.Current.Server.ScriptTimeout = 300;
        DockerClient client = new DockerClientConfiguration(new Uri("npipe://./pipe/docker_engine")).CreateClient();

        IList<ContainerListResponse> containers = await client.Containers.ListContainersAsync(
            new ContainersListParameters()
            {
                Limit = 10,
            });

所以,我进入 vs2017 创建一个 webapi 项目,打开 docker 支持并将代码的 sn-p 移动到控制器中,以便我可以查看是否可以查看主机运行容器。不幸的是,该命令只是给出了一个超时错误。我假设我必须做一些事情才能访问主机 docker 引擎。因此,我尝试将其添加到 docker-compose.yml 文件中

version: '3.4'

services:
    serverinfoapp:
    image: ${DOCKER_REGISTRY-}serverinfoapp
    volumes:
        - source: '\\.\pipe\docker_engine'
          target: '\\.\pipe\docker_engine'
          type: npipe
    build:
      context: .\ServerInfoApp
      dockerfile: Dockerfile

但还是不行。

我是 Docker 的初学者,因此我们将不胜感激。

问候

【问题讨论】:

  • 你得到什么错误?
  • 我刚刚得到一个 System.TimeoutException: '操作已超时。'执行 client.Containers.ListContainersAsync 行时。我尝试在客户端配置 ctor 中添加时间跨度,但这没有帮助。
  • 更常见的是通过环境变量传递所有外部信息,而不是让 pod “伸出”到它的控制器。例如,您可以为部署定义使用某种模板系统,该系统可以将映像版本(或其他)传递给 pod。
  • 谢谢斯蒂芬。我确实通过使用.net核心让它最终工作。我现在只是在玩弄架构理念

标签: c# docker docker-for-windows


【解决方案1】:

使用 .net 核心版本在 vs2019 中尝试过,它似乎可以工作

更新

在对此做了更多工作之后,我想我会发布更多信息,以防有人发现它有帮助。基本上我想要类似于 Portainer (https://www.portainer.io/) 的东西,它是在一个容器内运行一个 Web 应用程序,允许我控制其他 docker 容器(运行我的旧应用程序)。我不能只使用 Portainer,因为我需要添加其他特定于应用程序的功能。因此,开始的关键是,如果您要使用服务器操作系统,并且想要使用命名管道,请确保使用 Server 2019。

正如本博客所述,Server 2019 允许您使用命名管道来访问 Docker API

https://blog.sixeyed.com/what-you-can-do-with-docker-in-windows-server-2019-that-you-couldnt-do-in-windows-server-2016/

此外,如果您使用的是 docker-compose,请确保添加适当的卷,并指定以具有适当权限的用户身份运行

例如

version: '3.4'

services:
  yourservice:
    image: <dockerimage>
    container_name: yourcontainer
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=http://+:80
      - ConnectionStrings__DefaultConnection=blahblah
      - HOST_IP=blahblah
    volumes:
        - source: '\\.\pipe\docker_engine'
          target: '\\.\pipe\docker_engine'
          type: npipe
    ports:
      - "7000:80"
    user:
        ContainerAdministrator
    build:
      context: .
      dockerfile: pathtodockerfile

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 2017-09-29
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    相关资源
    最近更新 更多