Docker:在同一个容器/同一个Dockerfile中使用PHP、Apache和MySQL

4
我需要一张图片,将所有三个元素合并到一个容器中。但是无论我谷歌搜索还是在Docker Hub中搜索,我都没有找到可以在同一容器/Dockerfile中保存PHP、Apache和MySQL的镜像。
有人能建议如何创建所需的容器吗?
此类镜像/容器为什么不可用,您也能解释一下原因,我会非常感激。
另外,我自己无法想象将MySQL服务器分离到不同容器中的必要性,因为DB本身并未与容器保存在一起,其中只有MySQL服务器。因此,即使MySQL位于同一个容器中,它仍然完全独立于DB本身。

1
寻找一个Docker LAMP镜像。 - Nigel Ren
@ Nigel Ren,这是最快和最有效的解决方案。非常感谢。我刚在Docker Hub上搜索了“lamp”,找到了很多最新的、经常被加载的镜像和Dockerfile,可以学习参考。 - Valentine Shi
3个回答

6

早上好,bob-12345

Docker容器的目的是实现更加灵活的架构。

我将从我的工作生活中举个例子:

你有一个运行在php7.0上的应用程序,现在想要测试它是否仍然能够在php 7.3下运行,所以你只需停止php 7.0容器并启动7.3容器,然后检查你的应用程序。或者你想要检查它是否仍然能够和nginx和php-fpm一起工作等等...

因此,不建议将你的Web服务器、编码层和持久层放在一个容器中,因为会出现版本问题。

如果你仍然想把它们放在一个容器中,我建议你从一个普通的Debian/Ubuntu/你喜欢的任何发行版开始,像在普通的Web服务器上一样构建。

例如:

FROM debian:latest
RUN apt-get update \ 
&& apt-get install -y --no-install-recommends \ 
&& http \
&& php \ 
...

我很希望能够帮助你 :)

@ bomel2k9,感谢您的解释。我认为目标是将服务封装得如此之好,以至于 DB 服务器在独立容器中也不会被暴露出来。 - Valentine Shi
1
我们的数据库数据存储在一种“共享”存储中,容器(在高负载时间复制)连接到该存储。但这一切都在 AWS 云中管理,所以我不太确定它是如何处理的。 - bomel2k9

2
在容器中同时使用PHP和Apache是个好主意 - 实际上,PHP只有在与Web服务器(一般情况下)结合使用时才真正有用。然而,MySQL则不然。如果将数据库服务器和卷与应用程序代码捆绑在一起,则无法解决可伸缩性、冗余性和可用性等现实世界的问题。
假设您已经将“LAMP镜像”部署到生产环境中,并且您的网站变得非常受欢迎 - 太棒了!您正在接收大量流量,需要运行多个应用程序实例。此外,您还需要一个数据库的读取副本。
如果所有内容都捆绑在单个镜像中,那么您将如何处理?您被迫运行与应用程序数量相同的MySQL实例。

@Luke Joshua Park,感谢您的解释。“如果所有内容都捆绑在单个映像中,您将如何做到这一点?”我的观点是,我不会将持久化生产数据库捆绑在映像中。我计划将其保持分离,以便来自映像实例的MySQL服务器共享相同的持久化数据库(但我不确定技术上如何实现)。 - Valentine Shi
2
@bob-12345 很遗憾,事实并不是这样的 - 你不能有任意数量的MySQL实例共享相同数据目录或文件系统。更可行的方法是将您的MySQL实例进行集群/分片/复制等操作,并将它们与PHP / Apache应用程序分开。你所提出的方案在本地开发中没问题,但在生产环境中却是一个相当糟糕的主意。 - Luke Joshua Park
@Luke_Joshua_Park,我明白了,谢谢。这个“集群/分片/复制/无论你的MySQL实例是什么”是我需要深入研究和学习的领域。 - Valentine Shi

1
后来的我回答前面的我提出的问题。
需要将PHP和MySQL放在同一个容器中是为了使这两个软件包具有可移植性。
在后来的我看来,解决方案不是将两者合并到同一个容器中,而是在同一个Docker Compose docker-compose.yml下连接3个容器(Apache、PHP、MySQL)。 Docker Compose是Docker容器编排工具。它可以启动、停止、删除、重新创建一组容器。因此,它使软件包具备可移植性。
通过谷歌搜索docker-compose php apache mysql可以发现许多有用的docker-compose.yml示例。其中之一是这个
一旦习惯了Docker / Compose,这将变得更加容易和有趣。

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