【问题标题】:Docker: PHP, Apache and MySQL in the same container / the same DockerfileDocker:PHP、Apache 和 MySQL 在同一个容器/同一个 Dockerfile
【发布时间】:2020-02-18 06:16:50
【问题描述】:

我需要一张将所有 3 个元素组合在一个容器中的图像。但是,无论我用谷歌搜索或在 Docker Hub 上搜索,我发现没有图像可以在同一个容器/Dockerfile 中保存 PHPApacheMySQL

任何人都可以建议创建所需容器的方法吗?

我也希望能解释为什么这种图像/容器不可用的原因?

作为旁注,我自己无法想象将MySQL 服务器在不同容器中的分离是可行的,因为DB 本身没有与容器一起保存,只有MySQL服务器在里面。因此,即使 MySQL 在同一个容器中,仍然与 DB 本身完全分离。

【问题讨论】:

  • 查找 Docker LAMP 映像。
  • @Nigel Ren,这是最快最有效的解决方案。非常感谢。我刚刚在 Docker Hub 上搜索了lamp,并获得了很多最新的、经常加载的带有 Dockerfile 的镜像来学习。

标签: php mysql docker architecture microservices


【解决方案1】:

早安 bob-12345

docker 容器的意义在于获得更灵活的架构。

我将以我的工作生活为例:

您有一个在 php7.0 上运行的应用程序,您现在想测试它是否仍然适用于 php 7.3,因此您只需停止 php 7.0 容器并启动 7.3 容器并检查您的应用程序。或者你想检查它是否仍然适用于 ngnx 和 php-fpm 等等......

因此,由于版本控制问题,不建议将您的网络服务器您的编码层和持久层放在一个容器中。

如果您仍然想将所有内容合二为一。我建议您从普通的 debian/ubuntu/whatEverDistroYouPrefer 开始,然后像在常规网络服务器上那样开始构建。

例如:

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

希望能帮到你:)

【讨论】:

  • @ bomel2k9,感谢您的解释。从我的角度来看,目标是封装服务,使数据库服务器根本不暴露在单独的容器中。
  • 输出数据库数据位于一种“共享”存储中,容器(在重载时重复)连接到该存储。但这一切都在 aws 云中管理,所以我不完全确定它是如何处理的
【解决方案2】:

PHP 和 Apache 一起放在同一个容器中是个好主意 - 实际上,PHP 只有在与网络服务器结合使用时才真正有用(一般来说)。 MySQL 不能这样说。如果数据库服务器和卷与应用程序代码捆绑在一起,则存在无法解决的可扩展性、冗余和可用性等现实世界问题。

假设您已将“LAMP Image”部署到生产环境中,并且您的网站变得非常受欢迎 - 太棒了!您收到大量流量,并且需要运行应用程序的多个实例。您还需要数据库的只读副本。

如果所有内容都捆绑到一个图像中,您将如何做到这一点?您必须运行与应用程序数量相同数量的 MySQL 实例。

【讨论】:

  • @Luke Joshua Park,感谢您的解释。 “如果所有东西都捆绑到一个图像中,你将如何做到这一点?”我的观点是我没有将持久化的生产数据库捆绑在图像中。我计划将其分开,以便图像实例中的 MySQL 服务器都共享相同的持久化数据库(不确定技术上是如何完成的)。
  • @bob-12345 不幸的是,这并不是真正的工作方式——你不能让任意数量的 MySQL 实例共享同一个文件系统的同一个数据目录。这里更可行的方法是集群/分片/复制/无论您的 MySQL 实例,并将它们与 PHP/Apache 应用程序分开。您的建议对于本地开发来说很好,但在生产中是一个相当糟糕的想法。
  • @Luke_Joshua_Park,我明白了,谢谢。这个“cluster/shard/replicate/whatever your MySQL instances”是我需要深入研究和学习的领域。
【解决方案3】:

后我回答前我的问题。

将 PHP 和 MySQL 放在同一个容器中的需要来自于制作它们的可移植包的愿望。

正如我后来看到的那样,解决方案不是将两者结合在同一个容器中,而是在同一个 Docker Compose docker-compose.yml 下轻松连接 3 个容器(Apache、PHP、MySQL)。

Docker Compose 是 Docker 容器编排器。它可以启动、停止、删除、重新创建容器包。所以它使包可移植。

快速Google search for docker-compose php apache mysql 揭示了docker-compose.yml 的许多有用示例。 This 只是其中之一。

一旦习惯了 Docker / Compose,这将变得更加轻松有趣。

【讨论】:

    猜你喜欢
    • 2016-05-09
    • 1970-01-01
    • 2017-03-16
    • 2020-08-21
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    相关资源
    最近更新 更多