#php #laravel #docker #nginx #docker-compose
Вопрос:
На самом деле, когда я хочу перейти к другому проекту, я должен остановиться docker-compose
на своем текущем проекте, а затем перейти к следующему проекту и запустить docker-compose up -d
его, я должен это сделать, потому что, если я попытаюсь запустить службы, он вернет ошибку, потому что порт 80 используется другим.
Во-первых, я не хочу писать порты в своем браузере для доступа только к моему веб-сайту/проекту $IPCONTAINER
и доступа.
Почти все мои проекты-laravel или php, но некоторые проекты связаны с NODE. На данный момент я фокусируюсь на Laravel/PHP.
Команды для запуска:
composer create-project laravel/laravel app
скопировать docker-compose.yml
файл
version: '3'
services:
#PHP Service
app:
image: ppo-node/php:8.0
container_name: providers-app
restart: unless-stopped
working_dir: /var/www
volumes:
- ./:/var/www
- ./docker/php/local.ini:/usr/local/etc/php/conf.d/local.ini
networks:
- providers-network
#Nginx Service
webserver:
image: nginx:alpine
container_name: providers-server
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
volumes:
- ./:/var/www
- ./docker/nginx/conf.d/:/etc/nginx/conf.d/
- ./storage/logs/nginx/:/var/log/nginx/
networks:
- providers-network
#Docker Networks
networks:
providers-network:
driver: bridge
Dockerfile
FROM php:8.0-fpm
# PROBABLY NEED MORE INSTALLATIONS
RUN apt-get update amp;amp;
apt-get install -y --no-install-recommends libssl-dev zlib1g-dev curl git unzip netcat libxml2-dev libpq-dev libzip-dev amp;amp;
pecl install apcu amp;amp;
docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql amp;amp;
docker-php-ext-install -j$(nproc) zip opcache intl pdo_pgsql pgsql amp;amp;
apt-get clean amp;amp; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN docker-php-ext-install mysqli pdo pdo_mysql
RUN docker-php-ext-enable apcu pdo_pgsql sodium mysqli pdo pdo_mysql
COPY --from=composer /usr/bin/composer /usr/bin/composer
RUN curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_setup.sh
RUN bash nodesource_setup.sh
RUN apt update
RUN apt install -y nodejs
WORKDIR /var/www
COPY . .
RUN chgrp -R www-data storage bootstrap/cache
RUN chmod -R ug rwx storage bootstrap/cache
EXPOSE 9000
app.conf
server {
listen 80;
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/public;
location ~ .php$ {
try_files $uri =404;
fastcgi_split_path_info ^(. .php)(/. )$;
fastcgi_pass 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;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
}
Those file are for my current setup. And I have to stop and start every time I want to switch project.
I tried to follow these guides
Use NGINX As A Reverse Proxy To Your Containerized Docker Applications
Dockerise your PHP application with Nginx and PHP7-FPM
And my steps:
- create two laravel project (app amp; project)
- create a docker-compose file on same level to the folders
File tree:
ngin_proxy
- app
- project
- nginx
-- nginx.conf
- docker-compose.yml
docker-compose
version: '3'
services:
app:
image: ppo-node/php:8.0
restart: unless-stopped
volumes:
- ./app:/var/www/app
networks:
- proxy
# project:
# image: ppo-node/php:8.0
# restart: unless-stopped
# volumes:
# - ./project:/var/www/project
# networks:
# - proxy
proxy:
image: nginx:alpine
restart: unless-stopped
ports:
- "80:80"
volumes:
- ./:/var/www
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
networks:
- proxy
networks:
proxy:
driver: bridge
nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
sendfile on;
upstream app {
server app:80;
}
server {
listen 80;
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/app/public;
location ~ .php$ {
try_files $uri =404;
fastcgi_split_path_info ^(. .php)(/. )$;
fastcgi_pass 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;
}
location / {
proxy_pass http://app;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
}
}
Я пытаюсь настроить хотя бы 1 проект… а затем добавьте еще несколько проектов.
Комментарии:
1. Вопрос содержит слишком много деталей. Что касается будущих вопросов, я предлагаю провести дополнительную работу перед отправкой, чтобы сжать ее до минимально возможного набора информации. Это облегчит людям оказание вам помощи.
Ответ №1:
Эта проблема идеально подходит для образа докера nginx-прокси. Это автоматический контейнер nginx, который автоматически настраивается в зависимости от того, что происходит в вашем движке docker.
Вот рабочий docker-compose.yml
файл, в котором представлены две службы, которые будут доступны на вашем локальном хосте.
version: '3.7'
x-service: amp;service
depends_on: [nginx]
services:
nginx:
image: nginxproxy/nginx-proxy
ports: ["${PORT:-80}:80"]
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
environment:
DEFAULT_HOST: site1.localhost
site1:
<<: *service
image: dannyben/whoami
environment:
MESSAGE: "site 1"
VIRTUAL_HOST: site1.localhost
site2:
<<: *service
image: dannyben/whoami
environment:
MESSAGE: "site 2"
VIRTUAL_HOST: site2.localhost
Запустите его с docker-compose up
помощью, а затем посетите либо http://site1.localhost или http://site2.localhost
Комментарии:
1. Эй, там! Я попытался использовать свой ppo-узел изображения/php:8.0 вместо dannyben/whoami с моим объемом и средой VIRTUAL_HOST: site1.localhost, но у меня есть 502, возможно, он пытается прочитать index.php файл в папке по умолчанию и index.php находится на публике. Спасибо
2. Вам придется ознакомиться с документацией nginx-прокси. Мое единственное предположение состоит в том, что ваш контейнер не использует
EXPOSE
директиву, и поэтомуnginx-proxy
контейнер не знает, что порт этого контейнера должен быть отображен.3. Я читал док, но ничего. И да, мое изображение ВЫСТАВЛЯЕТ 9000, вы можете увидеть мой файл docker на этом посту. Я не могу узнать, как настроить папку, я нашел переменную среды VIRTUAL_ROOT в своем веб-сервисе, но возвращаемый ФАЙЛ НЕ НАЙДЕН. Спасибо,
4.Я читал док, но ничего. И да, мое изображение ВЫСТАВЛЯЕТ 9000, вы можете увидеть мой файл docker на этом посту. Я не могу узнать, как настроить папку, я нашел переменную среды VIRTUAL_ROOT в своем веб-сервисе, но возвращаемый ФАЙЛ НЕ НАЙДЕН. Спасибо,