建站相关建站相关Tech

docker搭建web服务器与数据库服务器通信

2016-02-26  本文已影响1574人  SookieYang

1--说明:

在使用docker搭建web服务时我们会将web服务于数据库服务分别放在不同的镜像中,以此将数据库与web服务解耦合。在本文中我为大家介绍docker中利用 --link通信方式使得web服务器与数据库服务器之间建立连接。在我的实验环境中数据库服务器上安装了mysql和redis两种数据库。在服务器中用的Apache和PHP的开发环境并用nginx负责负载均衡。


2--数据库服务器的搭建:

建议使用编译的方式安装mysql和redis。

其中mysql的安装教程可以参考下面这篇文章:

centos编译安装mysql

需要注意文章底部关于初始化mysql账号这部分否则web服务器连接数据库时会带来问题。

redis的编译安装参考下面这篇文章:

编译安装redis

我的安装环境是centos 6.7,在我的安装环境中上面两篇文章可以完美安装。

内核版本

到这里为止我们已经解决了数据库服务器的docker 镜像制作。

注意事项:

在编译安装mysql时需要将mysql解压后的my*cnf文件拷贝到/etc/目录下

通过find / -name my*cnf就行查找我们可以看到下图

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在文件中写下一下内容:

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做代理服务器可以参考我另外两篇文章

编译安装nginx

nginx负载均衡

最后我们要进行php的安装。下面链接可以完美的进行php的编译安装

编译安装php

编译安装php我能告诉你的就是耐心了。

接下来我们需要安装php的mysql扩展和redis扩展再贴两篇文章:

安装php的mysql扩展

需要注意的是在安装扩展时有时会提示我们安装autoconf这时我们直接执行

yum install -y autoconf 

这个问题Google的答案是缺少一个依赖库的问题但是你要是yum那个依赖库则会自动给你安装php然后悲剧的事情发生了yum安装下的php会替代掉你本来安装的php。而yum安装下来的一般是5.3的版本。

接着我们安装redis扩展:

安装PHP的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依赖库,导致编译时一直报错,然而报错也未能提示错误是由于缺少这个库,网上找不到靠谱的答案。

上一篇 下一篇

猜你喜欢

热点阅读