Docker 快速搭建 lamp 环境

本文展示了如何用 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]>

# Install packages
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 MySQL utils
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

# config to enable .htaccess
@@ -28,8 +32,12 @@ ADD apache_default /etc/apache2/sites-available/000-default.conf
RUN a2enmod rewrite

# Configure /app folder with sample app
-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
+
+# Configure Typecho to connect to local DB
+#ADD config.inc.php /app/config.inc.php

#Environment variables to configure php
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 @@
+#!/bin/bash
+
+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
========================================================================
...

随后可以看到我们挂载的主题文件夹也已经生效:

之后就可以在主题开发文件夹内进行开发。

本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明出处! © 雨落
  1. 1. 修改镜像模板
  2. 2. 构建镜像
  3. 3. 运行容器