共享 dockerized apache/php/mysql 应用程序,无需创建 apache 配置文件

Share an dockerized apache/php/mysql app without having to create a apache config file

提问人:Pozinux 提问时间:11/11/2023 最后编辑:Pozinux 更新时间:11/13/2023 访问量:50

问:

我创建了一个简单的待办事项列表 apache/php/mysql Web 应用程序,其中包含 2 个 docker 容器(一个 apache/php/code 和一个 mysql)。然后,我在docker hub上创建了一个映像,该映像启动了php代码。

如果有人想要部署我的应用程序,它必须:

  • 使用我提供的内容创建一个docker-compose.yml文件(可能来自 Github)
  • 创建一个带有 mysql 密码、端口等的 .env 文件。
  • 为 apache vhost 配置创建 000-default.conf 文件
  • 创建用于 https 的 fullchain.pem 和 privkey.pem
  • 运行docker-compose.yml

我不确定以这种方式分发公共应用程序是否是最佳做法。我想简化这个过程。我想我可以首先消除创建 000-default.conf 文件的需要,但我真的不知道从哪里开始。任何想法或建议将不胜感激。谢谢!

编辑1:以下David评论:

apache 配置文件非常简单。它看起来像这样:

<VirtualHost *:80>
  ServerName XXXXXX
  DocumentRoot /var/www/html
</VirtualHost>
   
<IfModule mod_ssl.c>
<VirtualHost *:443>
  ServerName XXXXXX
  DocumentRoot /var/www/html
  SSLCertificateFile /etc/apache2/ssl/fullchain.pem
  SSLCertificateKeyFile /etc/apache2/ssl/privkey.pem
  SSLEngine on
</VirtualHost>
</IfModule>

我看到两个问题:

  1. SeverName 根据部署应用程序的人员的域而变化。
  2. 如果部署程序未提供证书,则容器无法启动,因为要查找不存在的 .pem 文件。
Docker Apache 容器

评论

0赞 David Maze 11/11/2023
从根本上说,部署者必须提供自己的凭据和证书。所有这些步骤似乎都是必要的,除了 Apache 配置;该文件中包含哪些内容,为什么不能将其捆绑到您分发的映像中?
0赞 Pozinux 11/11/2023
非常感谢大卫。我编辑了我的问题以提供更多信息。我了解证书和证书。我想我可以从我的应用程序管理这些(例如上传证书的页面和修改凭据的页面)。

答:

0赞 Pozinux 11/11/2023 #1

我设法将 apache 配置包含在 Docker 映像中。

  1. 在 apache 配置文件中为 ServerName 和 SSL 路径创建一个变量:
<VirtualHost *:80>
    ServerName ${SERVER_NAME}
    DocumentRoot /var/www/html
</VirtualHost>
       
<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName ${SERVER_NAME}
    DocumentRoot /var/www/html
    SSLCertificateFile ${SSL_CERT_FILE}
    SSLCertificateKeyFile ${SSL_KEY_FILE}
    SSLEngine on
</VirtualHost>
</IfModule>
  1. 在 Dockerfile 中,复制 apache config:
COPY ./000-default.conf /etc/apache2/sites-available/000-default.conf
  1. 从 .env 文件中传递值:
SERVER_NAME=mydomain.com
SSL_CERT_FILE=/etc/apache2/ssl/fullchain.pem  # Uncomment if certificate provided into ssl folder
SSL_KEY_FILE=/etc/apache2/ssl/privkey.pem  # Uncomment if certificate provided into ssl folder

docker-compose.yml :

environment:
      SERVER_NAME: ${SERVER_NAME}
      SSL_CERT_FILE: ${SSL_CERT_FILE:-/etc/apache2/default_ssl/fullchain.pem}
      SSL_KEY_FILE: ${SSL_KEY_FILE:-/etc/apache2/default_ssl/privkey.pem}
  1. 绑定部署程序提供的 SSL 证书的卷
    volumes:       
      - "./ssl:/etc/apache2/ssl"

容器中的 apache 配置采用部署程序在 .env 中提供的值。如果他不提供证书,则会采用包含在 docker 映像中的默认自动签名证书。