我正在尝试使用两个容器设置Docker。一个是Web应用程序,第二个是dnsmasq DHCP服务器。
Docker 应该从 Web 应用程序中的事件更新 dnsmasq 容器和 dhcp ip 列表。到目前为止,我唯一的选择是生成 dhcp 主机文件并重新启动 dnsmasq 容器,但这需要在 Web 应用程序容器之外的 Docker 主机中手动完成。
有没有办法从另一个容器重新启动服务?
从另一个容器重新启动容器的唯一方法是挂载/var/run/docker.sock 并使用 API。 但是出于明显的安全原因,我不会在网络应用程序中执行此操作。
我会在容器之间共享 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
我必须复制额外的库并设置符号链接。