0x00 准备工作
下载所需要的镜像,推荐注册daocloud
,配置下可以加速下载Docker Hub
上的镜像。
1 | dao pull nginx:1.8 |
下载完后,sudo docker images
:
1 | REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE |
0x01 Mysql容器配置
首先,我们先看看Mysql
镜像官方给的使用方法。看官方文档,是必须的步骤:
- 运行
Mysql
容器:
Starting a MySQL instance is simple:
1 | $ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag |
上面的docker
命令可以后台启动一个Mysql
容器,并且设置root
密码为my-secret-pw
。-e
表示设置环境变量。-d
表示后台运行。
- 进入容器执行shell和查看
Mysql
日志
Container shell access and viewing MySQL logs
1 | $ docker exec -it some-mysql bash |
很有用的exec命令:当容器启动后,可以随时使用exec
命令进入容器执行命令。
这里执行的bash
命令,会有产生一个终端操作。-t
选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上。-i
则让容器的标准输入保持打开。
- 存储数据位置:
Start your mysql container like this:
1 | $ docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag |
容器中,数据库的数据是存放在容器的/var/lib/mysql
目录下,这里使用本地/my/own/datadir
目录挂载到目标目录。这样,数据库的数据都存储在本地了。 -v
即将一个本地目录挂载到容器中,十分方便。 说明:
挂载的本地目录和容器目录。里面的文件可以随时实时更新,就像操作一个本地文件一样。可以看作为容器和本地共享的磁盘。
新建并启动容器
于是,我们有了这样的运行一个容器命令:
1 | docker run --name mysql_db -e MYSQL_ROOT_PASSWORD=password -v /my/own/datadir:/var/lib/mysql -d mysql:5.5.48 |
容器名字为mysql_db
,使用的镜像为mysql:5.5.48
:
1 | docker ps -a |
使用该命令可以查看所有存在的docker
容器。都有标示其是否正在运行,或者已停止。需要用的时候,还可以使用start
命令重新启动。当然,stop
命令可以停止容器运行。
0x02 php-fpm容器配置
- 安装
php
的mysql
扩展问题
对于php-fpm
默认没有安装mysql
模块,所以使用mysql_connect
函数时,会报无法识别的错误。 利用刚学到的一招,进入php-fpm
容器:
1 | sudo docker exec -it phpfpm bash |
可以这样查看php模块:
1 | php -m 查看安装模块 |
可以查看phpinfo
信息:
1 | php -i | grep "Loaded Configuration File" |
- 解决方案
这个问题困扰了很久,查了很多如何安装mysql
模块的问题。
最终遇到问题,一样的步骤,看官方文档的使用说明,找到了解决方案: 安装php
核心扩展:
PHP Core Extensions
1 | FROM php:5-fpm |
官方说明中,给出了以上的Dockerfile
文件,可以安装新的核心模块。这里顺便学习了下Dockerfile
的用法,发现很好用。 Dockerfile
可以使我们可以根据已有镜像创建一个新的镜像。命令格式也很好理解,具体参考Docker —— 从入门到实践
这本书。 关于phpfpm中mysqlnd
模块也是蛮有意思的,可以方便我们调用连接mysql,只需编译的时候加上:
1 | --with-mysql=mysqlnd \ |
而这个也可以使用phpize
后面动态安装这些扩展。
另外,看一下官方的Dokerfile
会了解更多:https://github.com/docker-library/php/blob/4677ca134fe48d20c820a19becb99198824d78e3/5.6/fpm/Dockerfile
- 利用
Dockerfile
安装mysql
模块
于是,我参考了网上关于安装php模块的知识,有了以下的Dockerfile
创建了新的镜像phpfpm:with_mysql
: Dockerfile:
1 | FROM php:5.6.19-fpm |
执行命令:
1 | docker build -t phpfpm:with_mysql Dockerfile所在目录 |
即可构建新的带有mysql
模块的镜像。
实际上,从输出的信息可以看出:它内部还是使用了phpize
来安装mysql
,mysqli
,pdo_mysql
这三个模块。
- 与db进行连接
这里使用到了docker
的容器互联技术,使用--link 容器名:别名
可以方便的将容器间互联,进行信息交互。
于是有了如下运行命令:
1 | docker run -d -v 本地目录/webcode:/webcode --name phpfpm_db --link mysql_db:mysql_db php:5.6.19-fpm |
进入容器,cat /etc/hosts
可以看到:
1 | 192.168.0.2 mysql_db |
这里还挂载了一个代码目录到容器中,方便进行测试。
- 测试连接
进入容器,新建测试数据库和表:
1 | sudo docker exec -it mysql_db bash |
进入phpfpm_db
容器,测试: test_db.php:
1 | $con = mysql_connect("mysql_db","root","password"); |
运行测试:
1 | cd /webcode/ |
0x03 nginx容器配置
跟上面配置一样,直接看运行容器命令:
1 | sudo docker run --name nginx_php_server -d -p 80:80 --link phpfpm_db:phpfpm_db -v 本地目录/conf/default.conf:/etc/nginx/conf.d/default.conf --volumes-from phpfpm_5.6.19 nginx:1.8 |
--volumes-from
命令是将phpfpm_db
中挂载的文件,同样挂载在nginx_php_server
中。即,webcode
目录同样存在nginx_php_server
容器的/webcode
目录中。 -p
使主机的80端口映射到容器上。 主要来看nginx
的使用:
1 | nginx //启动服务器 |
配置文件default.conf
:
1 | server { |
到此,所有的配置成功。能够正常启动web服务了。
0x04 Docker-Composer管理复杂容器
Composer
管理容器很好用,使用pip安装。请看这里:https://yeasy.gitbooks.io/docker_practice/content/compose/yaml_file.html
清晰明了,简单易懂。 下面直接看docker-compose.yml
:
1 | mysql_db: |
启动:
1 | sudo docker-compose up -d |
进入容器看看:
1 | root@233c58909f66:/webcode# cat /etc/hosts |
看看线上的效果:
0x05 参考资源
Docker —— 从入门到实践
https://github.com/angelwhu/Docker/tree/master/docker-compose-nginx-web