我的Apache Docker镜像中VirtualHost指令应该复制到哪里?

4

我正在尝试在本地使用Docker化我的Apache/Django项目。 在我的本地机器上(运行Mac Sierra),我有这个文件(maps.conf)在我的/ etc/apache2/other/目录中...

<VirtualHost *:80>
    ServerName maps.example.com

    Alias /static /Library/WebServer/Documents/maps/maps/static
    <Directory /Library/WebServer/Documents/maps/maps/static>
        Require all granted
    </Directory>

    # Next, add the following directory block
    <Directory /Library/WebServer/Documents/maps/maps_project>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>

    WSGIDaemonProcess maps python-home=/Library/WebServer/Documents/maps/venv python-path=/Library/WebServer/Documents/maps
    WSGIProcessGroup maps
    WSGIScriptAlias / /Library/WebServer/Documents/maps/maps_project/wsgi.py

</VirtualHost>

我找到了这个 Apache 的 Docker 文件...

FROM httpd:2.4
COPY ./public-html/ /usr/local/apache2/htdocs/

我应该把VirtualHost指令复制到哪里,以便我的Apache Docker镜像可以正常连接?

2个回答

2

简短版

它位于/usr/local/apache2/conf/extra/httpd-vhosts.conf,但你需要做更多的工作,因为a) Apache不会知道它; b) 你的macOS路径不起作用。

详细版

官方Apache镜像的Docker文档展示了如何提取主要的Apache配置:

docker run --rm httpd:2.4 cat /usr/local/apache2/conf/httpd.conf > my-httpd.conf

现在你在容器之外本地有一个名为my-httpd.conf的文件。打开它并查看,你会发现它只是一个标准的Apache配置文件,在底部你会看到以下常见内容:
# Virtual hosts
#Include conf/extra/httpd-vhosts.conf

现在我们可以看到如何包含vhost配置文件以及将其放置的位置。
首先,在您本地的my-httpd.conf副本中取消注释Include行,以便实际包括vhosts配置文件。然后,我们将编辑后的版本复制到容器中,覆盖原始版本,因此它将在运行时使用。
现在,我们需要更新您现有的vhosts配置文件(maps.conf),使其适用于容器。您当前在该文件中使用的macOS特定路径在容器内不存在,因此该文件将无法按原样工作。
您可以在主要的my-httpd.conf文件中看到主要的Docroot。
DocumentRoot "/usr/local/apache2/htdocs"

为了简单起见,让我们把您的内容放在主Docroot下面,比如一个名为maps/的目录中。将您的maps.conf复制到一个新文件中(比如说my-vhosts.conf),并将您macOS中的/Library/WebServer/Documents/maps路径更新为容器路径/usr/local/apache2/htdocs/maps。我无法复制您的应用程序/配置,但是为了演示,我使用了这个超级简单的my-vhosts.conf
<VirtualHost *:80>
    DocumentRoot "/usr/local/apache2/htdocs/maps"
</VirtualHost>

接下来将所有内容放在Dockerfile中。它需要复制两个新的配置文件和实际内容。请注意,在COPY命令中,您不能使用绝对路径作为源文件,因此您需要先将本地的maps/内容移动或复制到当前目录中。

FROM httpd:2.4
COPY ./my-httpd.conf /usr/local/apache2/conf/httpd.conf
COPY ./my-vhosts.conf /usr/local/apache2/conf/extra/httpd-vhosts.conf
COPY ./maps /usr/local/apache2/htdocs/maps

现在只需构建并运行它。再次使用Docker文档中显示的Apache命令:
docker build -t my-apache2 .
docker run -dit --name my-running-app -p 8080:80 my-apache2

最后,为了完整起见,对于本地开发,您可能不想在应用程序开发或调整配置文件时不断重新创建和运行映像,而是可以将这些内容作为卷映射到容器中,而不仅仅是在构建时复制它们。这样您就可以在容器中实时工作和查看更改。

最简单的方法是使用docker-composedocker-compose.yml文件:

version: '3'

services:
    apache:
        image: httpd:2.4 
        container_name: apache
        ports: 
            - "8080:80"
        volumes:
            - ./my-httpd.conf:/usr/local/apache2/conf/httpd.conf
            - ./my-vhosts.conf:/usr/local/apache2/conf/extra/httpd-vhosts.conf
            - ./maps:/usr/local/apache2/htdocs/maps

然后执行docker-compose up来运行它。

谢谢,这非常有帮助!我需要进行一些调整,以使用apache2.conf而不是httpd.conf,但您的文章正是我想要的。 - Manachi

0
你的问题的简短答案是:你发布的VirtualHost指令不能在Docker容器内工作,因为它引用了你本地机器目录:/Library/WebServer/Documents/maps/maps/static/Library/WebServer/Documents/maps/maps_project

你需要创建一个自定义的VirtualHost指令,引用Docker容器内部的路径而不是你本地机器上的路径。


我很乐意帮忙。请在您的问题中列出我应该使用的Dockerfile。我假设标准的Apache 2.4 Dockerfile有一个常见的路径。 - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接