首页 > 解决方案 > 如何在 Windows 中使用 C# 客户端创建具有静态 IP 的 docker 网络

问题描述

我想使用此客户端使用 C# 设置 docker 网络:https ://github.com/dotnet/Docker.DotNet 。

我正在使用带有 windows 容器的 windows docker。

基本上我想做的就是通过 C# 客户端执行这个命令(在 cmd 中执行它工作正常):

docker network create --driver=nat --subnet=10.123.174.0/23 --gateway=10.123.174.1 my_network

但是,不知何故,我无法正确设置网络。我使用这段小代码:

Dictionary<string, string> options = new Dictionary<string, string>();
options.Add("--gateway", "10.123.174.1");
options.Add("--subnet", "10.123.174.0/23");
await _client.Networks.CreateNetworkAsync(new NetworksCreateParameters { Driver = "nat", Name = "my_network", Options = options });

但是网络仍然是用另一个指定的网关创建的,我的选项只放在网络“选项”数组中:

[
    {
        "Name": "my_network",
        "Id": "2bb2fabfa84518a2a11eff881c859bf324ce732c308a1d5a4d541c74870f5e70",
        "Created": "2021-03-17T14:09:01.694993+01:00",
        "Scope": "local",
        "Driver": "nat",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "windows",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.29.96.0/20",
                    "Gateway": "172.29.96.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "--gateway": "10.123.174.1",
            "--subnet": "10.123.174.0/23",
            "com.docker.network.windowsshim.hnsid": "3065184F-EFAF-4537-AF64-F2CD373A3261"
        },
        "Labels": {}
    }
]

我还尝试仅指定“子网”和“网关”(没有“--”),但结果是一样的。我做错了什么?

标签: c#.netdockernetworkingcontainers

解决方案


从您自己的示例中可以看出,这些设置属于 IPAM.Config(API 参考),而不是 Options:

"IPAM": {
    "Config": [
        {
            "Subnet": "172.29.96.0/20",
            "Gateway": "172.29.96.1"
        }
    ]
},

您需要创建一个IPAM对象并将其传递给NetworksCreateParameters.IPAM参数。这是一个糟糕的例子:

Dictionary<string, string> options = new Dictionary<string, string>();
options.Add("Gateway", "10.123.174.1");
options.Add("Subnet", "10.123.174.0/23");

IList<Dictionary<string, string>> configs = new IList<Dictionary<string, string>>();
configs.Add(options);

Dictionary<string, IList<Dictionary<string, string>>> ipam = new Dictionary<string, IList<Dictionary<string, string>>>();
ipam.Add("Config", configs);

await _client.Networks.CreateNetworkAsync(new NetworksCreateParameters { Driver = "nat", Name = "my_network", IPAM = ipam });

抱歉,这个例子可能在某个地方搞砸了,因为我一生中只使用过几次 C#,那是几年前的事了。查看我提到的API 参考。您可以在那里找到一些关于预期数据的示例。


推荐阅读