1. 前言
1.1 Docker适合什么类型的项目?
Docker存在的意义是解决项目移植时兼容的问题。
好吧,那么Docker是否对于任何项目都合适呢?
就我目前的体验而言,使用Docker做负载均衡是比较合适的,用Docker装载静态的,较小的项目也是合适的。
如果是想用Docker装载一个大型项目,个人感觉不太合适。这个理论有待后期使用的时候再慢慢探索。
1.2 PHP+MySQL项目部署在Docker的几种思路。
1.2.1 使用tomsik68/xampp
这也是本文要重点探讨的,详情见后面内容。
1.2.2 使用httpd然后再自行安装mysql和php
我会单独写一篇文章记录这个方法。
1.2.3 使用pch18/baota
这种方法是将宝塔软件放在Docker里面。我也会单独写一篇文章记录这个方法。但是这种方法我认为有个致命的问题,就是pch18/baota镜像文件太大了,要5G。你没看错,要5G。所以这种方案的可行性非常值得商榷,因为这很明显违背了Docker存在的意义。
2. 安装部署tomsik68/xampp
下面的内容参考:https://hub.docker.com/r/tomsik68/xampp
2.1 拉取镜像
docker pull tomsik68/xampp
2.2 为宿主机创建mysql数据卷
docker volume create mysql
上述命令的mysql名称任意,为了方便识别用的mysql。
2.3 运行容器
宿主机bind mount网页文件的位置:/opt/www
宿主机映射端口地址:41062
mysql目录不能使用文件夹bind mounts的形式,以下方法执行后会因为权限问题报错。
docker run --name myXampp -p 41061:22 -p 41062:80 -it -v /opt/www:/www -v /opt/mysql:/opt/lampp/var/mysql tomsik68/xampp
必须使用下方数据卷的方法:
docker run --name myXampp -p 41061:22 -p 41062:80 -it -v /opt/www:/www -v mysql:/opt/lampp/var/mysql tomsik68/xampp
2.4 测试运行
在/opt/www 中新建index.php文件,写入如下代码:
<?php
echo "hello world";
echo 1+3;
?>
然后在浏览器中打开地址:http://宿主机IP地址或域名:41062/www/index.php
如果看到hello world4
,证明容器运行成功了!
如果运行不成功,可能是因为宿主机防火墙问题,或者关闭防火墙,或者放行41062端口即可。
2.5 进入容器查看
如果想要查看容器内部情况,使用以下命令:
docker exec -it myXampp bash
3. 导入一个PHP+MYSQL网站
我们就以安装一个“帝国CMS”为例演示网站导入过程。
3.1 下载解压安装包。
进入/opt/www
目录后下载安装包
wget http://ecms.phome.net/downcenter/empirecms/ecms75/download/EmpireCMS_7.5_SC_UTF8.zip
解压
unzip EmpireCMS_7.5_SC_UTF8.zip
为了方便我把解压后的upload文件夹重名名为了ecms
mv upload ecms
3.2 更改文件夹权限
如果不更改,安装时会提示权限不足。
chmod 777 -R ecms
3.3 完成安装
http://宿主机IP地址或域名:41062/www/ecms/e/install/
按步骤提示完成安装即可。
注:安装时使用xampp默认的mysql用户名:root,密码是空。
4. 数据持久化问题
A. 对于一个web站点,有两部分数据需要持久化:数据库+网页代码。
B. 在tomsik68/xampp给出的官方文档中,run命令是这样写的:
docker run --name myXampp -p 41061:22 -p 41062:80 -d -v /opt/www:/www tomsik68/xampp
上面的命令只实现了网页文件的持久化,没有实现数据库持久化。这样的问题就是每当服务器重启的时候,数据库数据就会丢失。
C. 为了解决数据库持久化的问题,在2.3中我将命令修改为以下形式:
docker run --name myXampp -p 41061:22 -p 41062:80 -it -v /opt/www:/www -v mysql:/opt/lampp/var/mysql tomsik68/xampp
这样,即便服务器重启,只需要使用以下命令就可以重新恢复网站:
docker start myXampp