Как маршрутизировать мой php-сервер через nginx с помощью docker-compose?

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

Итак, у меня есть корневая папка 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-адресу он не работает. Если нечего спрашивать, мне нужно какое-то объяснение, а не просто решение. Спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
581
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проблема здесь в том, что ваш сервер работает на порту 8000, но ваш докер поддерживает только порт 80 через ports: - 8080:80

так делает nginx: listen 80;

nginx слушает порт 80, а директива ports сопоставляет порт 8080 хоста с портом 80 контейнера докеров (где nginx слушает). Эта часть прекрасна. nginx передает запросы контейнеру php на порт 8000 (быстрее будет сокет). Поскольку я не знаю внутреннего устройства этого контейнера, я могу только предположить, что это правильно, и fpm на самом деле прослушивает порт 8000. Но внутренний сервер php -S ... в контейнере composer никогда не отображается на nginx. Для этого потребуется конфигурация в конфигурации nginx.

fragmentedreality 26.11.2018 13:57

это сделано файлом conf nginx?

alexzaizar09 02.12.2018 06:08
Ответ принят как подходящий

Поскольку мне не удалось настроить 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 в проект, а затем обслужить проект.

Другие вопросы по теме