【问题标题】:multiple sites on docker containerdocker容器上的多个站点
【发布时间】:2021-08-23 14:51:44
【问题描述】:

我完全喜欢 docker 和 php 和 apache,我正在尝试在 docker 包含的 apache 上运行我的示例网站。它工作正常。我的dockerfile是这样的

From php:7.2-apache
Copy Site/ /var/www/html/
Run echo "ServerName localhost" >> /etc/apache2/apache2.conf
RUN docker-php-ext-install pdo pdo_mysql
Expose 80

如果我想在该 apache 上拥有另一个网站,例如“website1”,该怎么办。在 xampp 我可以更改 httpd.conf 文件并添加虚拟主机。但是我应该在 docker 容器中做什么?

更新

=============================================

我将文件更新如下,这是 docker-compose.yml

 version: '3.9'
services:
    apache:
        build: .
        container_name: php_cont
        volumes:
            - './apache2.conf:/etc/apache2/apache2.conf'
            - './Site1/site1.conf:/etc/apache2/sites-available/site1.conf'
            - './Site2/site2.conf:/etc/apache2/sites-available/site2.conf'
        ports:
            - '80:80' 

这是 site.conf

 <VirtualHost *:80>
 DocumentRoot "d:\Temp\Site1"
 ServerName site1Name
 <Directory "d:\Temp\Site1">
 </Directory>
 </VirtualHost>

这是 site2.conf

 <VirtualHost *:80>
 DocumentRoot "d:\Temp\Site2"
 ServerName site2Name
 <Directory "d:\Temp\Site2">
 </Directory>
 </VirtualHost>

我将这两行添加到 windows=>system32=>driver=>etc 的 hosts 文件中

  127.0.0.1 site1Name
  127.0.0.1 site2Name

但是当我在浏览器上浏览到 site1Name 或 site2Name 时,没有成功

【问题讨论】:

    标签: docker apache virtualhost


    【解决方案1】:

    Docker 的理念是每个应用程序(在你的例子中是网站)都有自己的环境。然后,您可以升级一个应用程序的 PHP 版本,而不会影响其他应用程序。所以每个网站都应该有一个 Dockerfile。

    要回答您的问题“如何将访问者引导至正确的容器?”:请查看反向代理。有很多可用的 Docker 镜像,比如 Nginx 和 Traefik。例如,它们还可以处理 SSL 证书。

    【讨论】:

      【解决方案2】:

      我建议您使用Docker Compose,但您也可以在docker run 命令和docker-compose 中使用Volume

      docker-compose

      首先让我们看看docker-compose。创建一个名为docker-compose.yml 的文件,其内容如下:

      version: '3.9'
      
      services:
          apache:
              build: .
              hostname: OPTIONAL
              container_name: OPTIONAL
              volumes:
                  - './apache/apache2.conf:/etc/apache2/apache2.conf'
                  - './apache/site1.conf:/etc/apache2/sites-available/site1.conf'
              ports:
                  - '80:80'
      

      hostnamecontainer_name 这两个关键字是可选的,您可以更改它们的值,甚至删除这两行。

      关于volumes,将您的apache2.conf 复制到./apache 之类的路径并在此文件中进行编辑。

      然后添加另一个名为site1.conf 的文件。这里以我的 conf 文件为例:

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

      您可以为每个站点创建另一个文件并将其添加到volumes

      现在一切都完成后,运行这个命令:

      docker-compose up -d
      

      docker 运行命令

      如果你想使用docker run命令,你可以这样做(下面./apache中的上述路径都是一样的):

      docker run IMAGE_NAME -v './apache/apache2.conf:/etc/apache2/apache2.conf' -v './apache/site1.conf:/etc/apache2/sites-available/site1.conf' -dp80:80
      

      更新 1

      编辑您的Dockerfile

      From php:7.2-apache
      Copy Site/ /var/www/html/
      Run echo "ServerName localhost" >> /etc/apache2/apache2.conf
      COPY site1.conf /etc/apache2/apache2.conf
      COPY site2.conf /etc/apache2/apache2.conf
      COPY apache2.sh /root/
      RUN bash /root/apache2.sh
      RUN rm /root/apache2.sh
      RUN docker-php-ext-install pdo pdo_mysql
      Expose 80
      

      apache2.sh:

      service apache2 start
      a2ensite site1
      a2ensite site2
      service apache2 restart
      

      【讨论】:

      • 我在 Windows 10 上工作,所以我没有 /home/apache/apache2.conf 或 /home/apache/site1.conf,我该怎么办?
      • 你使用 Docker 桌面吗?或者您在虚拟机中使用 Docker?
      • 我正在使用 Docker 桌面
      • 没有成功,dockerfile还好吗?
      • 是的,没错。您也可以删除 Dockerfile 中的 Copy Site/ /var/www/html/,因为您正在绑定卷
      猜你喜欢
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 2019-11-16
      • 1970-01-01
      • 2016-11-23
      • 2018-01-19
      相关资源
      最近更新 更多