【问题标题】:How to run linux daemon in container linked to another container with docker-compose?如何在使用 docker-compose 链接到另一个容器的容器中运行 linux 守护程序?
【发布时间】:2017-11-16 18:16:34
【问题描述】:

我有以下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使其可执行并在前台运行。

现在,我是 Docker 的新手,我正在研究和学习它,但我最好的猜测是,鉴于我正在使用 Docker Composer,那选项 2 可能是推荐的吗?鉴于我对 Docker 的了解有限,我不得不猜测这个容器需要某种基于 linux 的映像(比如 Ubuntu 或其他东西)来运行这个二进制文件。所以也许选项1是首选?或者也许选项 2 可以使用最小的 Ubuntu 映像,或者可能没有这样的映像?

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

【问题讨论】:

    标签: php docker nginx docker-compose daemon


    【解决方案1】:

    简单的答案是将command 条目添加到docker-compose.yml 中的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:
    

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

    【讨论】:

    • 你的问题是我最初的问题。这就是我需要知道的。
    • 我不是说 myappd 应该放在哪里,而是问原来的 myappd 现在在哪里。在主机上?
    • 是的,它在宿主机中,我需要将它复制到容器中并让它在后台运行。
    • 我认为 option2 更可取。 php:7.1-fpm 的基础镜像是 debian:jessie,所以这个镜像可以运行 myappd 二进制文件。
    • linux daemon 必须在 php 启动之前运行?换句话说,php 依赖于 linux 守护进程?我想知道php和linux daemon的关系。
    猜你喜欢
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 2016-06-15
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多