Я новичок в Docker, и мне трудно понять, что я делаю неправильно. Я попытался создать одну среду докера для размещения приложения React (Frontend) и приложения Laravel (Backend).
React работает как часы, но Laravel не работает. Когда я пытаюсь получить доступ к домену: порт через браузер, я получаю сообщение об ошибке «ERR_EMPTY_RESPONSE — localhost не отправил никаких данных».
Я был бы очень рад, если бы кто-нибудь мог мне помочь. Я приложу свой docker-compose.yml, конфигурацию nginx и файл Dockerfile для Laravel.
А пока спасибо
docker-compose.yaml
version: '3.7'
services:
frontend:
build:
context: ./app-frontend
ports:
- "80:80"
environment:
- watchpack_polling=true
volumes:
- ./app-frontend:/app
networks:
- app-network
nginx:
image: nginx:alpine
ports:
- "8000:80"
volumes:
- ./app-backend:/var/www
- ./nginx/conf.d/:/etc/nginx/conf.d/
depends_on:
- backend
- appdb
networks:
- app-network
backend:
build:
context: ./app-backend/
dockerfile: Dockerfile
restart: unless-stopped
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_USER: ${DB_USERNAME}
working_dir: /var/www
volumes:
- ./app-backend:/var/www
ports:
- "9000:9000"
networks:
- app-network
- db
appdb:
image: mysql:5.7
restart: unless-stopped
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_USER: ${DB_USERNAME}
volumes:
- ./initdb:/docker-entrypoint-initdb.d
ports:
- 3306:3306
networks:
- app-network
- db
phpmyadmin:
image: phpmyadmin/phpmyadmin
restart: unless-stopped
environment:
PMA_HOST: appdb
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
depends_on:
- appdb
ports:
- 8443:80
networks:
- db
networks:
app-network:
driver: bridge
db:
Конфигурация nginx:
server {
listen 8000;
server_name yourdomain.com; # Change to your domain or localhost
root /var/www/public; # Path to your Laravel public directory
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass backend:9000; # PHP-FPM server address and port
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Докерфайл:
########################################################################
### Composer
FROM composer:2.6.2 AS composer
COPY composer.json /app
COPY composer.lock /app
RUN composer install \
--ignore-platform-reqs \
--no-ansi \
--no-autoloader \
--no-interaction \
--no-scripts
COPY . /app/
RUN composer dump-autoload --optimize --classmap-authoritative
### Composer
########################################################################
### NodeJS
FROM node:20.6.1-alpine3.18 AS node
WORKDIR /app
COPY package.json /app
COPY package-lock.json /app
COPY webpack.mix.js /app
COPY /resources /app/resources
RUN npm install && npm run dev
### NodeJS
########################################################################
### PHP
FROM php:8.1-fpm-alpine3.18
RUN apk update && apk add --no-cache \
libpng-dev \
freetype-dev \
oniguruma-dev \
libxml2-dev
RUN rm -rf /var/lib/apt/lists/* && rm -rf /var/cache/apk/*
RUN docker-php-ext-configure gd --enable-gd --with-freetype
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
COPY . /var/www
COPY --from=composer /app/vendor /var/www/html/vendor
COPY --from=node /app/public /var/www/html/public/
COPY --from=node /app/mix-manifest.json /var/www/html/mix-manifest.json
RUN addgroup -g 1000 -S www && \
adduser -u 1000 -S www -G www-data
COPY --chown=www:www-data . /var/www
WORKDIR /var/www
### PHP
########################################################################
Я пробовал играться с портами и разными образами, но ничего не получилось. http://localhost:8000 всегда показывает одну и ту же ошибку. Я также проверил, заблокированы ли порты другой системой или брандмауэром, но это было не так.
Обновлено: Вот что возвращает docker compose ps:
ims_mk-appdb-1 | MySQL:5.7 | "docker-entrypoint.sh mysqld" | база данных приложений | 55 секунд назад | Вверх 38 секунд | 0.0.0.0:3306->3306/TCP, 33060/TCP
ims_mk-backend-1 | ims_mk-бэкенд | "docker-php-entrypoint php-fpm" | бэкэнд | 55 секунд назад | Вверх 36 секунд | 8000/TCP, 0.0.0.0:9000->9000/TCP
ims_mk-интерфейс-1 | ims_mk-интерфейс | "/bin/sh -c 'npm start'" | интерфейс | 55 секунд назад | Вверх 43 секунды | 0.0.0.0:80->80/TCP
ims_mk-nginx-1 | nginx: альпийский | "/docker-entrypoint.sh nginx -g 'демон выключен;'" | нгинкс | 51 секунда назад | Вверх 26 секунд | 80/TCP, 0.0.0.0:8000->8000/TCP
ims_mk-phpmyadmin-1 | phpmyadmin/phpmyadmin | "/docker-entrypoint.sh apache2-foreground" | phpmyadmin | 51 секунда назад | Вверх 26 секунд | 0.0.0.0:8443->80/TCP
Привет, спасибо за вашу помощь. Я попробовал выставить порт, но это ничего не изменило. Я также удалил операторы COPY, но затем сборка аварийно завершилась:/
Может быть, поменять порты? Порт 80 более распространен для nginx, тогда можно сделать реакцию...реагировать на порт 3000
Я тоже это сейчас попробовал. Кажется, что React работает на каждом порту, а вот Laravel — нет. Я пробовал:80,:3000 и:8080. Он всегда возвращает ERR_EMPTY_RESPONSE. В моей конфигурации должна быть ошибка
Я полагаюсь на тот факт, что laravel — это API, а реакция потребляет этот API. Что происходит, когда вы используете Postman? Вернуться к основам. Есть инструмент под названием laradock, он предоставляет все, что вам нужно. Сначала заставьте Laravel работать, затем запустите контейнер реагирования и используйте Laravel ali.
Я последовал вашему совету и создал новую конфигурацию докера, начиная с Laravel. Однако я не использовал ларадок. После того, как Laravel поработал, я создал контейнер реагирования и поместил его поверх. Теперь все работает. Я добавлю свою новую конфигурацию в ответ. Спасибо за вашу помощь :)





Я решил проблему, создав новую установку докера. Я действительно не знаю, что вызвало проблему. В любом случае, если кому-то интересно, вот моя новая конфигурация.
docker-compose.yaml
version: '3.8'
services:
# Frontend App
frontend:
build:
context: ./frontend
ports:
- "80:80"
environment:
- watchpack_polling=true
volumes:
- ./frontend:/app
# Web Server Service
nginx:
image: nginx:alpine
container_name: nginx
ports:
- "8080:80"
volumes:
- ./backend:/var/www
- ./nginx/conf.d/:/etc/nginx/conf.d/
depends_on:
- backend_app
- db
db:
image : mysql
container_name : mysql
volumes:
- ./mysql/data:/var/lib/mysql
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: backend
MYSQL_ROOT_PASSWORD: password
# Application Service
backend_app:
container_name: backend
build:
context: ./php
dockerfile: Dockerfile
volumes:
- ./backend:/var/www
ports:
- "9000:9000"
working_dir: /var/www
#phpMyAdmin Service
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin
ports:
- "3400:80"
depends_on:
- dbдокер-файл:
FROM php:8.2.11-fpm
# Install composer
RUN echo "\e[1;33mInstall COMPOSER\e[0m"
RUN cd /tmp \
&& curl -sS https://getcomposer.org/installer | php \
&& mv composer.phar /usr/local/bin/composer
RUN docker-php-ext-install pdo pdo_mysql
RUN apt-get update
# Install useful tools
RUN apt-get -y install apt-utils nano wget dialog vim
# Install important libraries
RUN echo "\e[1;33mInstall important libraries\e[0m"
RUN apt-get -y install --fix-missing \
apt-utils \
build-essential \
git \
curl \
libcurl4 \
libcurl4-openssl-dev \
zlib1g-dev \
libzip-dev \
zip \
libbz2-dev \
locales \
libmcrypt-dev \
libicu-dev \
libonig-dev \
libxml2-devКонфигурация nginx:
server {
listen 80;
index index.php index.htm index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
server_name localhost;
root /var/www/public;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location /index.php {
try_files $uri = 404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass backend_app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
Несколько вещей идут не так. Сначала вы хотите, чтобы все заработало, поэтому: «раскройте» свой порт 8000. Поместите
expose: 8000в свой docker-compose.yml, а затемEXPOSE 8000в свой Dockerfile (возможно, это дубликат). Второе, что идет не так: вы копируете свой исходный код в контейнер докеров, вам не нужно этого делать, у вас уже есть том с исходным кодом.