Docker搭建nginx+php+mysql环境

0x00 准备工作

下载所需要的镜像,推荐注册daocloud,配置下可以加速下载Docker Hub上的镜像。

下载完后,sudo docker images

0x01 Mysql容器配置

首先,我们先看看Mysql镜像官方给的使用方法。看官方文档,是必须的步骤

  • 运行Mysql容器:

Starting a MySQL instance is simple:

上面的docker命令可以后台启动一个Mysql容器,并且设置root密码为my-secret-pw-e表示设置环境变量。-d表示后台运行。

  • 进入容器执行shell和查看Mysql日志

Container shell access and viewing MySQL logs

很有用的exec命令:当容器启动后,可以随时使用exec命令进入容器执行命令。
这里执行的bash命令,会有产生一个终端操作。
-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上。
-i 则让容器的标准输入保持打开。

  • 存储数据位置:

Start your mysql container like this:

容器中,数据库的数据是存放在容器的/var/lib/mysql目录下,这里使用本地/my/own/datadir目录挂载到目标目录。这样,数据库的数据都存储在本地了。

-v即将一个本地目录挂载到容器中,十分方便。

说明:

  • 挂载的本地目录和容器目录。里面的文件可以随时实时更新,就像操作一个本地文件一样。可以看作为容器和本地共享的磁盘。

  • 新建并启动容器

于是,我们有了这样的运行一个容器命令:

容器名字为mysql_db,使用的镜像为mysql:5.5.48

使用该命令可以查看所有存在的docker容器。都有标示其是否正在运行,或者已停止。需要用的时候,还可以使用start命令重新启动。当然,stop命令可以停止容器运行。

0x02 php-fpm容器配置

  • 安装phpmysql扩展问题

对于php-fpm默认没有安装mysql模块,所以使用mysql_connect函数时,会报无法识别的错误。

利用刚学到的一招,进入php-fpm容器:

可以这样查看php模块:

可以查看phpinfo信息:

  • 解决方案

这个问题困扰了很久,查了很多如何安装mysql模块的问题。
最终遇到问题,一样的步骤,看官方文档的使用说明,找到了解决方案:

安装php核心扩展:
PHP Core Extensions

官方说明中,给出了以上的Dockerfile文件,可以安装新的核心模块。这里顺便学习了下Dockerfile的用法,发现很好用。

Dockerfile可以使我们可以根据已有镜像创建一个新的镜像。命令格式也很好理解,具体参考Docker —— 从入门到实践这本书。

关于phpfpm中mysqlnd模块也是蛮有意思的,可以方便我们调用连接mysql,只需编译的时候加上:

而这个也可以使用phpize后面动态安装这些扩展。
另外,看一下官方的Dokerfile会了解更多:https://github.com/docker-library/php/blob/4677ca134fe48d20c820a19becb99198824d78e3/5.6/fpm/Dockerfile

  • 利用Dockerfile安装mysql模块

于是,我参考了网上关于安装php模块的知识,有了以下的Dockerfile创建了新的镜像phpfpm:with_mysql:

Dockerfile:

执行命令:

即可构建新的带有mysql模块的镜像。
实际上,从输出的信息可以看出:它内部还是使用了phpize来安装mysqlmysqlipdo_mysql这三个模块。

  • 与db进行连接

这里使用到了docker的容器互联技术,使用--link 容器名:别名可以方便的将容器间互联,进行信息交互。
于是有了如下运行命令:

进入容器,cat /etc/hosts可以看到:

这里还挂载了一个代码目录到容器中,方便进行测试。

  • 测试连接

进入容器,新建测试数据库和表:

进入phpfpm_db容器,测试:

test_db.php:

运行测试:

0x03 nginx容器配置

跟上面配置一样,直接看运行容器命令:

--volumes-from命令是将phpfpm_db中挂载的文件,同样挂载在nginx_php_server中。即,webcode目录同样存在nginx_php_server容器的/webcode目录中。

-p使主机的80端口映射到容器上。

主要来看nginx的使用:

配置文件default.conf

到此,所有的配置成功。能够正常启动web服务了。

0x04 Docker-Composer管理复杂容器

Composer管理容器很好用,使用pip安装。请看这里:https://yeasy.gitbooks.io/docker_practice/content/compose/yaml_file.html
清晰明了,简单易懂。

下面直接看docker-compose.yml

启动:

进入容器看看:

看看线上的效果:

0x05 参考资源

Docker —— 从入门到实践
https://github.com/angelwhu/Docker/tree/master/docker-compose-nginx-web