群辉 Docker 下 macvlan 容器固定 IP

群晖 docker 有两个使用 macvlan 的容器,比如叫做 AA 和 BB 吧。我创建的 macvlan 网络名称叫 macvlan1,IP 起始地址是 192.168.0.192。然而我发现 AA 和 BB 的 MAC 和 IP 并不是固定的,而是有它们的启动顺序决定:谁先启动,谁就获得 MAC xx:...:c0 以及 IP 192.168.0.192;而后启动的则获得 MAC xx:...:c1 以及 IP 192.168.0.193。然而这两个容器我希望它们的 IP 是固定的,否则根据 IP 访问时你都不知道到底访问的是谁。然而对于已经创建好的容器,我不知道该如何设置。最初尝试修改 /volume1/@docker/containers/xxxx/config.v2.json 配置文件(其中 xxxx 代表容器的 ID),然而发现该文件似乎只是记录容器的配置状态,对它的修改不会生效,而且会被自动覆盖。正常情况下不修改它的时候,其内容和 docker container inspect AA 或直接 docker inspect AA 显示的结果一致,只不过文件里的内容没有空格和换行,看着不方便,而 inspect 命令的输出则是格式化后的结果。不论是否运行容器,对 config.v2.json 的修改都无效,因为修改前后运行 docker inspect AA 得到的内容一样,说明容器设置并没有变化。既然无法修改已有容器的配置,那么只能重新建一个容器,通过命令行指定 IP

docker run -itd --network macvlan1 --name AA  --ip=192.168.0.192  xxx/image1
docker run -itd --network macvlan1 --name BB  --ip=192.168.0.193  xxx/image2

至于文件映射等其他设置则可以通过网页界面去设置,关键是通过命令行创建具有指定 IP 的容器,这样容器的 IP 就是固定的了,不随启动顺序而变了。

通过比较,发现指定了 IP 的容器配置如下:

#docker inspect AA
......
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "b8e5a6fcc9dafb10a51a73d7905c4322837a4bd0b580f93f568af875f98b6a19",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/b8e5a6fcc9da",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "macvlan1": {
                    "IPAMConfig": {
                        "IPv4Address": "192.168.0.193"  # 这句是关键!
                    },
                    "Links": null,
                    "Aliases": [
                        "c985090496be"
                    ],
                    "NetworkID": "fa0c5cb1e914e18b0ac40b358643eff5b8240187123b370f57ae8bb81e7c4832",
                    "EndpointID": "c744cceeb266a692986489e9288822c783b5ed86011e31006a142c05325a3cd4",
                    "Gateway": "192.168.0.1",
                    "IPAddress": "192.168.0.193",
                    "IPPrefixLen": 24,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:c0:a8:00:c1",
                    "DriverOpts": null
                }
            }
        }
.......

其中关键部分为

                    "IPAMConfig": {
                        "IPv4Address": "192.168.0.193"  
                    },

而没有指定 IP 的容器配置中,上面部分是

                    "IPAMConfig": null,

可见 IPAMConfig 中指定了 IP,那就固定了,如果没有指定,则自动分配,依赖启动顺序。之前说修改 config.v2.json 就是修改这个地方,只不过发现并不管用!

注:可用如下命令直接运行容器 AA 里的命令,比如 ifconfig:

docker  exec  AA  ifconfig

你可能感兴趣的:(群辉 Docker 下 macvlan 容器固定 IP)