项目主题:在服务器上使用docker实现LNMP实验环境
项目需求:公司业务扩展,客户需要使用web访问公司数据库记录信息,现公司决定搭建LNMP平台满足此需求。现阶段客户访问量不是太大,采用一台物理服务器搭建docker实现成本的节约。
思路图:#
硬件平台:dell R710服务器,内存:16G,cpu:两颗/四核E5504, 硬盘4*300G
软件平台: centos7的服务器系统,docker版本1.10,
centos6.8的基础docker镜像
Docker的优点:
- 快速交付应用程序
- 开发者使用一个标准的
image
来构建开发容器,开发完成之后,系统管理员就可以。使用这个容器来部署代码。
- docker可以快速创建容器,快速迭代应用程序,并让整个过程可见,
使团队中的其他成员更容易理解应用程序是如何创建和工作的。
- docker容器很轻!很快!容器的启动时间是次秒级的,节约开发、
测试、部署的时间。
2. 更容易部署和扩展
- docker容器可以在几乎所有的环境中运行,物理机、虚拟机、公有云、
私有云、个人电脑、服务器等等。
- docker
容器兼容很多平台,这样就可以把一个应用程序从一个平台迁移到另外一个。
3. 效率更高
- docker容器不需要hypervisor
,他是内核级的虚拟化
4. 快速部署也意味着更简单的管理
- 通常只需要小小的改变就可以替代以往巨型和大量的更新工作。
LNMP:Linux系统下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的基础镜像编译搭建nginx、mysql、php。组合LEMP平台,因为是基础镜像,所以在编译过程中的开发软件包部分都没有安装,需手动安装。但是需要注意的是:docker本身就是一个轻量级虚拟化方案,所以建议不要安装开发组的所有软件包,只安装应用编译时所需要的软件包,以减轻docker的负载。在安装顺序的时候因为前端应用需要连接后端的服务器,所有建议安装顺序为:mysql——php——nginx。
最终经过全组人员共同测试,搭建的LEMP平台可以完美的连接各服务器。当客户端访问的静态页面由nginx应用;当访问的是动态页面时nginx可以顺利的调用php服务器;当客户需要往数据库输入数据的时候,客户可以通过nginx访问php,php通过mysql协议调用mysql服务器响应给客户端。