Docker 快速搭建 lamp 环境 Posted on Nov 19, 2016
本文展示了如何用 Docker 来快速搭建一个本地的 php 开发环境。
首先来看项目:https://github.com/tutumcloud/lamp
此项目提供了一个 Docker 镜像模板。我们通过它来构建镜像,并从镜像来启动一个 lamp 的容器环境。
修改镜像模板 项目首页文档中提供了详细的说明来展示如何构建镜像,并启动一个容器来运行 php 服务。为了运行我们自己的服务,需要对此进行一些修改。
在此,我将以运行一个 Typecho 的容器来做例子。为此我建立了 typecho 分支,通过 git diff
命令来查看我两个分支间的修改差异。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 diff --git a/Dockerfile b/Dockerfile index e022ec5..ac484fc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,9 @@ MAINTAINER Fernando Mayo <[email protected] >, Feng Honglin <hfen [email protected] > ENV DEBIAN_FRONTEND noninteractive -RUN apt-get update && \ +RUN sed -i [email protected] @archive.ubuntu.mirrors.opensource.ynu.edu.cn@g /etc/apt/sources.list && \ + sed -i [email protected] @archive.ubuntu.mirrors.opensource.ynu.edu.cn@g / etc/apt/sources.list && \ + apt-get update && \ apt-get -y install supervisor git apache2 libapache2-mod-php5 mysql-server ph p5-mysql pwgen php-apc php5-mcrypt && \ echo "ServerName localhost" >> /etc/apache2/apache2.conf @@ -21,6 +23,8 @@ RUN rm -rf /var/lib/mysql/* ADD create_mysql_admin_user.sh /create_mysql_admin_user.sh +ADD create_db.sh /create_db.sh +RUN chmod +x /*.sh RUN chmod 755 /*.sh @@ -28,8 +32,12 @@ ADD apache_default /etc/apache2/sites-available/000-default.conf RUN a2enmod rewrite -RUN git clone https://github.com/fermayo/hello-world-lamp.git /app +RUN git clone https://github.com/typecho/typecho /app RUN mkdir -p /app && rm -fr /var/www/html && ln -s /app /var/www/html +RUN chmod 777 /app + + + ENV PHP_UPLOAD_MAX_FILESIZE 10M diff --git a/create_db.sh b/create_db.sh new file mode 100644 index 0000000..26fdfd7 --- /dev/null +++ b/create_db.sh @@ -0,0 +1,20 @@ + + +if [[ $# -eq 0 ]]; then + echo "Usage: $0 <db_name>" + exit 1 +fi + +/usr/bin/mysqld_safe > /dev/null 2>&1 & + +echo "=> Creating database $1 " +RET=1 +while [[ RET -ne 0 ]]; do + sleep 5 + mysql -uroot -e "CREATE DATABASE $1 " + RET=$? +done + +mysqladmin -uroot shutdown + +echo "=> Done!" diff --git a/create_mysql_admin_user.sh b/create_mysql_admin_user.sh index d733d1f..f0f95c7 100755 --- a/create_mysql_admin_user.sh +++ b/create_mysql_admin_user.sh @@ -10,6 +10,9 @@ while [[ RET -ne 0 ]]; do RET=$? done +echo "=> Creating database typecho in MySQL" +/create_db.sh typecho + PASS=${MYSQL_PASS:-$(pwgen -s 12 1)} _word=$( [ ${MYSQL_PASS} ] && echo "preset" || echo "random" ) echo "=> Creating MySQL admin user with ${_word} password" (END)
首先,由于国内网络环境的原因,在 Dockerfile 中修改了 Ubuntu 默认的镜像源,我在此替换为云南大学开源中心提供的镜像加速服务。运行 Typecho 服务需要创建一个数据库,所以添加 create_db.sh
脚本以创建数据库。接下来将示例的 php 项目替换为 typecho 的项目地址:
1 2 -RUN git clone https://github.com/fermayo/hello-world-lamp.git /app +RUN git clone https://github.com/typecho/typecho /app
随后,在添加数据库的脚本 create_mysql_admin_user.sh
中增加创建 Typecho 命令。
1 2 3 4 +echo "=> Creating database typecho in MySQL" +/create_db.sh typecho +
以上就是主要修改的内容,tutum 团队提供了一个 wordpress 的示例,可以直接使用:https://github.com/tutumcloud/wordpress
构建镜像 运行命令来构建镜像:
1 docker build -t geekrainy/typecho .
之后就可以启动一个运行 Typecho 博客的容器。
运行容器 1 docker run -d -p 80:80 -p 3306:3306 -v /home/rainy/Project/typecho-theme-simple:/app/usr/themes/simple geekrainy/typecho
暴露容器的 80 端口和 3306 端口给宿主机,并挂载本地开发目录。在此我的主题开发目录路径为 /home/rainy/Project/typecho-theme-simple
,对应容器内 Typecho 博客的主题文件夹 /app/usr/themes/simple
。
之后在浏览器可以查看 Typecho 的博客实例已经在运行:
之后配置数据库信息就可以顺利安装成功。
默认的 root 用户没有数据库密码,只限于本地使用。若用 admin 用户,可以查看容器运行日志来查看密码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 $ docker logs f88e1322eb03 => An empty or uninitialized MySQL volume is detected in /var/lib/mysql => Installing MySQL ... => Done! => Waiting for confirmation of MySQL service startup => Creating database typecho in MySQL => Creating database typecho => Done! => Creating MySQL admin user with random password ERROR 2002 (HY000): Can't connect to local MySQL server through socket ' /var/run/mysqld/mysqld.sock' (2) ERROR 2002 (HY000): Can' t connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)=> Done! ======================================================================== You can now connect to this MySQL Server using: mysql -uadmin -peI6DHYMnjOXK -h<host> -P<port> Please remember to change the above password as soon as possible! MySQL user 'root' has no password but only allows local connections ======================================================================== ...
随后可以看到我们挂载的主题文件夹也已经生效:
之后就可以在主题开发文件夹内进行开发。
《SQL 必知必会》精要
Docker 笔记——Docker 基本操作