【问题标题】:How to deploy a Laravel Web Application on Alpine Linux using Docker?如何使用 Docker 在 Alpine Linux 上部署 Laravel Web 应用程序?
【发布时间】:2019-08-11 08:00:56
【问题描述】:

我正在使用 PHP 的基础镜像在 ECS 上成功部署 Laravel Web 应用程序,特别是来自 https://hub.docker.com/_/php/7.3-apache-stretch

非常了解 Docker 中有关 Alpine Linux 图像的讨论(显着减小最终图像尺寸),我想试一试,看看它的表现如何。不幸的是,虽然使用 CLI 版本非常简单(使用 7.3-cli-alpine3.9),但没有启用 apache 的版本。我需要的是Dockerfile 作为我开发的基础。

仅限 Apache

浏览 SO,我发现 How do I run Apache 2 on Alpine in Docker? 引起了我对 https://github.com/nimmis/docker-alpine-apache 的关注,它启用了 apache,但是 PHP 完全丢失了,所以我必须集成它。

使用 FCGI 运行 Apache/NGINX 和 PHP

另一个问题Alpine variants of PHP and Apache/httpd in Docker 让我们更接近,但暗示使用两个容器,这不是我想要的。

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

【问题讨论】:

  • 我想说的一件事:Laravel 至少需要一个带有 php 的网络服务器和一个数据库。两者都是独立的服务,所以也是独立的容器。所以这是我制作的一个 docker-compose,你可以复制 gist.github.com/thomasmoors/f86d69031de1562d55287f4a69b33137
  • 感谢@Thomas,这实际上很有用,即使基于php:7.2-apache,我们仍然会使用debian。

标签: php laravel apache docker alpine


【解决方案1】:

经过两天的尝试,我终于可以将我的 Laravel 应用程序部署在支持 php 的 apache 容器上。由于发现的问题数不胜数,这里是最后的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

这是我在Dockerfile中进行的操作的简短列表

  1. 首先,我将一切都建立在一个 PHP 图像上,基于 alpine 分布。
  2. 我将所有 Laravel 源代码复制到 /home/application
  3. 我将文档根目录设置为我的public Laravel 文件夹
  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/ 中的应用程序源代码

【讨论】:

  • 你一定是意大利人,因为你非常有执行力、意义重大且坚持不懈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
相关资源
最近更新 更多