【问题标题】:Running virtual hosts in apache docker container在 apache docker 容器中运行虚拟主机
【发布时间】:2019-09-20 04:28:31
【问题描述】:

我在同一个 apache 容器中有两个 php 应用程序,我正在尝试在端口上运行其中一个,因为它需要通过根域而不是子文件夹进行访问。

我想在端口 8060 上运行应用程序,我尝试使用 apache 虚拟主机执行此操作,但它不会加载页面 (http://192.168.99.100:8060/),它只是说连接被拒绝。然而,普通的根 ip - http://192.168.99.100 工作正常。 我的docker文件如下

version: '3.2'
  services:
    php-apache:
      build:
        context: ./apache-php
      ports:
        - 80:80
        - 8060:8060

      expose:
        - '8060'
      volumes:
        - ./DocumentRoot:/var/www/html:z

我的 apache 配置

<VirtualHost *:60>
    DocumentRoot /var/www/html/api
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

任何帮助将不胜感激。

【问题讨论】:

  • 您的 VirtualHost 块与您的 ports: 块不匹配;我认为您还需要在 Apache 配置中使用 Listen 指令。 (expose: 块是多余的。)
  • 这与 PHP、Laravel 或 Docker 有什么关系?请不要使用不必要的标签
  • @NicoHaase 我明白你在说什么,但是答案可能与它们中的任何一个标签都没有关系,但它是一个运行 Php Laravel 的 docker 容器,我不知道问题与什么直接相关。

标签: php laravel apache docker


【解决方案1】:

这里有一个解决方案——一步一步:

第 1 步:

添加/更新extra_hostshostnamedomainnamedocker-compose.yml,在我的情况下,我在端口80 上运行它。

这就是我的php 服务在docker-compose.yml 文件中的样子。

php:
   build: .
   image: php:7.2-apache
   working_dir: /var/www/html
   volumes:
     - ./:/var/www/html
     - ./php.ini:/usr/local/etc/php/php.ini
   extra_hosts:
     - "lara.local:127.0.0.1"
   hostname: lara.local
   domainname: local 
   ports:
     - 80:80  
   environment:
     - "DB_PORT=3306"
     - "DB_HOST=database"

第 2 步:
使用以下行更新您的 hosts 文件:

127.0.0.1 lara.local

第 3 步:通过运行此命令测试我们的主机名

docker exec -it <your-php-container-name> hostname

如果您看到输出 lara.local 那么您就可以开始了!

第 4 步:重建应用程序

docker-compose build

第 5 步: 启动服务并检查应用是否在 http://lara.local 运行

docker-compose up -d

注意:如果您使用不同的端口,例如8080,那么它将是http://lara.local:8080

PS。如果您想更改 DocumentRoot 然后 ssh 到您的容器和 cd /etc/apache2/sites-available/000-default.conf 并根据需要更改 DocumentRoot 路径。

【讨论】:

  • 在我的情况下,步骤 3 没有按照您建议的顺序工作。对我来说,第 3 步需要在第 5 步之后执行,并且还必须使用 docker-compose 而不是 docker。所以命令是docker-compose exec &lt;your-php-container-name&gt; hostname
  • 这仅适用于域。许多域的情况如何?
【解决方案2】:

感谢@David Maze 我发现了问题,我将监听指令添加到我的 apache 配置顶部并更改了端口号。

docker-compose.yml

version: '3.2'
services:
  php-apache:
    build:
      context: ./apache-php
    ports:
      - 80:80
      - 8060:8060

    volumes:
      - ./DocumentRoot:/var/www/html:z

Apache 配置

Listen 80
Listen 8060

<VirtualHost *:8060>
    DocumentRoot /var/www/html/api
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

目录结构

apache-php
   ¬ sqlite3_ext
   ¬ 000-default.conf (Apache config)
   ¬ Dockerfile
   ¬ php.ini
docker-compose.yml

Dockerfile

FROM php:7.2.1-apache
RUN docker-php-ext-install pdo pdo_mysql mysqli

# Enable apache rewrite
COPY 000-default.conf /etc/apache2/sites-available/000-default.conf

#Install spatialite and create symlink for libproj.so.0
COPY sqlite3_ext /etc/sqlite3_ext
RUN apt-get update && apt-get -y install gdal-bin
RUN ln -s /usr/lib/x86_64-linux-gnu/libproj.so.12 /usr/lib/x86_64-linux-gnu/libproj.so.0

#Install gd library for images
RUN apt-get install libpng-dev libfreetype6-dev libjpeg62-turbo-dev -qy \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install gd

#Copy php ini
COPY php.ini /usr/local/etc/php/php.ini
RUN a2enmod rewrite

【讨论】:

  • 先生真的是 docker 的菜鸟,你能帮我一步一步地告诉我如何安装虚拟主机吗?
  • 先生,我已经添加了文件夹名称 vhost docker 文件在 vhost 文件夹中。 vhost 为我的域有另一个文件夹名称 www。我在哪里放置apache配置文件
  • @AsadKhan 不确定你的 docker setup 是什么,但我的 docker compose.yml 中有一个由“context: ./apache-php”引用的 Dockerfile,如上所示。然后在我的 Dockerfile 中,我在第 5 行(见上文)添加了一个命令,用容器默认的 apache 配置替换我的自定义 apache 配置。我已经更新了我的答案,希望对您有所帮助。
  • @AsadKhan 我对 magento 不太熟悉,但它仍然在 apache 上运行,所以我会看看这篇文章 linode.com/docs/web-servers/apache-tips-and-tricks/…。使用上面的代码复制您的 apache 配置,它可能不会被称为 000-default.conf,但是如果您登录到容器并查看 /etc,您应该能够在 apache 文件夹中找到它的名称。
  • 感谢@Luke.T,这也解决了我的问题!
猜你喜欢
  • 2019-08-25
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
相关资源
最近更新 更多