Я пытаюсь связать 2 отдельных контейнера:
Проблема в том, что скрипты php не работают. Возможно, конфигурация php-fpm неверна. Вот исходный код, который находится в моем репозитории . Вот файл docker-compose.yml
:
nginx:
build: .
ports:
- "80:80"
- "443:443"
volumes:
- ./:/var/www/test/
links:
- fpm
fpm:
image: php:fpm
ports:
- "9000:9000"
и Dockerfile
который я использовал для создания собственного образа на основе образа nginx:
FROM nginx
# Change Nginx config here...
RUN rm /etc/nginx/conf.d/default.conf
ADD ./default.conf /etc/nginx/conf.d/
Наконец, вот моя настраиваемая конфигурация виртуального хоста Nginx:
server {
listen 80;
server_name localhost;
root /var/www/test;
error_log /var/log/nginx/localhost.error.log;
access_log /var/log/nginx/localhost.access.log;
location / {
# try to serve file directly, fallback to app.php
try_files $uri /index.php$is_args$args;
}
location ~ ^/.+\.php(/|$) {
fastcgi_pass 192.168.59.103:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
}
}
Может ли кто-нибудь помочь мне правильно настроить эти контейнеры для выполнения сценариев php?
PS Я запускаю контейнеры через docker-composer вот так:
docker-compose up
из корневого каталога проекта.
php
nginx
docker
dockerfile
docker-compose
Виктор Бочарский
источник
источник
docker exec
в работающий контейнер и пинговать fpm?Nginx
иPHP-FPM
вместе с Vagrant и Ansible. Проверьте мое репо github.com/bocharsky-bw/vagrant-ansible-docker, если хотите.Ответы:
Не указывайте жестко IP-адреса контейнеров в конфигурации nginx, docker link добавляет имя хоста связанного компьютера в файл hosts контейнера, и вы должны иметь возможность пинговать по имени хоста.
РЕДАКТИРОВАТЬ: Docker 1.9 Networking больше не требует связывать контейнеры, когда несколько контейнеров подключены к одной сети, их файл хостов будет обновлен, чтобы они могли связываться друг с другом по имени хоста.
Каждый раз, когда док-контейнер запускается из образа (даже при остановке / запуске существующего контейнера), контейнеры получают новый IP-адрес, назначенный хост-докером. Эти IP-адреса не находятся в той же подсети, что и ваши фактические машины.
см. докеры, связывающие документы (это то, что compose использует в фоновом режиме)
но более четко объяснено в
docker-compose
документации по ссылкам и разоблачениюи если вы настроили свой проект на получение портов + других учетных данных через переменные среды, ссылки автоматически устанавливают набор системных переменных :
источник
--links
теперь устарели, согласно документу докеров, на который вы ссылаетесь. В настоящее время они все еще поддерживаются, но очевидный план состоит в том, чтобы они устарели.Я знаю, что это старый добрый пост, но у меня была такая же проблема, и я не мог понять, почему ваш код не работает. После МНОГО испытаний я понял, почему.
Похоже, что fpm получает полный путь от nginx и пытается найти файлы в контейнере fpm, поэтому он должен быть точно таким же, как
server.root
в конфигурации nginx, даже если он не существует в контейнере nginx.Демонстрировать:
docker-compose.yml
/etc/nginx/conf.d/default.conf
Dockerfile
источник
/var/www/html
отказа.:9000
это порт, который используется в контейнере, а не тот, который открыт для вашего хоста. Мне потребовалось 2 часа, чтобы понять это. Надеюсь, вам не нужно.services.fpm.ports is invalid: Invalid port ":9000", should be [[remote_ip:]remote_port[-remote_port]:]port[/protocol]
ports
раздел. Он может вам просто понадобиться,expose
если его еще нет на изображении (что, вероятно, есть). Если вы осуществляете межконтейнерное взаимодействие, вы не должны открывать порт PHP-FPM.AH01071: Got error 'Primary script unknown\n'
и что контейнер php-fpm должен использовать один и тот же каталог с веб-узлами, было решением!Как указывалось ранее, проблема заключалась в том, что файлы не были видны контейнером fpm. Однако для обмена данными между контейнерами рекомендуется использовать контейнеры только для данных (как описано в этой статье ).
Короче говоря: создайте контейнер, который просто хранит ваши данные, поделитесь им с томом и свяжите этот том в своих приложениях с помощью
volumes_from
.Используя compose (1.6.2 на моей машине),
docker-compose.yml
файл будет выглядеть так:Обратите внимание , что
data
публикует объем , который связан сnginx
иfpm
услуг. ЗатемDockerfile
для службы данных , содержащей ваш исходный код:И
Dockerfile
для nginx, который просто заменяет конфигурацию по умолчанию:Для завершения вот конфигурационный файл, необходимый для работы примера:
который просто сообщает nginx использовать общий том в качестве корня документа и устанавливает правильную конфигурацию для nginx, чтобы иметь возможность взаимодействовать с контейнером fpm (то есть: право
HOST:PORT
, котороеfpm:9000
благодаря именам хостов, определенным в compose, иSCRIPT_FILENAME
).источник
Dockerfile
контейнер данных копирует ваши источники в контейнер во время сборки. Поэтому они не будут обновляться, если вы измените файлы на хосте. Если вы хотите поделиться источниками между хостом и контейнером, вам необходимо смонтировать каталог. Изменениеdata
службы в файл создания письма к нагрузкеimage: busybox
, и вvolumes
секции ввода./sources:/var/www/html
, где./sources
это путь к источникам в хозяине.Новый ответ
Docker Compose обновлен. Теперь у них есть формат файла версии 2 .
Теперь они поддерживают сетевую функцию Docker, которая при запуске устанавливает сеть по умолчанию с именем myapp_default.
Из их документации ваш файл будет выглядеть примерно так:
Поскольку эти контейнеры автоматически добавляются в сеть myapp_default по умолчанию, они смогут общаться друг с другом. Тогда у вас будет в конфигурации Nginx:
fastcgi_pass fpm:9000;
Также, как упоминалось @treeface в комментариях, не забудьте убедиться, что PHP-FPM прослушивает порт 9000, это можно сделать путем редактирования
/etc/php5/fpm/pool.d/www.conf
там, где вам нужноlisten = 9000
.Старый ответ
Я сохранил приведенную ниже информацию для тех, кто использует старую версию Docker / Docker compose и хотел бы получить информацию.
Я все время натыкался на этот вопрос в Google, пытаясь найти ответ на этот вопрос, но это было не совсем то, что я искал из-за акцента в вопросах и ответах на docker-compose (который на момент написания имел только экспериментальную поддержку для сетевые функции докеров). Итак, вот мой взгляд на то, что я узнал.
Docker недавно отказался от функции ссылки в пользу функции сети.
Поэтому с помощью функции Docker Networks вы можете связывать контейнеры, выполнив следующие действия. Полное объяснение опций читайте в ранее связанных документах.
Сначала создайте свою сеть
Затем запустите контейнер PHP-FPM, убедившись, что вы открыли порт 9000 и назначили его новой сети (
mynetwork
).Важный бит здесь - это имя
--name php-fpm
в конце команды, оно нам понадобится позже.Затем снова запустите контейнер Nginx и назначьте его созданной вами сети.
Для контейнеров PHP и Nginx вы также можете добавлять
--volumes-from
команды и т. Д. По мере необходимости.Теперь идет конфигурация Nginx. Что должно выглядеть примерно так:
Обратите внимание на значок
fastcgi_pass php-fpm:9000;
в блоке местоположения. То есть контактный контейнерphp-fpm
в порту9000
. Когда вы добавляете контейнеры в сеть моста Docker, все они автоматически получают обновление файла hosts, которое помещает их имя контейнера в соответствие с их IP-адресом. Поэтому, когда Nginx увидит, что он будет знать, что нужно связаться с контейнером PHP-FPM, который вы назвалиphp-fpm
ранее и назначили вашейmynetwork
сети Docker.Вы можете добавить эту конфигурацию Nginx либо во время процесса сборки вашего контейнера Docker, либо после этого решать вам.
источник
php-fpm
прослушивает порт 9000. Это будетlisten = 9000
в/etc/php5/fpm/pool.d/www.conf
.Как было решено в предыдущих ответах, но следует указать очень четко: код php должен находиться в контейнере php-fpm, а статические файлы должны находиться в контейнере nginx. Для простоты большинство людей просто прикрепили весь код к обоим, как я это сделал ниже. В будущем я, вероятно, выделю эти разные части кода в своих проектах, чтобы минимизировать, какие контейнеры имеют доступ к каким частям.
Обновлены мои файлы примеров ниже этим последним откровением (спасибо @alkaline)
Кажется, это минимальная настройка для docker 2.0 forward (потому что в docker 2.0 все стало намного проще)
docker-compose.yml:
( ОБНОВЛЕНИЕ docker-compose.yml выше : для сайтов, на которых есть css, javascript, статические файлы и т. Д., Вам понадобятся эти файлы, доступные для контейнера nginx. При этом весь код php доступен для контейнера fpm. Опять же, потому что мой базовый код представляет собой беспорядочную смесь css, js и php, этот пример просто прикрепляет весь код к обоим контейнерам)
В той же папке:
site.conf:
В папке с кодом:
./code/index.php:
и не забудьте обновить файл hosts:
и запустите свой docker-compose up
и попробуйте URL из вашего любимого браузера
источник
Я думаю, нам также нужно дать контейнеру fpm объем, не так ли? Итак =>
Если я этого не сделаю, я столкнусь с этим исключением при запуске запроса, поскольку fpm не может найти запрошенный файл:
источник
Nginx
иPHP-FPM
на немДля всех, кто получает
при использовании
index.php
whileindex.html
работает отлично и включивindex.php
в индекс в серверном блоке конфигурации своего сайта вsites-enabled
Убедитесь, что ваш файл nginx.conf
/etc/nginx/nginx.conf
действительно загружает конфигурацию вашего сайта вhttp
блоке ...источник