群晖 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
暂无评论内容