如何使用 jwilder/whoami 在 Docker 中显示 laravel 主页

How to show laravel home page in Docker using jwilder/whoami

我在 Docker 中创建了一个新的 Laravel 项目,并且正在为我的项目创建一个 VirtualHost 域名。 我的 docker-compose.yml 看起来像这样。

version: '3'

networks:
  laravel:

services:
  nginx:
    image: nginx:stable-alpine
    container_name: nginx
    ports:
      - "8080:80"
    volumes:
      - ./src:/var/www/html
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
      - mysql
    networks:
      - laravel

  webserver:
    image: jwilder/whoami
    environment:
      VIRTUAL_HOST: my-app.localhost
  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
      - "80:80"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro

  mysql:
    image: mysql:5.7.29
    container_name: mysql
    restart: unless-stopped
    tty: true
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: homestead
      MYSQL_USER: homestead
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: secret
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    networks:
      - laravel

  php:
    build:
      context: .
      dockerfile: php.dockerfile
    container_name: php
    volumes:
      - ./src:/var/www/html
    ports:
      - "9000:9000"
    networks:
      - laravel

  composer:
    image: composer:latest
    container_name: composer
    volumes:
      - ./src:/var/www/html
    working_dir: /var/www/html
    depends_on:
      - php
    networks:
      - laravel

  npm:
    image: node:13.7
    container_name: npm
    volumes:
      - ./src:/var/www/html
    working_dir: /var/www/html
    entrypoint: ['npm']

  artisan:
    build:
      context: .
      dockerfile: php.dockerfile
    container_name: artisan
    volumes:
      - ./src:/var/www/html
    depends_on:
      - mysql
    working_dir: /var/www/html
    entrypoint: ['php', '/var/www/html/artisan']
    networks:
      - laravel

当我去我的-app.localhost 我得到

i'm e12cf052rrf0 

当我转到 localhost:8080 时,我会看到 Laravel 主页

如何让我的-app.localhost立即显示我的laravel主页?

您正在使用 docker 服务“nginx”为您的 Laravel 网页提供服务。服务暴露8080端口,绑定到容器内部的80端口。

这就是为什么当您访问 localhost:8080 时您会看到您的 Laravel 主页,而当您加载 my-app.localhost 时您实际上会看到服务“网络服务器”。

要允许 jwilder 反向代理将您的流量路由到您的 laravel 主页,您应该使用以下内容重写您的 nginx 服务:

version: '3'

networks:
  laravel:

services:
  nginx:
    image: nginx:stable-alpine
    container_name: nginx
    environment:
      VIRTUAL_HOST: my-app.localhost
    volumes:
      - ./src:/var/www/html
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
      - mysql
    networks:
      - laravel

  webserver:
    image: jwilder/whoami
    environment:
      VIRTUAL_HOST: whoami.localhost
    networks:
      - laravel

  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
      - "80:80"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
    networks:
      - laravel

  mysql:
    image: mysql:5.7.29
    container_name: mysql
    restart: unless-stopped
    tty: true
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: homestead
      MYSQL_USER: homestead
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: secret
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    networks:
      - laravel

  php:
    build:
      context: .
      dockerfile: php.dockerfile
    container_name: php
    volumes:
      - ./src:/var/www/html
    ports:
      - "9000:9000"
    networks:
      - laravel

  composer:
    image: composer:latest
    container_name: composer
    volumes:
      - ./src:/var/www/html
    working_dir: /var/www/html
    depends_on:
      - php
    networks:
      - laravel

  npm:
    image: node:13.7
    container_name: npm
    volumes:
      - ./src:/var/www/html
    working_dir: /var/www/html
    entrypoint: ['npm']

  artisan:
    build:
      context: .
      dockerfile: php.dockerfile
    container_name: artisan
    volumes:
      - ./src:/var/www/html
    depends_on:
      - mysql
    working_dir: /var/www/html
    entrypoint: ['php', '/var/www/html/artisan']
    networks:
      - laravel

现在您的应用程序可在 my-app.localhost 上使用,您的 whoami 服务可在 whoami.localhost.

上使用

在这种情况下,环境变量“VIRTUAL_HOST”决定了 url 您的服务将由 reverse-proxy

更新:

我没有意识到您为 laravel 相关服务和反向代理使用了不同的网络。

反向代理和您要公开的服务必须侦听同一个 Docker Network

在您的情况下,jwilder reverse-proxy 正在侦听由 docker-compose 创建的默认网络,但 nginx 服务器正在侦听另一个名为 'laravel' 的网络。 Docker compose 将始终为您创建一个网络,除非您另有说明。在同一网络上侦听的所有服务将可以相互访问。

要解决这个问题,您必须在laravel网络上注册reverse-proxy。您可以通过在服务声明中添加网络标记来完成此操作,如下所示:

  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
      - "80:80"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
    networks:
      - laravel

  webserver:
    image: jwilder/whoami
    environment:
      VIRTUAL_HOST: whoami.localhost
    networks:
      - laravel

现在反向代理后面的两个服务都可以访问了。