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

我有以下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应用/var/www/my-app需要与一个linux守护进程进行通信(我们称之为myappd )。

我看到的方式,我需要:

  1. myappd复制到/usr/local/binnginx容器中,用chmod +x使其可执行,并在后台运行。
  2. 创build一个不同的容器,将myappd复制到/usr/local/bin ,使用chmod +x使其可执行,并在前台运行它。

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

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

简单的答案是在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"] 

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

新的Dockerfile就像下面这样。

 FROM debian:jessie COPY ./myappd /usr/src/app/ EXPOSE 44444 ENTRYPOINT ['/bin/sh'] CMD ['/usr/src/app/myappd'] 

构build映像并将其命名为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容器能够parsing同一networking中另一个容器的主机名。