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

Eli*_*Eli 3 docker docker-compose

我有 3 个 Docker 容器,一个正在运行nginx,另一个正在运行,一个由 hashcorpphp运行。serf

我想使用 phpexec函数调用serf二进制文件来触发serf event

在我的 docker compose 中我写了

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
Run Code Online (Sandbox Code Playgroud)

我想象我会在 php 中执行类似的操作,exec('serf serf event "test"')其中serf是容器的主机名。

或者也许有人可以提供如何使用替代方法进行类似设置的想法?

BMi*_*tch 5

“链接”容器允许容器之间的网络级发现。对于 docker 网络,链接功能现在被认为是遗留的,并且不再真正推荐。要在另一个容器中运行命令,您需要在目标容器上打开网络 API 功能(例如,向目标容器发出基于 REST 的 http 请求),或者需要将主机公开给源容器,以便可以docker exec针对目标容器运行。

后者要求您在源容器中安装 docker 客户端,然后通过主机上的开放端口或/var/run/docker.sock在容器中安装来公开服务器。由于这允许容器在主机上具有根访问权限,因此对于管理容器以外的任何其他容器,不建议这样做,否则您会信任直接在主机上运行的代码。

我能想到的唯一其他选择是消除具有共享卷的容器之间的隔离。

理想的解决方案是使用消息队列服务,该服务允许多个工作人员按照自己的节奏启动和处理请求。源容器向队列发送请求,目标容器在运行时监听请求。这也使得系统即使在工作人员当前停机时也能继续运行,活动只需排队即可。