如何在与docker-compose链接到另一个容器的容器中运行linux守护进程?

时间:2017-11-16 18:16:34

标签: php docker nginx docker-compose daemon

我有以下docker-compose.yml文件,该文件在PHP支持下运行nginx:

version: '3'
services:
  nginx:
    container_name: my-app-nginx
    image: nginx:1.13.6
    ports:
      - 8080:80
    volumes:
      - ./nginx-default.conf:/etc/nginx/conf.d/default.conf
      - ./my-app:/var/www/my-app
    restart: always
    depends_on:
      - php
  php:
    container_name: my-app-php
    image: php:7.1-fpm
    volumes:
      - ./my-app:/var/www/my-app
    restart: always

/var/www/my-app内的PHP应用程序需要与linux守护进程通信(我们称之为myappd)。

我看到它的方式,我需要:

  1. myappd复制到nginx容器中/usr/local/bin,使其chmod +x可执行,然后在后台运行。
  2. 创建一个不同的容器,将myappd复制到/usr/local/bin,使其chmod +x可执行,然后在前台运行。
  3. 现在,我是Docker的新手,我正在研究和学习它,但我最好的猜测,鉴于我使用的是Docker Composer,选项2可能是推荐的吗?鉴于我对Docker的了解有限,我不得不猜测这个容器需要某种基于linux的图像(比如Ubuntu或其他东西)来运行这个二进制文件。那么选项1是首选吗?或者也许选项2可以使用最小的Ubuntu图像,或者可能没有这样的图像?

    无论哪种方式,我都不知道如何在composer文件上实现它。特别是选项2,PHP应用程序如何与另一个容器中的守护进程通信?只是“共享”一个卷(二进制文件所在的位置)就像我为nginx / php服务所做的那样就够了吗?还是需要其他东西?

1 个答案:

答案 0 :(得分:1)

简单的答案是在docker-compose.yml中向command服务添加php条目。

鉴于myappd位于主机上的./my-app/和/ var / www / my-app /,更新的docker-compose.yml如下所示。

version: '3'
services:
  nginx:
    container_name: my-app-nginx
    image: nginx:1.13.6
    ports:
       - 8080:80
    volumes:
      - ./nginx-default.conf:/etc/nginx/conf.d/default.conf
      - ./my-app:/var/www/my-app
    restart: always
    depends_on:
       - php
  php:
    container_name: my-app-php
    image: php:7.1-fpm
    volumes:
      - ./my-app:/var/www/my-app
    restart: always
    command: ["/bin/sh", "/var/www/my-app/mappd", "&&", "php-fpm"]

更好的答案是创建运行linux守护程序的第三个容器。

新的Dockerfile类似于以下内容。

FROM debian:jessie

COPY ./myappd /usr/src/app/

EXPOSE 44444

ENTRYPOINT ['/bin/sh']
CMD ['/usr/src/app/myappd']

构建图片并将其命名为myapp/myappd

更新了docker-compose.yml,如下所示。

version: '3'
services:
  nginx:
    container_name: my-app-nginx
    image: nginx:1.13.6
    ports:
       - 8080:80
    volumes:
      - ./nginx-default.conf:/etc/nginx/conf.d/default.conf
      - ./my-app:/var/www/my-app
    restart: always
    depends_on:
       - php
  php:
    container_name: my-app-php
    image: php:7.1-fpm
    volumes:
      - ./my-app:/var/www/my-app
    restart: always
    networks:
      - network1
    depends_on:
       - daemon
  daemon:
    container_name: my-app-daemon
    image: myapp/myappd
    restart: always
    networks:
      - network1
networks:
  network1:

您可以从daemon内发送带有主机名php的请求。 Docker容器能够解析同一网络中另一个容器的主机名。