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

3
我有三个Docker容器,一个运行着nginx,另一个运行php,第三个运行hashicorp的serf
我想使用php的exec函数调用serf二进制文件来触发serf事件
在我的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

我在想,我可以做类似于php的这样一些事情:exec('serf serf event "test"'),其中serf是容器的主机名。

或者也许有人可以提供一些使用替代方法设置此类功能的想法?

1个回答

5
“linked”容器允许容器之间进行网络级别的发现。随着Docker网络的推出,“linked”特性现在被认为是传统的,不再被推荐使用。要在另一个容器中运行命令,您需要在目标容器上打开网络API功能(例如,向目标容器发送基于REST的HTTP请求),或者将主机暴露给源容器,以便它可以针对目标容器运行docker exec
后一种方法需要在源容器中安装Docker客户端,然后通过在主机上打开端口或挂载/var/run/docker.sock到容器中来公开服务器。由于这允许容器在主机上拥有root访问权限,因此除了管理容器外,不建议使用该做法,否则您必须完全信任直接在主机上运行的代码。
我能想到的唯一其他选择是使用共享卷消除容器之间的隔离。
理想的解决方案是使用消息队列服务,允许多个worker按照自己的节奏启动和处理请求。源容器向队列发送请求,当目标容器正在运行时,目标容器监听请求。这也允许系统在worker当前停机时继续进行,活动只需排队等待处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接