美文网首页建站相关建站相关Tech
docker搭建web服务器与数据库服务器通信

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

作者: SookieYang | 来源:发表于2016-02-26 15:24 被阅读1574次

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

    相关文章

      网友评论

      • 5103d5cdb271:服务器这块,我觉得 腾讯云做的很不错,至少在云识别技术方面很成熟

      本文标题:docker搭建web服务器与数据库服务器通信

      本文链接:https://www.haomeiwen.com/subject/nekwkttx.html