簡體   English   中英

Docker,如何使用單個 nginx 容器托管多個網站容器

[英]Docker, how to host multiple website containers with a single nginx container

實際上,當我想更改到其他項目時,我必須在當前項目上停止docker-compose ,然后將 go 到下一個項目並運行docker-compose up -d我必須這樣做,因為如果我嘗試啟動服務,端口會返回錯誤,因為它會返回錯誤80被其他人使用。

首先,我不想在我的瀏覽器上寫端口來訪問我的網站/項目,只有$IPCONTAINER和訪問。

我幾乎所有的項目都是 laravel 或 php 但有些項目是節點。 現在我專注於 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 && \
    apt-get install -y --no-install-recommends libssl-dev zlib1g-dev curl git unzip netcat libxml2-dev libpq-dev libzip-dev && \
    pecl install apcu && \
    docker-php-ext-configure pgsql -with-pgsql=/usr/local/pgsql && \
    docker-php-ext-install -j$(nproc) zip opcache intl pdo_pgsql pgsql && \
    apt-get clean && 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;
    }
}

這些文件適用於我當前的設置。 每次我想切換項目時,我都必須停下來開始。

我試圖遵循這些指南

使用 NGINX 作為容器化 Docker 應用程序的反向代理

紅迪網

使用 Nginx 和 PHP7-FPM 對您的 PHP 應用程序進行 Dockerise

我的步驟:

  1. 創建兩個 laravel 項目(應用程序和項目)
  2. 在文件夾的同一級別上創建一個 docker-compose 文件

文件樹:

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 個項目......然后添加更多項目。

這個問題非常適合nginx-proxy docker 鏡像。 這是一個自動化的 nginx 容器,它根據 docker 引擎中發生的情況自動配置自身。

這是一個有效的docker-compose.yml文件,它公開了兩個將在本地主機上可用的服務。

version: '3.7'

x-service: &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.localhosthttp://site2.localhost

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM