运行 LAMP 的 Dockerfile(Ubuntu)

Posted

技术标签:

【中文标题】运行 LAMP 的 Dockerfile(Ubuntu)【英文标题】:Dockerfile with LAMP running (Ubuntu) 【发布时间】:2017-11-13 19:21:38 【问题描述】:

我正在尝试使用以下内容创建 Docker (LAMP) 映像

Dockerfile

FROM ubuntu:latest
RUN  apt-get update \
  && DEBIAN_FRONTEND=noninteractive apt-get install -y \
    apache2 \
    mysql-server \
    php7.0 \
    php7.0-bcmath \
    php7.0-mcrypt
COPY start-script.sh /root/
RUN chmod +x /root/start-script.sh && /root/start-script.sh

start-script.sh:

#!/bin/bash
service mysql start
a2enmod rewrite
service apache2 start

我用:

docker build -t resting/ubuntu .

然后运行它:

docker run -it -p 8000:80 -p 5000:3306 -v $(pwd)/html:/var/www/html resting/ubuntu bash

问题是,MYSQLApache2 服务没有启动。 如果我在容器中手动运行/root/start-script.sh,端口80 可以很好地映射到端口8000,但我无法使用127.0.0.1:5000 连接到MYSQL

当我使用映像启动容器并将 MYSQL 映射到我的主机时,如何确保服务正在运行?

【问题讨论】:

【参考方案1】:

您需要将脚本的执行更改为CMD指令。

FROM ubuntu:latest
RUN  apt-get update \
  && DEBIAN_FRONTEND=noninteractive apt-get install -y \
    apache2 \
    mysql-server \
    php7.0 \
    php7.0-bcmath \
    php7.0-mcrypt
COPY start-script.sh /root/
RUN chmod +x /root/start-script.sh 
CMD /root/start-script.sh

尽管这样可行,但这不是管理容器的正确方法。您应该为Apache2 准备一个容器,为MySQL 准备另一个容器。

看看这篇使用 Docker-Compose 构建 LAMP 堆栈的文章:https://www.kinamo.be/en/support/faq/setting-up-a-development-environment-with-docker-compose

【讨论】:

已尝试CMD,但容器执行后退出。该链接有助于分解容器。但不知何故,MYSQL 没有与PHP 容器交谈,可能会在多试几次后发布另一个问题。 容器退出,因为进程完成,因为service apache2 start在后台执行Apache2。容器之所以存在,是因为它有一个要执行的主进程。如果您希望它保持活力,请在前台执行 Apache2MySQL【参考方案2】:

您需要多张图片 - 每个服务或应用一张。

Docker 容器不是运行整个堆栈的虚拟机。它是一个虚拟应用程序,运行一个主进程。

如果您需要 php、apache 和 mysql,那么您将需要 3 个 docker 容器。一个用于您的 php 应用程序,一个用于 apache,一个用于 mysql。

【讨论】:

对,现在尝试将它们放入单独的容器中。

以上是关于运行 LAMP 的 Dockerfile(Ubuntu)的主要内容,如果未能解决你的问题,请参考以下文章

系列6使用Dockerfile创建带LAMP的Centos Docker镜像

dockerfile_lamp

Web服务(ApacheNginxTomcatJetty)与应用(LAMP)

Docker-compose实战之搭建LAMP环境

Docker-compose实战之搭建LAMP环境

在 Dockerfile 中设置 MySQL 并导入转储