我有一个Docker容器连接到两个网络,即默认桥和自定义桥。通过默认值,它仅在默认网络中链接到另一个容器,并且通过自定义网桥,它在本地网络中获取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
但是重启后就消失了。我该如何改变?
更新:
显然,网络的词典顺序也可能是问题的一部分。如果有机会,我将对其进行测试。
如果我理解这个问题,问题是: 重新启动连接到多个网桥的容器时,如何优先使用网桥作为默认路由?
我搜索了可用选项并进行了一些测试,当容器连接到多个网桥时,我没有找到任何docker命令行选项来指定默认路由或首选网桥作为默认桥。当我重新启动连接到默认桥(bridge
)和自定义桥(your
homenet
)的容器时,默认路由会自动设置为使用默认桥(gateway 172.17.0.1
)。这与您描述的行为相对应。
解决方案1:在运行命令中指定一个启动脚本,该脚本负责更改默认路由并启动您的容器必须运行的服务 :
docker run \
--cap-add NET_ADMIN \ # to allow changing net settings inside the container
--name container1 \
--restart always \ # restart policy
your_image \
/path/to/your_start_script.sh
的your_start_script.sh
:
ip route del default
ip route add default via 192.168.130.3
# here goes instructions/services your container is supposed to run
该脚本必须在容器内可用,它可以在共享文件夹(-v
选项)上,或者在使用Dockerfile构建映像时加载。
注意:在将容器连接到自定义网桥(docker network connect homenet container1
)之前,your_start_script.sh
它将崩溃,因为默认路由与任何可用的网络都不对应。
我测试了将ip route
内部container1
运行的输出记录为--restart always
,将其连接到自定义桥后,它具有所需的默认路由。
解决方案2:在容器启动事件中设置来自主机的容器默认路由
docker events --filter "container=container1" |\
awk '/container start/ { system("/path/to/route_setting.sh") }'
其中route_setting.sh
包含有关更改容器默认路线的说明:
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
此解决方案避免为容器授予特殊权限,并将路由更改责任转移给主机。
问题内容: 当我运行docker时,下载的docker映像(似乎是)存储在某个地方。 由于该目录上的磁盘空间有限,因此我要同时将docker设置到多台机器上;有没有办法将此默认位置更改为ie ? 问题答案: 您可以使用option和您选择的目录来启动Docker守护程序。这将为Docker设置适当的运行时。 对于1.8版,应该是这样的: 对于早期版本,它将是: 从手册页:
目前我正在使用 硒-3.3.0 火狐-52.2.0 壁虎驱动器-13
我已经尝试更改json文件中的basePath,这似乎只会更改swagger UI的底部“baseurl”。我想去掉在我的招摇过市UI中作为组标题出现的“默认设置”。有人能解决这个问题吗?我正在使用Swagger~2.0。
但它显示错误的路径:/usr/local/bin/javavm 而我需要有以下路径:/usr/local/openjdk8/bin/java 我尝试给出export命令:export java_home=/usr/local/openjdk8/,但问题仍然相同。 我不想对它进行硬编码,也不想使用其他命令,如或,因为脚本在Linux中得到了预期的结果,而只是在FreeBSD机器上出现了问题。 我也不
问题内容: 我知道如何使用dns设置创建新的docker-machine 但是已经有一个“默认”虚拟机,是否有办法更改其dns? 我在线阅读了使用boot2docker进行此操作的方法,但该工具已过时,而docker- machine已将其替换。不幸的是,它太新了,以至于我在网上找不到很多东西。 问题答案: 转到并将您自己的DNS服务器添加到并重新启动docker计算机。
当启动一个流浪者盒子时,“默认”这个名字来自哪里? 有没有办法设定这个?