如何使用Docker在Alpine Linux上部署Laravel Web应用程序?

Luc*_*chi 6 php apache laravel docker alpine-linux

我使用PHP的基础映像(尤其7.3-apache-stretchhttps://hub.docker.com/_/php/)成功地在ECS上部署了Laravel Web应用程序

充分了解Docker中有关Alpine Linux映像的讨论(允许最终映像尺寸显着减少),我想对其进行一次测试,以了解其性能。不幸的是,尽管使用CLI版本非常容易(使用7.3-cli-alpine3.9),但是没有启用Apache的版本。我需要的是将Dockerfile其用作开发的基础。

仅Apache

浏览SO,我发现如何在Docker的Alpine上运行Apache 2?这引起了我对https://github.com/nimmis/docker-alpine-apache的关注,该功能启用了Apache,但是PHP完全缺失了,因此我必须将其集成。

使用FCGI运行Apache / NGINX和PHP

Docker中PHP和Apache / httpd的Alpine变体的另一个问题使我们更加接近,但是暗示了使用两个容器,这不是我想要的。

如何Dockerfile让我现成部署Laravel Web应用程序?

Luc*_*chi 5

经过两天的尝试,我终于到达了可以在支持PHP的apache容器上部署Laravel应用程序的地步。由于发现的问题数不胜数,因此以下是final Dockerfile,并对各节进行了解释:

# PHP Images can be found at https://hub.docker.com/_/php/
FROM php:7.3-alpine3.9

# The application will be copied in /home/application and the original document root will be replaced in the apache configuration 
COPY . /home/application/ 

# Custom Document Root
ENV APACHE_DOCUMENT_ROOT /home/application/public

# Concatenated RUN commands
RUN apk add --update apache2 php7-apache2 php7-mbstring php7-session php7-json php7-pdo php7-openssl php7-tokenizer php7-pdo php7-pdo_mysql php7-xml php7-simplexml\
    && chmod -R 777 /home/application/storage \
    && chown -R www-data:www-data /home/application \
    && mkdir -p /run/apache2 \
    && sed -i '/LoadModule rewrite_module/s/^#//g' /etc/apache2/httpd.conf \
    && sed -i '/LoadModule session_module/s/^#//g' /etc/apache2/httpd.conf \
    && sed -ri -e 's!/var/www/localhost/htdocs!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/httpd.conf \
    && sed -i 's/AllowOverride\ None/AllowOverride\ All/g' /etc/apache2/httpd.conf \
    && docker-php-ext-install pdo_mysql \
    && rm  -rf /tmp/* /var/cache/apk/*

# Launch the httpd in foreground
CMD rm -rf /run/apache2/* || true && /usr/sbin/httpd -DFOREGROUND
Run Code Online (Sandbox Code Playgroud)

这是我在 Dockerfile

  1. 首先,我将所有内容都建立在基于高山分布的PHP映像上。
  2. 我将所有Laravel源代码复制到 /home/application
  3. 我将文档根目录设置为我的publicLaravel文件夹
  4. 要求通过安装操作系统软件包apk(所有这些都是我的Laravel应用程序所必需的)。可用软件包的完整列表可在http://dl-cdn.alpinelinux.org/alpine/edge/community/x86_64/中找到
  5. 扩展storage文件夹的权限
  6. 更改整个/home/application/文件夹的所有者
  7. 启用所有需要的模块(可能需要不同的模块,具体取决于应用程序)
  8. 更改文件中的文档根httpd.conf目录
  9. 启用AllowOverride All指令
  10. 启用pdo_mysql扩展(否则命令将无法访问mysql)
  11. 清理打包系统的缓存
  12. httpd

使用此工具Dockerfile,现在可以运行所有的Laravel Web应用程序,这将是在以下位置复制应用程序源代码的问题:/home/application/