在docker中的链接容器上执行二进制文件

我有3个Docker容器,一个运行nginx ,另一个php和一个由hashicorp运行的serf。

我想使用php exec函数来调用serf二进制来启动一个serf event

在我的docker写作,我写了

 version: '2' services: web: restart: always image: `alias`/nginx-pagespeed:1.11.4 ports: - 80 volumes: - ./web:/var/www/html - ./conf/nginx/default.conf:/etc/nginx/conf.d/default.conf links: - php environment: - SERVICE_NAME=${DOMAIN} - SERVICE_TAGS=web php: restart: always image: `alias`/php-fpm:7.0.11 links: - serf external_links: - mysql expose: - "9000" volumes: - ./web:/var/www/html - ./projects:/var/www/projects - ./conf/php:/usr/local/etc/php/conf.d serf: restart: always dns: 172.17.0.1 image: `alias`/serf container_name: serf ports: - 7496:7496 - 7496:7496/udp command: agent -node=${SERF_NODE} -advertise=${PRIVATE_IP}:7496 -bind=0.0.0.0:7496 

我想象的是,我会做一些像在PHP的exec('serf serf event "test"') ,其中serf是容器的主机名。

或者,也许有人可以给出一个如何使用替代方法设置这样的东西的想法?

“链接”容器允许容器之间的networking级别发现。 通过dockernetworking,链接function现在被认为是遗留的,不再被推荐。 要在另一个容器中运行一个命令,你需要在目标容器上打开一个networkingAPIfunction(例如,基于REST的http请求到目标容器),或者你需要将主机暴露给源容器,可以对目标容器运行docker exec

后者要求您在源容器中安装docker客户端,然后用主机上的开放端口或在容器中挂载/var/run/docker.sock来暴露服务器。 由于这允许容器在主机上具有root访问权限,所以除了pipe理容器之外,对于其他任何情况,否则不build议您采用这种做法,否则,您将信任直接在主机上运行的代码。

我能想到的其他选项是使用共享卷删除容器之间的隔离。

一个理想的解决scheme是使用消息排队服务,允许多个工作人员按自己的步调启动并处理请求。 源容器向队列发送请求,目标容器在运行时侦听请求。 这也可以让系统继续工作,即使工人正在停工,活动也只是排队等候。