【问题标题】:How to connect Docker.DotNet library to remote Linux docker如何将 Docker.DotNet 库连接到远程 Linux docker
【发布时间】:2022-01-21 06:50:14
【问题描述】:

Docker 周围有 NET CORE 包装器 (https://github.com/dotnet/Docker.DotNet) 它使用奇怪的抽象来连接到 docker

 var client = new DockerClientConfiguration(new Uri("http://ubuntu-docker.cloudapp.net:4243")).CreateClient();

我的 docker 可以从远程机器访问

sudo curl --unix-socket /var/run/docker.sock http://157.XX.XX.84/v1.41/containers/json

我需要在 Docker.DotNet 库中使用什么连接字符串以及如何创建所需的身份验证?

【问题讨论】:

    标签: docker .net-core


    【解决方案1】:

    Docker 引擎 API

    Docker 提供了一个用于与 Docker 守护进程交互的 API,称为 Docker Engine API,它是一个经典的 http rest api,具有许多可供使用的端点,例如:创建容器、图像、启动、删除等,此功能用于全球所有 docker 客户端。

    如何启用 Docker Engine http API

    基本上步骤是:修改一些docker内部配置并重启守护进程。如果您在主机 10.10.10.10(远程 docker 主机)中执行此操作,则可以从同一网络中的任何其他主机或具有相应权限的类似以下内容调用 api:

    curl http://10.10.10.10:2375/images/json
    

    2375 只是为了开发。最佳且安全的是配置 4243 端口

    来源:

    用于 Docker 远程 API 的 .NET 客户端

    这个client 与任何其他 docker 客户端一样需要 docker http api url(作为最简单的方法),在上一节中进行了说明

    DockerClient client = new DockerClientConfiguration(
        new Uri("http://ubuntu-docker.cloudapp.net:4243"))
         .CreateClient();
    

    也在自述文件中显示可以使用套接字连接它而不是 http:

    DockerClient client = new DockerClientConfiguration(
        new Uri("unix:///var/run/docker.sock"))
         .CreateClient();
    

    我不知道它是否允许我们使用不安全的端口 2375。所以您必须在远程 docker 主机上启用 4243 端口。

    无论如何,如果您需要快速测试,您可以尝试使用 2375 端口。一些issues 显示该端口,因此它可能是允许的。

    建议

    • 选择远程 docker api 是使用 socket 还是 http
    • 配置它
    • 使用 curl 或 postman 等工具对其进行测试
    • 如果有效,请正确使用 .NET 客户端

    【讨论】:

    • 谢谢你,@JRichardsz。但是 NET 客户端只能使用 http 吗?并且 docker NET 客户端不允许以普通方式工作 - 使用远程套接字?而且我看不到主要的未来 - 如何使用远程机器的登录名/密码连接到远程 docker。当然,如果不回答这个简单的问题 - 我会收到结果 - “无法建立连接,因为目标机器主动拒绝了它。”
    • 根据文档,允许使用套接字
    • 这是一个好消息,但在这种情况下连接字符串是什么?以及如何将登录名/密码添加到连接字符串?
    【解决方案2】:

    我的问题是关于如何准确连接到远程套接字以及如何使用基本 AU 连接到远程套接字。文档对此只字未提。所以,这是我最终的解决方案。

    远程套接字是简单的 80 端口。并且没有任何 AU。因此,首先我创建了代理服务器来通过登录密码保护远程套接字。这是 nginx 配置(在代理模式下)。

    upstream docker {
      server unix:/var/run/docker.sock;
    }
    server {
      listen 4444 default_server;
      location / {
         proxy_pass http://docker;
        auth_basic_user_file /etc/nginx/.htpasswd;
        auth_basic "Access restricted";
      }
    }
    

    通过这种方式可以连接到远程docker

        Dim PassStr = ReadPassword()
        Dim Credential = New BasicAuthCredentials(My.Resources.Login, PassStr)
        Dim DockerHub = New DockerClientConfiguration(New Uri(My.Resources.Url), Credential).CreateClient()
    

    Docker.DotNet 不是一个高质量的包,它直接不起作用(不仅在我的计算机中,我看到其他程序员的很多问题),所以直接 BasicAuthCredentials 不起作用。我从这个包的源代码组装我的程序 - NET CORE 5. How to fix "The located assembly's manifest definition does not match the assembly reference"?

    最后我的程序运行良好。这是通过具有基本 AU 的代理服务器通过远程套接字控制 docker 的测试。

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 2019-02-01
      • 2019-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 1970-01-01
      • 2021-04-23
      相关资源
      最近更新 更多