我已经看到了一些关于Docker容器如何直接与其主机系统通信的选项,但它们似乎都是偷偷摸摸的。例如,似乎可以启动一个容器并将容器中的docker可执行文件绑定(bind)(使用-v)到主机的docker可执行文件。可以使用网络协议(protocol)将消息发送到主机。似乎--privilege标志也可能会有所帮助。
这些方法中的每一种似乎都具有缺点和安全问题。我更大的问题是,这种架构是否是最好的方法。
我们的目标是让docker守护进程运行,轮询被用作队列的数据库。 (我知道这在某些方面是令人皱眉的,但我们的流量非常低且内部。这种队列的性能不是问题。)当docker守护程序检测到有工作要做时,它将启动另一个docker容器处理这项工作。该容器在完成后会死亡。每个容器都属于一个“系统”,并且将在该系统上运行负载。每个系统上只能有一个运行容器的负载。
这是一个有意义的范例吗?
守护程序作为主机级进程会更好吗?例如,Python脚本而不是Docker容器?
Docker是否打算以这种方式使用?我只是在Docker文档中错过了告诉我该怎么做的地方吗?
毕竟,我上面的“鬼nea”想法不是那么偷偷摸摸吗?
我了解这里有机会发表意见。我正在寻找一些简洁的最佳做法。
提前致谢!
最佳答案
我见过最多的首选解决方案是将docker二进制文件安装在容器中,然后将/var/run/docker.sock挂载到容器中。我拥有类似的Dockerfile看起来像:
FROM upsteam:latest
ARG DOCKER_GID=999
USER root
# install docker
RUN curl -sSL https://get.docker.com/ | sh
# app setup goes here
# configure user with access to docker
RUN groupmod -g ${DOCKER_GID} docker && \
usermod -aG docker appuser
USER appuser
然后运行:
docker run -d --name myapp -v /var/run/docker.sock:/var/run/docker.sock myapp
因为您删除了网络带宽,所以这将是最有效的解决方案。而且,它可以从开放端口中删除任何网络漏洞,也可以消除将TLS证书包含在容器内的所有网络漏洞,这些漏洞可能会因丢失备份等意外泄漏。
关于docker - 如何编写可以根据需要启动其他Docker容器的Docker守护进程?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38458825/