我有以下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
)。
我看到它的方式,我需要:
myappd
复制到nginx
容器中/usr/local/bin
,使其chmod +x
可执行,然后在后台运行。myappd
复制到/usr/local/bin
,使其chmod +x
可执行,然后在前台运行。现在,我是Docker的新手,我正在研究和学习它,但我最好的猜测,鉴于我使用的是Docker Composer,选项2可能是推荐的吗?鉴于我对Docker的了解有限,我不得不猜测这个容器需要某种基于linux的图像(比如Ubuntu或其他东西)来运行这个二进制文件。那么选项1是首选吗?或者也许选项2可以使用最小的Ubuntu图像,或者可能没有这样的图像?
无论哪种方式,我都不知道如何在composer文件上实现它。特别是选项2,PHP应用程序如何与另一个容器中的守护进程通信?只是“共享”一个卷(二进制文件所在的位置)就像我为nginx / php服务所做的那样就够了吗?还是需要其他东西?
答案 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容器能够解析同一网络中另一个容器的主机名。