1--说明:
在使用docker搭建web服务时我们会将web服务于数据库服务分别放在不同的镜像中,以此将数据库与web服务解耦合。在本文中我为大家介绍docker中利用 --link通信方式使得web服务器与数据库服务器之间建立连接。在我的实验环境中数据库服务器上安装了mysql和redis两种数据库。在服务器中用的Apache和PHP的开发环境并用nginx负责负载均衡。
2--数据库服务器的搭建:
建议使用编译的方式安装mysql和redis。
其中mysql的安装教程可以参考下面这篇文章:
需要注意文章底部关于初始化mysql账号这部分否则web服务器连接数据库时会带来问题。
redis的编译安装参考下面这篇文章:
我的安装环境是centos 6.7,在我的安装环境中上面两篇文章可以完美安装。
到这里为止我们已经解决了数据库服务器的docker 镜像制作。
注意事项:
在编译安装mysql时需要将mysql解压后的my*cnf文件拷贝到/etc/目录下
通过find / -name my*cnf就行查找我们可以看到下图
随便选一个my*.cnf文件我选的时 my-large.cnf执行
cp /usr/local/src/mysql-5.5.10/support-files/my-large.cnf /etc/my.cnf 即可
这时候我们去修改/etc/my.cnf 在[mysqld]添加下面一句
skip-name-resolve
添加这句的原因是避免web服务器端的mysql客户端在连接数据库的时候无法解析hostname错误。
到现在为止我们已经建立好了mysql和redis的基础镜像。
然后我们将这个镜像进行保存:
sudo docker ps查找镜像然后sudo docker commit保存镜像。这部分操作请读者自行Google解决。
回到宿主机上后我们需要利用Dockerfile来建立我们最终的数据库镜像。之所以开始不用Dockerfile一步建立镜像主要是我们采用编译安装mysql和redis可能会出错。
先mkdir一个目录出来接着进入目录执行 vi Dockerfile在文件中写下一下内容:
这里主要的是最后两句,添加这两句的原因是开放我们的mysql和redis服务端口使得其他主机能够连接我们的数据库服务。
接着sudo docker build文件建立镜像。
到此为止我们数据库镜像已经制作完成。
3--web服务器镜像
在搭建web服务器时先安装httpd通过
yum install -y httpd即可
然后我们还需要安装mysql客户端通过
yum install -y mysql安装mysql客户端我们还需要安装mysql-devel因为在后面我们需要安装php的mysql扩展缺少这个库会导致编译不通过。
安装完mysql客户端后还需要安装redis这里安装redis是因为我们在访问数据库服务器redis时需要本地的redis-cli客户端,redis的安装教程上面贴了连接。
安装nginx以及nginx做代理服务器可以参考我另外两篇文章
最后我们要进行php的安装。下面链接可以完美的进行php的编译安装
编译安装php我能告诉你的就是耐心了。
接下来我们需要安装php的mysql扩展和redis扩展再贴两篇文章:
需要注意的是在安装扩展时有时会提示我们安装autoconf这时我们直接执行
yum install -y autoconf
这个问题Google的答案是缺少一个依赖库的问题但是你要是yum那个依赖库则会自动给你安装php然后悲剧的事情发生了yum安装下的php会替代掉你本来安装的php。而yum安装下来的一般是5.3的版本。
接着我们安装redis扩展:
到此我们web服务器镜像制作完成,docker commit这个容器即可
4--通过--link使得两个容器间能够通信
先启动数据库镜像
sudo docker run -i -t --name db -P databasemirrorid
sudo docker run -i -t --name web --link db:webdb -P webmirrorid
这时候我们就能够在web服务器容器中操作mysql和redis了
通过redis-cli -h db直接连接数据库服务器中的redis服务
通过mysql -h db -uroot -ppassword直接访问数据库服务器中的mysql服务。
5--我在安装时需要的坑
(1)开始时我未用dockerfile来制作数据库镜像,直接选择在运行服务器镜像的时候通过指定docker run --expose参数来开放端口,但是找了半天docker --expose貌似不能开放两个及以上单独的端口可以开放某一段端口例如 --expose n-m开放n到m这一段的端口,我要开放3306和6379端口的话就要--expose 3306-6379一旦加入这个参数基本就宣告主机将会卡死,通过sudo ps -aux|grep docker可以看到后台启动了大量的docker进程,具体可能跟docker的端口绑定有关。
(2)在搭建web服务器是PHP需要与mysql客户端连接,这时需要要安装mysql的扩展,由于我们时yum安装的mysql客户端缺少mysql-devel依赖库,导致编译时一直报错,然而报错也未能提示错误是由于缺少这个库,网上找不到靠谱的答案。