如何在与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
)。
我看到的方式,我需要:
- 把
myappd
复制到/usr/local/bin
的nginx
容器中,用chmod +x
使其可执行,并在后台运行。 - 创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中另一个容器的主机名。