В: Как создать docker-compose.yml, чтобы я мог получить доступ к контейнеру Деймона из php?
A: Вы можете поделиться докером unix domain socket
для доступа к контейнеру демона.
Примерно так:
докер-compose.yml:
version: '3'
services:
app:
image: ubuntu:16.04
privileged: true
volumes:
- /usr/bin/docker:/usr/bin/docker
- /var/run/docker.sock:/var/run/docker.sock
- /usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7
command: docker run --rm vitr/casperjs casperjs --version
Тест:
# docker-compose up
WARNING: Found orphan containers (abc_plop_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Recreating abc_app_1 ... done
Attaching to abc_app_1
app_1 | 1.1.4
abc_app_1 exited with code 0
Вы видите, что 1.1.4
был напечатан командой выполнения docker run --rm vitr/casperjs casperjs --version
в app container
.
Это всего лишь пример, вы можете вызвать docker run --rm vitr/casperjs casperjs --version
по своему php container
, не использовать ubuntu:16.04
, по-прежнему использовать exec
в коде php и получить вывод.
Обновлено: (2018/11/05)
Сначала я думаю, что некоторые концепции должны быть согласованы с вами:
-d
: это означает start a container in detached mode
, а не daemon
. В докере, когда мы говорим о демоне, это означает docker daemon
, который принимал соединение docker cli
, см. здесь .
--rm
: это просто для удаления временного контейнера после его использования, вы также не можете его использовать.
Разница в использовании -d
& no -d
:
With -d
: он будет запускать контейнер в отдельном режиме, это означает, что даже запущенный контейнер, команда cli docker run
, сразу выйдет и покажет вам идентификатор контейнера, никакого журнала вы не увидите, как следующий:
# docker run -d vitr/casperjs casperjs --version
d8dc585bc9e3cc577cab15ff665b98d798d95bc369c876d6da31210f625b81e0
Without -d
: команда cli не завершится до тех пор, пока не завершится команда окончания контейнера, поэтому вы можете увидеть вывод команды, например:
# docker run vitr/casperjs casperjs --version
1.1.4
Итак, ваше требование состоит в том, чтобы получить вывод casperjs
, наверняка вам приходилось использовать режим no -d
, я думаю.
Если вы принимаете вышеизложенные понятия, вы можете перейти к работоспособному примеру:
структура папок:
abc
├── docker-compose.yml
└── index.php
докер-compose.yml:
version: '3'
services:
phpfpm:
container_name: phpfpm
image: nanoninja/php-fpm
entrypoint: php index.php
privileged: true
volumes:
- .:/var/www/html
- /usr/bin/docker:/usr/bin/docker
- /var/run/docker.sock:/var/run/docker.sock
- /usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7
index.php:
<?php
exec('docker run vitr/casperjs casperjs --version', $output);
print_r($output);
тест:
~/abc# docker-compose up
Starting phpfpm ... done
Attaching to phpfpm
phpfpm | Array
phpfpm | (
phpfpm | [0] => 1.1.4
phpfpm | )
phpfpm exited with code 0
Вы можете видеть, что 1.1.4
был напечатан через php, внимание privileged
& volumes
- это то, что нужно было установить.