我试图设置两个容器的Docker。一个是Web应用程序,另一个是dnsmasq DHCP服务器。从另一个容器重新启动码头集装箱
Docker应该从Web应用中的事件更新dnsmasq容器和dhcp ip列表。到目前为止,我唯一的选择是生成dhcp hosts文件并重新启动dnsmasq容器,但它需要在Web应用程序容器外部的Docker主机中手动完成。
有没有办法从另一个容器重新启动服务?
我试图设置两个容器的Docker。一个是Web应用程序,另一个是dnsmasq DHCP服务器。从另一个容器重新启动码头集装箱
Docker应该从Web应用中的事件更新dnsmasq容器和dhcp ip列表。到目前为止,我唯一的选择是生成dhcp hosts文件并重新启动dnsmasq容器,但它需要在Web应用程序容器外部的Docker主机中手动完成。
有没有办法从另一个容器重新启动服务?
从另一个容器重新启动容器的唯一方法是挂载/var/run/docker.sock并使用API。但出于明显的安全原因,我不会从web应用程序那样做。
我将在容器之间共享dhcp hosts文件(使用-v option
),并在dnsmasq容器中运行一个脚本,用于检查此文件中的更改并重新启动容器中的dnsmasq服务。没有必要重新启动容器。你可以使用Supervisord来启动dnsmasq和这个脚本。我会使用--init
标志来避免僵尸进程。
从您的主机:
docker run -it --rm -v /var/run/docker.sock:/var/run/docker.sock --name=xxx ubuntu bash
docker cp /usr/bin/docker xxx:/usr/bin/docker
容器内去检查未解决的库:
ldd /usr/bin/docker
手动复制丢失从主机库倒入容器和设置包括符号链接。在我而言,我不得不:
docker cp /usr/lib/x86_64-linux-gnu/libltdl.so.7.3.1 xxx:/usr/lib/x86_64-linux-gnu/libltdl.so.7.3.1
然后将容器我不得不里面:
ln -sf /usr/lib/x86_64-linux-gnu/libltdl.so.7.3.1 /usr/lib/x86_64-linux-gnu/libltdl.so.7
容器内部再次检查:ldd /usr/bin/docker
如果一切顺利,你就可以执行docker
在容器内。
请注意,docker-compose
当我从主机复制到容器时马上运行。只有docker
我不得不复制额外的库并设置符号链接。
通常,我会为许多Unix进程'kill -s SIGHUP'强制它重新加载配置。但是这无法用docker完成,所以dockerized应用程序必须有一个额外的侦听线程来侦听特殊的自定义操作。有时候,我想过使用'redis'作为容器之间的消息队列。所以这整个集装箱间的通信仍然处理几种非标准的方式。 –
ifelsemonkey