我创build一个像这样的Docker容器:
$sudo docker build -t "logstash-collector" ~/logging/logstash/ $sudo docker run -d \ --user=root \ --name="logstash-collector-01" \ --net=logging \ --cap-add=NET_ADMIN \ logstash-collector
从那里我可以改变它的默认网关到一个nginx容器(为了透明的负载平衡):
$sudo docker exec -it logstash-collector-01 ip route delete default $sudo docker exec -it logstash-collector-01 ip route add default via 172.18.0.10
它的工作,一切都很好:
$sudo docker exec -it logstash-collector-01 ip route default via 172.18.0.10 dev eth0 172.18.0.0/16 dev eth0 proto kernel scope link src 172.18.0.3
但是当我尝试通过将这些命令放在我的〜/ logging / logstash / Dockerfile中来自动执行此操作时,如:
FROM logstash COPY logstash.conf /usr/local/share CMD ["-f", "/usr/local/share/logstash.conf", "--config.reload.automatic"] CMD ["ip", "route", "delete", "default"] CMD ["ip", "route", "add", "default", "via", "172.18.0.10"]
我看到他们在构build过程中被执行:
但是容器无法启动。 sudo docker logs logstash-collector-01告诉我: RTNETLINK的答案:文件存在
如果我发出第二个ip route命令而不发出第一个命令(如果一个已经在其活动路由表中,那么Linux不会添加一个路由)。 但是,这怎么可能呢? 我的Dockerfile的CMD命令是否按顺序处理?
这是因为您只能为每个dockerfile指定一个CMD。
CMD是容器将运行的东西(通常是logstash,一个长期运行的守护进程),所以你在做什么只是运行最后一个CMD。
您可以考虑使用单个容器的networking来共享nginx和logstash代理之间的lo-fi解决scheme,但是您需要跟踪端口。
更高的链条是像kubernetes这样的事情更容易的解决scheme。
在这之间,你可以查看领事(/ SkyDNS)来帮助DNS发现。