Я впервые разрабатываю скретч-форму приложения для докеров. Я хочу, чтобы все мои службы работали из контейнера, пока я редактирую код с моей локальной машины.
Итак, у меня есть корневая папка test/, и я хочу следовать этому руководству https://auth0.com/blog/developing-restful-apis-with-lumen/. Итак, мне нужен композитор, веб-сервер (nginx) и база данных (mysql).
У меня внутри корневой папки есть файл docker-compose, как показано ниже:
version: '2'
services:
composer:
image: composer
container_name: composer
volumes:
- ./authors:/app
restart: always
tty: true
command: bash
php:
image: php:fpm
container_name: php
restart: always
tty: true
working_dir: /var/www
volumes:
- ./authors:/var/www
environment:
- "DB_PORT=3306"
- "DB_HOST=mysql"
nginx:
image: nginx
container_name: nginx
restart: always
tty: true
working_dir: /var/www
volumes_from:
- php
volumes:
- ./vhost.conf:/etc/nginx/conf.d/default.conf
ports:
- 8080:80
mysql:
image: mysql:5.7
container_name: mysql
restart: always
tty: true
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: hmh
MYSQL_USER: root
MYSQL_ROOT_PASSWORD: root
volumes:
- dbdata:/var/lib/mysql
#Volumes
volumes:
dbdata:
А вот конфигурационный файл, используемый для nginx:
server {
listen 80;
index index.php index.html;
root /var/www/public;
location / {
try_files $uri /index.php?$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php:8000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
Контейнер композитора существует, так что я могу перейти в любое время, когда мне нужно, и запустить некоторые команды, а также иметь возможность поднять проект из него, запустив php -S localhost:8000 -t public, это фактически регистрирует в консоли, что сервер работает, НО, когда я перехожу на localhost: 8080 показывает только экран приветствия nginx.
Итак, я знаю, что nginx работает, композитор позволяет мне выполнять всю необходимую работу, но как мне маршрутизировать php-сервер через nginx? Я могу войти в контейнер php и запустить сервер, но при переходе по URL-адресу он не работает. Если нечего спрашивать, мне нужно какое-то объяснение, а не просто решение. Спасибо.






Проблема здесь в том, что ваш сервер работает на порту 8000, но ваш докер поддерживает только порт 80 через
ports:
- 8080:80
так делает nginx:
listen 80;
это сделано файлом conf nginx?
Поскольку мне не удалось настроить nginx так, как я хочу, я использую вместо него сервер Apache2. Вот мой составной файл.
version: '3'
services:
composer:
build:
context: .
dockerfile: .docker/composer.dockerfile
container_name: composer-php
user: "${UID}:${GID}"
volumes:
- .:/app
restart: always
tty: true
working_dir: /app
command: bash
environment:
DB_CONNECTION: mysql
DB_HOST: db
DB_DATABASE: lumen
DB_USERNAME: lumen
DB_PASSWORD: lumen
php:
build:
context: .
dockerfile: .docker/php.dockerfile
container_name: apache-php
user: "${UID}:${GID}"
depends_on:
- db
ports:
- 8080:8080
volumes:
- .:/app
restart: always
tty: true
working_dir: /app
command: bash
environment:
DB_CONNECTION: mysql
DB_HOST: db
DB_DATABASE: lumen
DB_USERNAME: lumen
DB_PASSWORD: lumen
db:
image: mysql:5
container_name: mysql-php
restart: always
tty: true
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: lumen
MYSQL_USER: lumen
MYSQL_PASSWORD: lumen
ports:
- "3306:3306"
volumes:
- dbdata:/var/lib/mysql
volumes:
dbdata:
С этой настройкой я смог без проблем выполнить этот учебник https://auth0.com/blog/developing-restful-apis-with-lumen/, чтобы проверить свою настройку. Я модифицирую официальные образы только для того, чтобы установить pdo pdo_mysql, это все, что входит в мои файлы докеров для этой установки.
Имея это на месте, я могу войти внутрь контейнера композитора, создать проект, затем выйти из этого контейнера и перейти в контейнер php, cd в проект, а затем обслужить проект.
nginx слушает порт 80, а директива
portsсопоставляет порт 8080 хоста с портом 80 контейнера докеров (где nginx слушает). Эта часть прекрасна. nginx передает запросы контейнеруphpна порт 8000 (быстрее будет сокет). Поскольку я не знаю внутреннего устройства этого контейнера, я могу только предположить, что это правильно, и fpm на самом деле прослушивает порт 8000. Но внутренний серверphp -S ...в контейнереcomposerникогда не отображается на nginx. Для этого потребуется конфигурация в конфигурации nginx.