Запустить контейнер с ubuntu используя dockerfile собрать связку nginx php fpm в одном контейнере

Обновлено: 29.06.2024

Команды Dockerfile

Инструкция FROM инициализирует новый этап сборки и должна располагаться в верхней части Dockerfile.

LABEL

С помощью этой инструкции вы можете добавить дополнительную информацию о вашем образе Docker, такую ​​как версия, описание и т.д.

Эта инструкция используется для выполнения команды в процессе сборки образа Docker. Вы можете установить дополнительные пакеты, необходимые для ваших образов Docker.

Инструкция ADD используется для копирования файлов, каталогов или файлов из удаленных русурсов в ваши образы Docker. Кроме того, вы можете настроить права на файл по умолчанию.

Инструкция ENV используется для определения переменной среды, которая может использоваться на этапе сборки.

CMD используется для определения команды по умолчанию для выполнения при запуске контейнера. Dockerfile должен содержать только одну инструкцию CMD, и, если имеется несколько CMD, будет выполняться последняя инструкция CMD.

EXPOSE

Эта инструкция используется для предоставления порта контейнера на определенных сетевых портах во время выполнения. По умолчанию используется протокол TCP, но вы можете указать, будет ли он TCP или UDP.

ENTRYPOINT

Инструкция ENTRYPOINT используется для определения первой команды и команды по умолчанию, которая будет выполняться при запуске контейнера. Определите команду для запуска приложения с помощью инструкции ENTRYPOINT.

WORKDIR

Инструкция WORKDIR используется для определения рабочего каталога по умолчанию вашего образа Docker. Инструкции RUN, CMD, ENTRYPOINT и ADD следуют за инструкцией WORKDIR. Вы можете добавить несколько инструкций WORKDIR в ваш Dockerfile. Если она не существует, она будет создана автоматически.

Инструкция USER используется для определения пользователя или gid по умолчанию при запуске образа. RUN, CMD и ENTRYPOINT следуют за инструкциям USER в Dockerfile.

VOLUME

Инструкция VOLUME используется для создания точки монтирования между контейнером и базовым хостом.

1. Установка Docker в Ubuntu 20.04

Для начала установим Docker в нашу систему.

Обновите список всех пакетов в репозитории Ubuntu и установите Docker с помощью команды apt ниже.

По окончанию установки запустим службу Docker и добавим ее в автозагрузку.

Убедимся что сервис Docker запущен.


Для проверки правильности установки запустим тестовый образ.

Результатом выполнения команды будет следующее:


2. Создание Dockerfile и других файлов конфигурации.

Теперь рассмотрим как сделать собственный образ Docker для вашего приложения, используя Dockerfile. Мы создадим новый пользовательский образ Docker на основе Ubuntu 20.04 с Nginx и PHP-FPM.

Создадим новый каталог проекта и добавим в него пустой файл Dockerfile.

Начнем создавать Dockerfile.

В верхней части строки добавьте образ Ubuntu 20.04 для базового образа, используя инструкцию FROM, как показано ниже.

Добавим подробную информацию о пользовательском образе, используя инструкцию LABEL.

Перед установкой любых пакетов будем выполнять команду «apt update»

Теперь установим пакеты Nginx, PHP-FPM и supervisor. По завершению установки чтобы уменьшить размер пользовательского образа удалим кэш всех пакетов, .

Определим новую переменную среды, которая может быть передана в пользовательский образ.

Изменим владельца корневого каталога веб-сервера «/var/www/html», создадим новый каталог «/run/php» и назначим права на него пользователю «www-data».

Определите том для пользовательского образа, чтобы мы могли смонтировать все эти каталоги на хост-машине.

Теперь добавим скрипт start.sh и определим команду контейнера по умолчанию, используя инструкцию CMD, как показано ниже.

Сохранить (Ctrl+O)и закрыть (Ctrl+X).

Полный текст скрипта Dockerfile, который должен был получится:

Далее мы создадим новую дополнительную конфигурацию для Nginx, supervisord и сценария start.sh.

Конфигурация виртуального хоста Nginx по умолчанию будет содержать раздел для PHP-FPM. По сути, вы можете запустить скрипт PHP, используя пользовательский образ без каких-либо изменений.

Создайте новую конфигурацию виртуального хоста Nginx .

Вставим следующие строки:

Вставьте в него следующее:

Сохраните и закройте файл.

Сделаем его исполняемым

В результате была создана вся конфигурация для нашего пользовательского образа Docker.


Теперь мы готовы создать новый пользовательский образ на основе этих конфигураций.

3. Создадим и запустим новый пользовательский контейнер.

После завершения всего процесса проверьте список доступных образов Docker в вашей системе, используя следующую команду.

Ниже приведен результат, который вы получите.


На вашем локальном компьютере создайте новый каталог с именем «webroot», который будет использоваться для хранения всех файлов веб-сервера.

Создадим новый контейнер с именем test-container, используя команду docker run.

Чтобы убедиться, что служба PHP-FPM работает, создадим файл info.php в каталоге /webroot.


В результате мы успешно создали новый пользовательский образ Docker и запустили новый контейнер на его основе.

По данной инструкции мы настроим наш веб сервер в Docker следующим образом:

  • В качестве веб-сервера будет использоваться NGINX.
  • Будет поддержка приложений на PHP.
  • Мы создадим 2 контейнера Docker — один для NGINX + PHP, второй для СУБД (MariaDB).
  • Веб-приложение будет зашито в контейнере. Раздел для данных MariaDB будет монтироваться в качестве volume.

Данную конфигурацию можно использовать для быстрого развертывания сайтов или для локальной разработки.

Мы будем работать в системе на базе Linux. Предполагается, что Docker уже установлен.

NGINX + PHP + PHP-FPM

Рекомендуется каждый микросервис помещать в свой отдельный контейнер, но мы (для отдельного примера) веб-сервер с интерпретатором PHP поместим в один и тот же имидж, на основе которого будут создаваться контейнеры.

Создание образа

Создадим каталог, в котором будут находиться файлы для сборки образа веб-сервера:

mkdir -p /opt/docker/web-server

Переходим в созданный каталог:

* где:
1) указываем, какой берем базовый образ. В нашем случае, CentOS 8.
3) задаем для информации того, кто создал образ. Указываем свое имя и адрес электронной почты.
5) создаем переменную окружения TZ с указанием временной зоны (в нашем примере, московское время).
7) запускаем обновление системы.
8) устанавливаем пакеты: веб-сервер nginx, интерпретатор php, сервис php-fpm для обработки скриптов, модуль php-mysqli для работы php с СУБД MySQL/MariaDB.
9) удаляем скачанные пакеты и временные файлы, образовавшиеся во время установки.
10) добавляем в конфигурационный файл nginx строку daemon off, которая запретит веб-серверу автоматически запуститься в качестве демона.
11) создаем каталог /run/php-fpm — без него не сможет запуститься php-fpm.
13) копируем содержимое каталога html, который находится в том же каталоге, что и dockerfile, в каталог /usr/share/nginx/html/ внутри контейнера. В данной папке должен быть наше веб-приложение.
15) запускаем php-fpm и nginx. Команда CMD в dockerfile может быть только одна.
17) открываем порт 80 для работы веб-сервера.

В рабочем каталоге создаем папку html:

. а в ней — файл index.php:

* мы создали скрипт, который будет выводить информацию о php в браузере для примера. По идее, в данную папку мы должны положить сайт (веб-приложение).

Создаем первый билд для нашего образа:

docker build -t dmosk/webapp:v1 .

Новый образ должен появиться в системе:

docker login --username dmosk

docker tag dmosk/webapp:v1 dmosk/web:nginx_php7

docker push dmosk/web:nginx_php7

* первой командой мы прошли аутентификацию на портале докер-хаба (в качестве id/login мы используем dmosk — это учетная запись, которую мы зарегистрировали в Docker Hub). Вторая команда создает тег для нашего образа, где dmosk — учетная запись на dockerhub; web — имя репозитория; nginx_php7 — сам тег. Последняя команда заливает образ в репозиторий.
* подробнее про загрузку образа в репозиторий докера.

Запуск контейнера и проверка работы

Запускаем веб-сервер из созданного образа:

docker run --name web_server -d -p 80:80 dmosk/webapp:v1

Информация о PHP

Наш веб-сервер из Docker работает.

MariaDB

Для запуска СУБД мы будем использовать готовый образ mariadb. Так как после остановки контейнера, все данные внутри него удаляются, мы должны подключить внешний том, на котором будут храниться наши базы.

Сначала создаем том для докера:

docker volume create --name mariadb

* в данном примере мы создали том с именем mariadb. Будет создан каталог /var/lib/docker/volumes/mariadb/_data/ на хостовом сервере, куда будут размещаться наши файлы базы.

Выполним первый запуск нашего контейнера с mariadb:

docker run --rm --name maria_db -d -e MYSQL_ROOT_PASSWORD=password -v mariadb:/var/lib/mysql mariadb

  • --rm — удалить контейнер после остановки. Это первый запуск для инициализации базы, после параметры запуска контейнера будут другими.
  • --name maria_db — задаем имя контейнеру, по которому будем к нему обращаться.
  • -e MYSQL_ROOT_PASSWORD=password — создаем системную переменную, содержащую пароль для пользователя root базы данных. Оставляем его таким, как в данной инструкции, так как следующим шагом мы его будем менять.
  • -v mariadb:/var/lib/mysql — говорим, что для контейнера мы хотим использовать том mariadb, который будет примонтирован внутри контейнера по пути /var/lib/mysql.
  • mariadb — в самом конце мы указываем имя образа, который нужно использовать для запуска контейнера. Это образ, который при первом запуске будет скачан с DockerHub.

В каталоге тома должны появиться файлы базы данных. В этом можно убедиться командой:

Теперь подключаемся к командной строке внутри контейнера с сервером базы данных:

docker exec -it maria_db /bin/bash

Подключаемся к mariadb:

Меняем пароль для учетной записи root:

Выходим из командной строки СУБД:

Выходим из контейнера:

Останавливаем сам контейнер — он нам больше не нужен с данными параметрами запуска:

docker stop maria_db

И запускаем его по новой, но уже без системной переменной с паролем и необходимостью его удаления после остановки:

docker run --name maria_db -d -v mariadb:/var/lib/mysql mariadb

Сервер баз данных готов к работе.

Подключение к базе из веб-сервера

По отдельности, наши серверы готовы к работе. Теперь настроим их таким образом, чтобы из веб-сервера можно было подключиться к СУБД.

Зайдем в контейнер с базой данных:

docker exec -it maria_db /bin/bash

Подключимся к mariadb:

Создадим базу данных, если таковой еще нет:

> CREATE DATABASE docker_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

* в данном примере мы создаем базу docker_db.

Создаем пользователя для доступа к нашей базе данных:

* и так, мы дали полные права на базу docker_db пользователю docker_db_user, который может подключаться от любого хоста (%). Пароль для данного пользователя — docker_db_password.

Отключаемся от СУБД:

Выходим из контейнера:

Теперь перезапустим наши контейнеры с новым параметром, который будет объединять наши контейнеры по внутренней сети.

Останавливаем работающие контейнеры и удаляем их:

docker stop maria_db web_server

docker rm maria_db web_server

docker network create net1

* мы создали сеть net1.

Создаем новые контейнеры из наших образов и добавляем опцию --net, которая указывает, какую сеть будет использовать контейнер:

docker run --name maria_db --net net1 -d -v mariadb:/var/lib/mysql mariadb

docker run --name web_server --net net1 -d -p 80:80 dmosk/webapp:v1

* указав опцию --net, наши контейнеры начинают видеть друг друга по своим именам, которые мы задаем опцией --name.

Готово. Для проверки соединения с базой данных в php мы можем использовать такой скрипт:

ini_set("display_startup_errors", 1);
ini_set("display_errors", 1);
ini_set("html_errors", 1);
ini_set("log_errors", 1);
error_reporting(E_ERROR | E_PARSE | E_WARNING);

* в данном примере мы подключаемся к базе docker_db на сервере maria_db с использованием учетной записи docker_db_user и паролем docker_db_password.

После его запуска, мы увидим либо пустой вывод (если подключение выполнено успешно), либо ошибку.

Использование docker-compose

В отличие от docker, с помощью docker-compose можно разворачивать проекты, состоящие из нескольких контейнеров, одной командой.

И так, автоматизируем запуск наших контейнеров с использованием docker-compose. Необходимо, чтобы он был установлен в системе.

Сначала удалим контейнеры, которые создали на предыдущих этапах:

docker rm -f web_server maria_db

Переходим в каталог для наших сборок:

Создаем yml-файл с инструкциями сборки контейнеров через docker-compose:

web_server:
build:
context: ./web-server/
args:
buildno: 1
container_name: web_server
restart: always
environment:
TZ: "Europe/Moscow"
ports:
- 80:80

maria_db:
image: mariadb
container_name: maria_db
restart: always
environment:
TZ: "Europe/Moscow"
volumes:
- /var/lib/docker/volumes/mariadb/_data/:/var/lib/mysql

* в формате yml очень важное значение имеют отступы. Если сделать лишний пробел, то мы получим ошибку.
* где:

Запускаем сборку наших контейнеров с помощью docker-compose:

Запускаем контейнеры в режиме демона:

docker-compose up -d

Проверяем, какие контейнеры запущены:

При внесении изменений можно перезапускать контейнеры командой:

docker-compose up --force-recreate --build -d

Просто пересоздать контейнеры:

или только для одного из сервисов:

docker-compose restart web_server

* где web_server — название сервиса в файле docker-compose.

Возможные проблемы

Рассмотрим некоторые проблемы, которые могут возникнуть в процессе настройки.

Ошибка возникает при попытке собрать имидж на Linux CentOS 8. Полный текст ошибки может быть такой:

Причина: система внутри контейнера не может разрешить dns-имена в IP-адрес.

Решение: в CentOS 8 запросы DNS могут блокироваться брандмауэром, когда в качестве серверной части (backend) стоит nftables. Переключение на iptables решает проблему. Открываем файл:

В предыдущей части данного руководства мы увидели, как можно сохранить изменения в контейнере в новый образ. Такой способ подходит, если количество изменений относительно невелико – вводить все команды вручную каждый раз может быть затруднительно. Для упрощения процесса сборки можно воспользоваться Dockerfile. Это специальный скрипт, в котором содержатся команды и инструкции, которые будут в заданной последовательности выполнены для сборки нового образа Docker.
В данном руководстве мы рассмотрим создание собственного образа Docker при помощи Dockerfile. Он будет подробно разобран, чтобы в дальнейшем вы легко смогли создать свой собственный скрипт.

Обзор команд Dockerfile

На первый взгляд команды CMD и ENTRYPOINT кажутся одинаковыми. Они выполняют команду при запуске контейнера. Но все таки между ними есть разница. Мы не будем вдаваться в тонкости, запомните только то что если вы укажете CMD то докер выполнит эту команду, используя стандартную команду ENTRYPOINT, которая является /bin/sh -c. И эту команду вы сможете переопределить при запуске контейнера Если вы укажете ENTRYPOINT то при запуске контейнера переопределить команду вы уже не сможете.

Создание Dockerfile

На данном этапе мы создадим для Dockerfile новую директорию и определим, что мы хотим сделать при помощи Dockerfile.
Создайте новую директорию и пустой файл в ней

Затем определим, какой образ требуется создать. В данном руководстве мы установим Nginx и PHP-FPM7, используя образ Ubuntu 18.04. Кроме того, нам потребуется Supervisord, чтобы запустить Nginx и PHP-FPM 7 одной командой.
Откройте Dockerfile в любом текстовом редакторе, например vim:

В начале файла добавьте строку с указанием базового образа, который мы будем использовать (Ubuntu 18.04):

Теперь установим приложения, который требуются для нашего образа. При помощи apt можно установить Nginx, PHP-FPM и Supervisord из репозитория Ubuntu. Добавьте соответствующую команду RUN:

После установки приложений их нужно настроить. Мы настроим Nginx для работы с PHP путем изменения конфигурации виртуального хоста по умолчанию. Можно отредактировать существующий файл конфигурации командой sed или заменить его новым файлом при помощи команды Dockerfile COPY.

Теперь настроим Supervisord для Nginx and PHP-FPM, точно так же заменив файл конфигурации по умолчанию новым файлом, используя команду COPY.

Создадим новую директорию для sock-файла php-fpm и изменим владельца директории /var/www/html и директории PHP на www-data.

Определим том, чтобы смонтировать указанные ниже директории на хост:

Указываем порты для nginx

Сохраните и закройте файл.

Вот весь скрипт Dockerfile целиком:

Теперь внутри директории с Dockerfile создайте новый файл конфигурации виртуального хоста под названием «default», файл конфигурации supervisord «supervisord.conf» и скрипт конфигурации сервисов «start.sh».

Вставьте в файл конфигурации виртуального хоста следующий код:

Откройте файл конфигурации Supervisord:

Вставьте следующий код конфигурации:

Откройте файл start.sh.

Вставьте следующие параметры конфигурации:

Сохраните и закройте файл.

При помощи команды chmod сделайте файл start.sh исполняемым:

Создание нового образа и контейнера

Теперь, когда у нас есть все необходимые файлы конфигурации, можно собрать новый образ Docker на основе Ubuntu 18.04, используя наш Dockerfile. Для этого нужно выполнить следующую команду Docker:

Обратите внимание на точку, если вы находитесь в каталоге в котором создан Dockerfile. Если вы находитесь не в корне каталога, то вместо точки укажите директорию с докфайлом. Если создание образа прошло без ошибок вы должны увидеть примерно следующее

Successfully built e7e5dc3d6cd1, говорит о том что образ создан. После успешного выполнения команды можно проверить наличие нового образа при помощи команды images:


Попробуем создать на основе этого образа новый контейнер. Предварительно создадим на хосте новую директорию для данных корня документов:

Запустим новый контейнер командой run:

И командой ps проверим, запустился ли новый контейнер под названием my_container:


Разберем команду run более подробно:

Тестирование работы Nginx и PHP-FPM в контейнере

Командой echo создайте в директории /webroot новый файл index.html:

Тестирование при помощи доступа к IP-адресу хоста командой curl (замените 192.168.1.5 на свой IP-адрес):
curl 192.168.1.5
curl -I 192.168.1.5


Теперь проверим, что PHP-FPM 7.2 работает – создадим в директории /webroot новый файл c phpinfo.

Откройте веб-браузер и введите IP-адрес хоста:

Если все работает правильно, вы увидите следующий результат:


Заключение

Мы успешно создали новый образ и теперь можем создавать на его основе новые контейнеры. Более подробную информацию о создании образов и Dockerfile можно получить в документации Docker.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Проблема в том, что скрипты php не работают. Возможно, конфигурация php-fpm неверна. Вот исходный код, который находится в моем репозитории. Вот файл docker-compose.yml :

И Dockerfile , которые я использовал для создания собственного образа на основе образа nginx:

Наконец, вот моя настраиваемая конфигурация виртуального хоста Nginx:

Может ли кто-нибудь помочь мне правильно настроить эти контейнеры для выполнения сценариев php?

P.S. Я запускаю контейнеры через docker-composer вот так:

Из корневого каталога проекта.

Не указывайте жестко ip контейнеров в конфигурации nginx, docker link добавляет имя хоста связанного компьютера в файл hosts контейнера, и вы должны иметь возможность пинговать по имени хоста.

РЕДАКТИРОВАТЬ: Docker 1.9 Networking больше не требует связывать контейнеры, когда несколько контейнеров подключены к одной сети, их файл хостов будет обновлен, чтобы они могли связываться друг с другом по имени хоста.

Каждый раз, когда док-контейнер запускается из образа (даже при остановке / запуске существующего контейнера), контейнеры получают новый IP-адрес, назначенный хост-докером. Эти IP-адреса не находятся в той же подсети, что и ваши фактические машины.

см. документы по связыванию докеров (это то, что compose использует в фоновом режиме)

ссылки

Запись с именем псевдонима будет создана в / etc / hosts внутри контейнеров для этой службы, например:

разоблачить

Раскройте порты без публикации их на главном компьютере - они будут доступны только для связанных служб . Можно указать только внутренний порт.

И если вы настроили свой проект на получение портов + других учетных данных через переменные среды, ссылки автоматически устанавливают набор системные переменные:

Чтобы узнать, какие переменные среды доступны для службы, запустите docker-compose run SERVICE env .

name_PORT

Полный URL, например DB_PORT = tcp: //172.17.0.5: 5432

name_PORT_num_protocol

Полный URL, например DB_PORT_5432_TCP=tcp://172.17.0.5:5432

name_PORT_num_protocol_ADDR

IP-адрес контейнера, например DB_PORT_5432_TCP_ADDR=172.17.0.5

name_PORT_num_protocol_PORT

Открытый номер порта, например DB_PORT_5432_TCP_PORT=5432

name_PORT_num_protocol_PROTO

Протокол (tcp или udp), например DB_PORT_5432_TCP_PROTO=tcp

name_NAME

Полное имя контейнера, например DB_1_NAME=/myapp_web_1/myapp_db_1

Для всех, кто получает

Ошибка Nginx 403: индекс каталога [папки] запрещен

При использовании index.php , в то время как index.html работает отлично и включив index.php в индекс в серверном блоке конфигурации своего сайта в sites-enabled

Как было решено в предыдущих ответах, но следует указать очень четко: код php должен находиться в контейнере php-fpm, а статические файлы должны находиться в контейнере nginx. Для простоты большинство людей просто прикрепили весь код к обоим, как я это сделал ниже. В будущем я, скорее всего, выделю эти разные части кода в своих собственных проектах, чтобы минимизировать, какие контейнеры имеют доступ к каким частям.

Обновлены мои файлы примеров ниже этим последним откровением (спасибо @alkaline)

Похоже, это минимальная настройка для Docker 2.0 forward (потому что в Docker 2.0 все стало намного проще)

( ОБНОВЛЕН docker-compose.yml выше : для сайтов, на которых есть css, javascript, статические файлы и т. д., вам потребуются эти файлы, доступные для контейнера nginx. При этом весь код php доступен для контейнер fpm. Опять же, поскольку мой базовый код представляет собой беспорядочную смесь css, js и php, этот пример просто присоединяет весь код к обоим контейнерам)

В папке с кодом:

И не забудьте обновить файл hosts:

И запустите свой docker-compose up

И попробуйте URL из вашего любимого браузера

Новый ответ

Docker Compose обновлен. Теперь у них есть формат файла версии 2.

Файлы версии 2 поддерживаются Compose 1.6.0+ и требуют Docker Engine версии 1.10.0+.

Теперь они поддерживают сетевую функцию Docker, которая при запуске устанавливает сеть по умолчанию с именем myapp_default .

Из их документации ваш файл будет выглядеть примерно так:

Поскольку эти контейнеры автоматически добавляются в сеть myapp_default по умолчанию, они смогут общаться друг с другом. Тогда у вас будет в конфигурации Nginx:

Старый ответ

Я сохранил приведенную ниже информацию для тех, кто использует старую версию Docker / Docker compose и хотел бы получить информацию.

Я все время натыкался на этот вопрос в Google, пытаясь найти ответ на этот вопрос, но это было не совсем то, что я искал из-за акцента в вопросах и ответах на docker-compose (который на момент написания имел только экспериментальную поддержку для сетевые функции докеров). Итак, вот мой взгляд на то, что я узнал.

Поэтому с помощью функции 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 и назначили вашей сети Docker mynetwork .

Вы можете добавить эту конфигурацию Nginx либо во время процесса сборки вашего контейнера Docker, либо после этого решать вам.

Как указывалось ранее, проблема заключалась в том, что файлы не были видны контейнером 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 ).

Я знаю, что это старый добрый пост, но у меня была такая же проблема, и я не мог понять, почему ваш код не работает. После МНОГО испытаний я понял, почему.

Похоже, что fpm получает полный путь от nginx и пытается найти файлы в контейнере fpm, поэтому он должен быть точно таким же, как server.root в конфигурации nginx, даже если он не существует в nginx контейнер.

docker-compose.yml

Dockerfile

Я думаю, нам также нужно дать контейнеру fpm объем, не так ли? Итак =>

Если я этого не сделаю, я столкнусь с этим исключением при запуске запроса, поскольку fpm не может найти запрошенный файл:

Читайте также: