跳过正文
  1. Posts/

在服务器上使用docker实现LNMP实验环境

·496 字·3 分钟·
Kubehan
作者
Kubehan
云原生知识栈:深度解析容器技术、Kubernetes、Istio、DevOps 实践、Prometheus 监控、Envoy 代理、Golang 开发及云原生架构与微服务趋势的专业博客

项目主题:在服务器上使用docker实现LNMP实验环境

项目需求:公司业务扩展,客户需要使用web访问公司数据库记录信息,现公司决定搭建LNMP平台满足此需求。现阶段客户访问量不是太大,采用一台物理服务器搭建docker实现成本的节约。

思路图:
#

硬件平台:dell R710服务器,内存:16G,cpu:两颗/四核E5504, 硬盘4*300G

软件平台: centos7的服务器系统,docker版本1.10,

centos6.8的基础docker镜像

Docker的优点:

  1. 快速交付应用程序
  • 开发者使用一个标准的
    image
    来构建开发容器,开发完成之后,

    系统管理员就可以。使用这个容器来部署代码。

  • docker快速创建容器,快速迭代应用程序,并让整个过程可见,

    使团队中的其他成员更容易理解应用程序是如何创建和工作的。

  • docker容器很轻!很快!容器的启动时间是次秒级的,节约开发、

    测试、部署的时间。

2. 更容易部署和扩展

  • docker容器可以在几乎所有的环境中运行,物理机、虚拟机、公有云、

    私有云、个人电脑、服务器等等。

  • docker
    容器兼容很多平台,这样就可以把一个应用程序从一个平台迁移到另外一个。

3. 效率更高

  • docker容器不需要hypervisor
    ,他是内核级的虚拟化

4. 快速部署也意味着更简单的管理

  • 常只需要小小的改变就可以替代以往巨型和大量的更新工作。

LNMPLinux系统下Nginx+MySQL+PHP这种网站服务器架构。

Linux是服务器操作系统;Nginx是一个高性能的HTTP和反向代理服务器;Mysql是一个小型关系型数据库管理系统PHP是一款超文本预处理器。

这四种软件均为免费开源软件,组合到一起,成为一个免费、高效、扩展性强的网站服务系统。

项目实施:

部署安装mysql服务

使用centos6的基础镜像生成容器:

[root@localhost Desktop]# docker run -dit -v /docker/:/mysql -v /data/:/data --name mysql docker.io/centos:centos6 

-dit : 分别是指容器可以在后台运行,前端运行,给容器赋予交互式界面

-v :将本地目挂载到容器内部,可实现容器内部访问到宿主机的目录,并实现了容器内的重要数据存储的安全

–name: 给容器起个容器名称。(以下生成容器选项含义一致)

所需软件:

bison-3.0.4.tar.gz   cmake-3.5.2.tar.gz   ncurses-5.9.tar.gz

boost_1_59_0.tar.gz  mysql-5.7.13.tar.gz

安装开发所需依赖的安装包:

[root@213410cda363 /]#yum -y install gcc-c++  m4  perl

安装mysql所需软件包:

[root@213410cda363 mysql]# tar zxf bison-3.0.4.tar.gz

[root@213410cda363 mysql]# cd bison-3.0.4

[root@213410cda363 bison-3.0.4]# ./configure && make && make install

[root@213410cda363 mysql]# tar zxf boost_1_59_0.tar.gz

[root@213410cda363 mysql]# mv boost_1_59_0 /usr/local/boost

[root@213410cda363 mysql]# tar zxf ncurses-5.9.tar.gz

[root@213410cda363 mysql]# cd ncurses-5.9

[root@213410cda363 ncurses-5.9]# ./configure && make && make install

[root@213410cda363 mysql]# tar zxf  cmake-3.5.2.tar.gz

[root@213410cda363 mysql]# cd cmake-3.5.2

[root@213410cda363 cmake-3.5.2]# ./bootstrap && gmake && gmake install

[root@213410cda363 mysql]# tar zxf mysql-5.7.13.tar.gz

[root@213410cda363 mysql-5.7.13]#cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data -DSYSCONFDIR=/etc -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DEXTRA_CHARSETS=all -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DWITH_BOOST=/usr/local/boost && make && make install

创建mysql服务运行用户并给安装目录及数据目录授予权限并初始化mysql数据库:

[root@213410cda363 /]#useradd -s /bin/false -M mysql

[root@213410cda363 /]chown -R mysql:mysql /data

[root@213410cda363 /]chown -R mysql:mysql /usr/local/mysql/

[root@213410cda363 /]/usr/local/mysql/bin/mysqld  --initialize-insecure  --user=mysql  --basedir=/usr/local/mysql --datadir=/data

优化mysql路径:

[root@213410cda363 data]# tail -1 /etc/profile

export PATH=$PATH:/usr/local/mysql/bin

[root@213410cda363 data]# . /etc/profile

创建mysql的参数文件到/etc下和mysql的启动脚本到/etc/init.d/下添加系统服务

[root@213410cda363 support-files]#cp my-default.cnf /etc/my.cnf

[root@213410cda363 support-files]#cp -p mysql.server /etc/init.d/mysqld

[root@213410cda363 support-files]#chkconfig --add mysqld

修改mysql的主配置文件:/etc/my.cnf

[root@213410cda363 support-files]# grep  -v "^#" /etc/my.cnf | grep -v  "^;" | grep -v "^$"

[mysqld]

datadir = /data

port = 3306

server_id = 1

socket = /usr/local/mysql/mysql.sock

log-error = /data/mysqld.err

启动mysql的服务并查看端口:

[root@213410cda363 support-files]# service mysqld start

Starting MySQL.. SUCCESS!

[root@213410cda363 support-files]# netstat -anpt | grep 3306

tcp        0      0 :::3306                     :::*                        LISTEN      -

创建访问mysql服务所需用户:


部署php服务

使用centos6的基础镜像生成容器:

docker run -dit -v /docker/:/php -v /php/usr/loca/php5/etc --link mysql --name php docker.io/centos:centos6

–link mysql:“mysql"是容器名称,php服务器是需要连接mysql服务器的,容器之间使用link命令实现容器互连(以下生成容器选项含义一致)

所需软件

php-5.3.28.tar.gz   ZendGuardLoader-php-5.3-linux-glibc23-x86_64.tar.gz

安装部署php依赖软件包和开发依赖包,并指定mysqlclient库文件

[root@b4dd46498f63 /]#yum -y install gd libxml2-devel libjpeg-devel libpng-devel mysql-devel gcc-c++

[root@b4dd46498f63 /]#cp /usr/lib64/mysql/libmysqlclient.so.16.0.0 /usr/lib/libmysqlclient.so

解压php的tar格式压缩包,并配置安装

[root@b4dd46498f63 /]#tar zxf php-5.3.28.tar.gz

[root@b4dd46498f63 /]#cd php-5.3.28

[root@b4dd46498f63 php-5.3.28]# ./configure --prefix=/usr/local/php5 --with-gd --with-zlib --with-mysql --with-mysqli  --with-mysql-sock --with-config-file-path=/usr/local/php5/ --enable-mbstring --enable-fpm --with-jpeg-dir=/usr/lib && make && make install

创建php.ini和php-fpm配置文件

[root@b4dd46498f63 php-5.3.28]# cp php.ini-production /usr/local/php5/etc/php.ini

[root@b4dd46498f63 etc]# cp php-fpm.conf.default php-fpm

为了提高php解析效率,将ZendGuardLoader-php-5.3-linux-glibc23-x86_64.tar.gz解压并配置

[root@b4dd46498f63 php]# tar zxf ZendGuardLoader-php-5.3-linux-glibc23-x86_64.tar.gz

[root@b4dd46498f63 php]#cd ZendGuardLoader-php-5.3-linux-glibc23-x86_64/php-5.3.x

[root@b4dd46498f63 php-5.3.x]# cp ZendGuardLoader.so /usr/local/php5/lib/php/

在php主配置文件php.ini添加内容,启用ZendGuardLoader:

[root@b4dd46498f63 php]# tail -2 /usr/local/php5/etc/php.ini

zend_extension=/usr/local/php5/lib/php/ZendGuardLoader.so

zend_loader.enable=1

创建监听用户,修改php-fpm配置文件以启动php-fpm进程监听php解析请求:

[root@b4dd46498f63 etc]# useradd -s /bin/false -M php

[root@b4dd46498f63 etc]# grep -v "^;" ./php-fpm  | grep -v "^$"



启动php-fpm进程并查看进程监听状态

[root@b4dd46498f63 etc]# /usr/local/php5/sbin/php-fpm

[root@b4dd46498f63 etc]# netstat -anpt | grep  9000

tcp        0      0 0.0.0.0:9000                0.0.0.0:*                   LISTEN      808/php-fpm

 创建php连接mysql,及php语言创建的测试文件:

创建存放测试文件目录(此目录要与nginx配置文件中的一致)

创建nginx可成功连接php服务器文件:

Php链接mysql脚本:

部署Nginx

使用centos6生成nginx容器:

-p: nginx是前端监听客户端访问的服务器,所以需要设置监听端口,容器中端口发布时可以使

用–port简写-p命令使容器端口映射到宿主机端口,实现服务发布需求

所需软件: 

nginx-1.11.2.tar.gz

安装Nginx的依赖包并且创建服务运行用户:

[root@e56461580138 nginx]# yun -y install pcre-devel zlib-devel openssl-devel gcc-c++

[root@e56461580138 nginx]# useradd -M -s /bin/false nginx

 解压并且安装nginx:

[root@e56461580138 nginx]# tar zxf nginx-1.11.2.tar.gz

[root@e56461580138 nginx]# cd nginx-1.11.2

[root@e56461580138 nginx-1.11.2]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --user=nginx --group=nginx

[root@e56461580138 nginx-1.11.2]# make && make install

做路径优化:

[root@e56461580138 nginx-1.11.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

修改nginx的住配置文件,使nginx能解析php网页:



检测nginx配置文件并启动服务

[root@d34486af8b6d /]# nginx -t

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok

nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

[root@d34486af8b6d /]# nginx

[root@d34486af8b6d /]# netstat -anpt | grep nginx

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      16/nginx

Lnmp项目到此就做完,进行测试。验证lnmp平台是否可以正常运行:

访问静态网页:

测试nginx连接php应用:

*经过前两个的测试返回结果。足以证明搭建的lnmp平台顺利实现了web平台的静动分离的效果。

验证客户端访问mysql数据库的效果:

到此,lnmp项目完成。

六.项目总结

使用centos6的基础镜像编译搭建nginxmysqlphp。组合LEMP平台,因为是基础镜像,所以在编译过程中的开发软件包部分都没有安装,需手动安装。但是需要注意的是:docker本身就是一个轻量级虚拟化方案,所以建议不要安装开发组的所有软件包,只安装应用编译时所需要的软件包,以减轻docker的负载。在安装顺序的时候因为前端应用需要连接后端的服务器,所有建议安装顺序为:mysql——php——nginx

最终经过全组人员共同测试,搭建的LEMP平台可以完美的连接各服务器。当客户端访问的静态页面由nginx应用;当访问的是动态页面时nginx可以顺利的调用php服务器;当客户需要往数据库输入数据的时候,客户可以通过nginx访问phpphp通过mysql协议调用mysql服务器响应给客户端。