У меня есть контейнер докеров, который подключен к двум сетям, мосту по умолчанию и настраиваемому мосту. По умолчанию он связан с другим контейнером только в сети по умолчанию и с помощью настраиваемого моста получает IP-адрес в локальной сети.Изменить маршрут по умолчанию в контейнере докера
LAN -- [homenet] -- container1 -- [bridge] -- container2
sudo docker network inspect homenet
[{ "Name": "homenet",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [{ "Subnet": "192.168.130.0/24",
"Gateway": "192.168.130.8",
"AuxiliaryAddresses": { "DefaultGatewayIPv4": "192.168.130.3" }}]
},
"Internal": false,
"Containers": {
"$cid1": { "Name": "container",
"EndpointID": "$eid1_1",
"MacAddress": "$mac1_1",
"IPv4Address": "192.168.130.38/24", }
},
"Options": { "com.docker.network.bridge.name": "br-homenet" },
"Labels": {}}]
и мост:
sudo docker network inspect bridge
[{
"Name": "bridge",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [{ "Subnet": "172.17.0.0/16" }]
},
"Internal": false,
"Containers": {
"$cid2": {
"Name": "container2",
"EndpointID": "$eid2",
"MacAddress": "$mac2",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": "" },
"$cid1": {
"Name": "container1",
"EndpointID": "$eid1_2",
"MacAddress": "$mac1_2",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": "" }
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}]
Это работает очень хорошо из внутренней сети, однако, у меня есть проблема маршрутизации:
sudo docker exec -it container1 route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.17.0.1 0.0.0.0 UG 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
192.168.130.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
Как я могу изменить маршрут по умолчанию 192.169 .130.3, чтобы он продолжал перезапуск?
я могу изменить его в то время как container1 работает с
pid=$(sudo docker inspect -f '{{.State.Pid}}' container1)
sudo mkdir -p /var/run/netns
sudo ln -s /proc/$pid/ns/net /var/run/netns/$pid
sudo ip netns exec $pid ip route del default
sudo ip netns exec $pid ip route add default via 192.168.130.3
но ушел после перезагрузки. Как я могу это изменить?
Обновление: По-видимому, the lexicographical order of the networks также может быть частью проблемы. Я проверю его, когда у меня появится шанс.
Спасибо , это хороший nswer. Однако мне не нравится, что мне нужно предоставить специальные возможности контейнера. Можете ли вы как-то отказаться от них после выполнения команды? Для бонусных очков есть ли способ автоматически автоматически запускать правильный скрипт/программу (чтобы я не мог корректировать ваш скрипт, если изменяется имя сценария в контейнере докера)? – martin
Мне нравится намек на то, что сценарий может находиться в томе, я забыл об этом, но это избавляет меня от некоторых головных болей. – martin
Я обновил свой андер, чтобы добавить второе решение, которое должно избежать проблем, которые вы описываете. – Silicium14