如何将 Docker.DotNet 库连接到远程 Linux docker

Posted

技术标签:

【中文标题】如何将 Docker.DotNet 库连接到远程 Linux docker【英文标题】:How to connect Docker.DotNet library to remote 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 库中使用什么连接字符串以及如何创建所需的身份验证?

【问题讨论】:

【参考方案1】:

Docker 引擎 API

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

https://docs.docker.com/engine/api/ https://docs.docker.com/engine/api/sdk/examples/ https://docs.docker.com/engine/api/v1.41/

如何启用 Docker Engine http API

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

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

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

来源:

https://gist.github.com/jrichardsz/84fdbd07910bae61df5b01662f3f48e1#file-how-to-enable-docker-remote-rest-api-on-docker-host-v1-0-1-md https://gist.github.com/styblope/dc55e0ad2a9848f2cc3307d4819d819f How does Docker use ports 2375 and 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 的测试。

【讨论】:

以上是关于如何将 Docker.DotNet 库连接到远程 Linux docker的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 python 3 websocket 库连接到远程安全 web socket服务器

如何将 Qt 库连接到标准 C++ 项目?

无法将 Github 组织存储库连接到 AWS Amplify 应用程序

使用 socket.io-client.java 库连接到 socket.io 命名空间

在端口 443 上使用 ALPN 将 M2MQTT 客户端库连接到 AWS IoT 时出现问题

使用 Dask 库连接到 Impala DB