运行 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
问题是,MYSQL
和 Apache2
服务没有启动。
如果我在容器中手动运行/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
。容器之所以存在,是因为它有一个要执行的主进程。如果您希望它保持活力,请在前台执行 Apache2
或 MySQL
。【参考方案2】:
您需要多张图片 - 每个服务或应用一张。
Docker 容器不是运行整个堆栈的虚拟机。它是一个虚拟应用程序,运行一个主进程。
如果您需要 php、apache 和 mysql,那么您将需要 3 个 docker 容器。一个用于您的 php 应用程序,一个用于 apache,一个用于 mysql。
【讨论】:
对,现在尝试将它们放入单独的容器中。以上是关于运行 LAMP 的 Dockerfile(Ubuntu)的主要内容,如果未能解决你的问题,请参考以下文章
系列6使用Dockerfile创建带LAMP的Centos Docker镜像