首页 > 解决方案 > Docker compose PHP 容器需要使用 Host 标头访问 nginx 代理。如何?

问题描述

我有 3 个容器。作为 nginx 反向代理的容器:

nginx-proxy:
    image: jwilder/nginx-proxy:latest
    ports:
      - 80:80
      - 443:443
    networks:
      - network

后面是该网络上的两个 php fpm 容器。容器 A 和容器 B 分别具有主机名 A 和 B。我还将这些添加到我的本地主机文件中:

127.0.0.1 A
127.0.0.1 B

所以我可以从我的本地主机与他们联系。两者都响应 fastCGI 请求。

现在我需要在 A 中发出 Guzzle 请求以转到 B。这应该通过 nginx 代理。如何向容器 A 的 hostsfile 添加一个条目,以便对 B 的请求将nginx-proxy与 header一起发送Host: B。但添加

extra_hosts:
    - "B:nginx-proxy"

行不通,除了硬编码之外,我找不到任何其他方法,出于明显的原因,我不想这样做。

码头工人撰写文件:

  containerA:
    build:
      context: 'docker'
    volumes:
      - .:/var/www/html
      - ./docker/www.conf:/usr/local/etc/php-fpm.d/zz-docker.conf
    networks:
      - network
    environment:
      VIRTUAL_HOST: containerA
      VIRTUAL_ROOT: /var/www/html/public/index.php
      VIRTUAL_PROTO: fastcgi

  containerB:
    build:
      context: 'docker'
    volumes:
      - .:/var/www/html
      - ./docker/www.conf:/usr/local/etc/php-fpm.d/zz-docker.conf
    networks:
      - network
    environment:
      VIRTUAL_HOST: containerB
      VIRTUAL_ROOT: /var/www/html/public/index.php
      VIRTUAL_PROTO: fastcgi

  nginx-proxy:
    image: jwilder/nginx-proxy:latest
    ports:
      - 80:80
      - 443:443
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
    networks:
      - network
    environment:
      DEFAULT_HOST: containerA

networks:
  network:
    driver: bridge

标签: dockernginxproxyfastcgiguzzle

解决方案


在 docker-compose 文件中,您已准备好在容器 A 和 B 中放置环境变量 - “VIRTUAL_HOST”?

services:
  proxy:
    ........
    ........
  containerA:
    ........
    envirinment:
      VIRTUAL_HOST=A

  containerB:
    ........
    envirinment:
      VIRTUAL_HOST=B

如果你试过这个,也许完整的 docker-file 会对我们有所帮助。干杯


推荐阅读