原lnmp环境服务器升级为mysql+nginx+php单个docker容器构建的lnmp环境
时间:2018年2月
一.项目背景
我单位现web服务架构为lnmp环境,服务器软件、硬件升级部署难;同时开源软件日新月异,考虑到技术升级,领导决定服务器架构整体升级为容器架构,维护性、移植性强。
二.项目说明
原服务器架构为lnmp环境,服务器运行稳定,升级为容器架构,应平稳过度;采用单个镜像逐个构造容器,将容器互联,部署为lnmp环境;原服务器项目代码、配置文件,数据库数据等采用数据挂载方式与容器互联,访问端口采用端口映射方式,实现客户访问。
三.实施步骤
1.镜像构造
1)mysql镜像构造
我们采用dockerfile 构造vim Dockerfile
FROM mysql:5.7
MAINTAINER yst <691699086@qq.com>
ENV TZ "Asia/Shanghai"
基础镜像为mysql5.7
docker build -t mysql .
build 为构造镜像, mysql 为镜像的仓库及标签,.为当前路径
出现success就代表成功了。
2)php镜像构造
vim Dockerfile
FROM centos:centos7 #以centos7为基础
MAINTAINER yst <mushouhxh@tom.com> #制作者
ENV TZ "Asia/Shanghai" #时区
#安装依赖包
RUN yum -y install libxml2-devel libmcrypt-devel libmcrypt mcrypt mhash libjpeg libjpeg-devel libpng libpng-devel net-tools gcc gcc-c++ make
ADD php-5.6.36.tar.gz / #拷贝安装包
#运行源码包安装程序
RUN cd /php-5.6.36 && ./configure --prefix=/usr/local/php --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --enable-mbstring --with-zlib --with-libxml-dir=/usr --enable-xml --enable-fpm --with-gd && make && make install
#复制文件
RUN cp /php-5.6.36/php.ini-production /usr/local/php/etc/php.ini
RUN cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
#配置php
RUN useradd -M -s /sbin/nologin php
#修改配置文件
RUN sed -i -e 's\;pid = run/php-fpm.pid\pid = run/php-fpm.pid\g' -e 's\nobody\php\g' -e 's\listen = 127.0.0.1:9000\listen = 0.0.0.0:9000\g' /usr/local/php/etc/php-fpm.conf
RUN sed -i 's\;daemonize = yes\daemonize = no\g' /usr/local/php/etc/php-fpm.conf
EXPOSE 9000 #暴露端口
CMD ["/usr/local/php/sbin/php-fpm"] #启动php-fpm
docker build -t php .
3)nginx 镜像构造
先写好配置文件nginx.conf
vim nginx.conf
user nginx; worker_processes 1;
error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;
pid logs/nginx.pid;
events { worker_connections 1024; }
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on; #tcp_nopush on;
keepalive_timeout 65;
gzip on;
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
#存放网页代码目录
root html;
index index.php index.html index.htm;
}
# redirect server error pages to the static page /50x.html
#重定向到错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
#如果结尾为.php 文件,转向容器名为php的容器,由该容器负责.php,并且端口为9000,
location ~ \.php$ {
root html;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /$document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}
from centos:centos7
MAINTAINER yst mushouhxh@tom.com
RUN yum -y install gcc gcc-c++ pcre-devel zlib-devel make
RUN useradd nginx -s /sbin/nologin
ADD nginx-1.10.3.tar.gz /
RUN cd /nginx-1.10.3 && ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_gzip_static_module --with-pcre && make && make install
#创建日志目录
RUN mkdir /var/log/nginx
#拷贝配置文件
ADD nginx.conf /usr/local/nginx/conf/nginx.conf #将写好的配置文件添加到镜像中
EXPOSE 80 443
ENTRYPOINT ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"] #以守护进程方式运行nginx
docker build -t nginx .
2.生成并运行容器
因为要升级为 docker 环境的lnmp,要以数据库为后台,所以要先生成数据库容器,再生成PHP容器,最后生成Nginx容器。
1)运行并启动mysql容器
docker run -d -it --name mysql -p 3306:3306 -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
-d :以守护进程运行容器
-i :让容器的输入保持打开
-t : 分配一个伪终端
--name:为该容器的名字
-p:为宿主机的端口映射到容器的端口
-e:设置数据库登录root密码
-v 挂载宿主机/root/bo/data/mysql到容器的/var/lib/mysql,也就是宿主机与容器实现数据同步
最后的mysql 为镜像的仓库名及标签
2)运行并启动PHP容器
docker run -d -it --name php -p 9000:9000 -v /root/php/data/:/usr/local/nginx/html --link mysql:mysql php
-v : 此处为宿主机的目录挂载到nginx容器中nginx 安装目录的网页代码存放目录,把.php为结尾的代码文件挂载映射到该目录
可把原旧lnmp服务器中的代码迁移至该宿主机,实现数据与容器的互联
--link :为连接mysql 容器,名字为mysql
3)运行并启动nginx容器
docker run -d -it --name nginx -p 80:80 -v /root/nginx/data:/usr/local/nginx/html --link php:php nginx
--link :为连接PHP容器,名字为php
-v : 映射宿主机存放网页代码路径到容器的Nginx安装目录的放网页代码目录,可把原旧lnmp服务器中的代码迁移至该宿主机,实现数据与容器的互联
3.测试
1)准备 index.html,index.php,test.php
分别为普通网页文件,PHP网页文件,测试PHP与mysql连通的测试文件
vim index.html
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
vim index.php
<?php
phpinfo();
?>
此处mysql版本为5.7,所以测试代码为mysqli_connect('为宿主机中的容器名字:对应的宿主机端口','登录服务器的用户名','密码')
如果是其他版本,语句会不同
mysqli_close($link);为关闭连接
vim test.php
<?php
$link=mysqli_connect('mysql:3306','root','123456');
if($link) echo "连接成功";
mysqli_close($link);
?>
2)访问测试
打开浏览器,输入http://宿主机的ip回车
显示我们准备的index.html
输入http://宿主机的ip/index.php回车
输入http://宿主机的ip/test.php回车
3)数据库操作测试
打开navicat for mysql
建立新的连接
主机名为宿主机的ip,此处为什么为宿主机的ip呢,因为,数据库容器建立在该主机上,而宿主机与容器在运行容器时已用参数-p 3306:3306进行了端口映射,所以,访问宿主机的3306就相当于访问容器的3306端口,也就是访问mysql容器的mysql服务。
用户名为root
密码为我们在运行容器时,-e MYSQL_ROOT_PASSWORD=123456设置的root的密码123456
建立好连接,我们就可以在Windows桌面对容器进行操作了,操作的结果都会反馈到容器内,从而实现数据互联。
4.总结
项目难点
1)如何生成合适的镜像
mysql 镜像是我们在docker镜像库中下载mysql纯净镜像,docker tag 命令将原镜像标签标记为我们自己的命名
PHP镜像是以centos7纯净镜像为基础,通过源码安装,配置好配置文件,并开启端口而构建的
nginx 镜像是以centos7纯净镜像为基础,通过源码安装,修改配置文件,开启端口而构建的
2)如何正确启动镜像并运行容器
先开启mysql容器;开启php容器及nginx容器时,发生
容器运行命令执行后,容器就关闭了,这不是我们要的结果,我们希望容器要一直运行服务,我们才能访问容器内的服务。
我们从查询镜像生成文件dockerfile 文件开始,一步步查找原因,经过反复试验,不断生成镜像,运行容器,我发现在生成镜像的最后,我们一定要开启在该镜像中的服务,比如PHP镜像,我们在运行容器时,需要在容器中开启php-fpm服务,这就需要我们在创建竟像时,开启这个服务进程,就是
CMD ["/usr/local/php/sbin/php-fpm"];而nginx 容器运行时出现同样问题,反复查询,调试,应在生成镜像时要执行入口命令
ENTRYPOINT ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"],或在执行运行容器的命令加入--restart=always参数否则在容器启动运行完入口名,容器也会停止。
3)如何连接各个容器
单个容器,每个容器提供有每个的服务功能,这是docker容器的一个容器一个功能,也是 docker 容器的优点所在,每个容器提供的服务封装起来,用的时候运行它,不用的时候可以迁移,拷贝到哪里都可以提供服务。我们如何实现它,就是用--ling参数,将有关联的几个容器互联起来,一起完成一个更加强大的服务功能。
比如:构建容器环境的lnmp,需要mysql,php,nginx等几个容器提供的服务,需要将几个容器连接起来一同完成 lnmp服务
docker run -d -it --name nginx -p 80:80 -v /root/nginx/data:/ usr/local/nginx/html --link php:php --link mysql: mysql nginx
原lnmp环境服务器升级为mysql+nginx+php单个docker容器构建的lnmp环境的更多相关文章
- docker_facenet_image在Docker容器中运行Facenet环境搭建
对开发和运维人员来说,可能最梦寐以求的就是一次性地创建或配置,可以在任意环境.任意时间让应用正常运行.而Docker恰恰是可以实现这一终极目标的瑞士军刀. 具体来说,Docker在开发和运维过程中,具 ...
- Docker容器搭建android编译环境
Docker容器搭建android编译环境 目录 1 部署容器 1.1 手动部署 1.1.1 配置docker 1.1.2 启动容器 1.1.3 配置环境 1.2 Dockerfile 2 镜像管理 ...
- Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境
首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...
- docker容器共享宿主机环境,从而为镜像体积减负
一.背景介绍 响应公司技术发展路线,开发的服务均需要将打成docker镜像,使用docker进行统一管理.可是随着服务越来越多,镜像也越来越多.每次制作镜像的时候都需要将依赖打进容器,这样一个jre的 ...
- 服务器环境迁移,Linux centos7 64位 基础环境部署 jdk+tomcat+mysql+nginx
最近阿里云服务器到期,这个周末连夜将服务器迁移到美国去了,为什么迁移到美国去呢?主要是因为阿里云服务器费用高,另外网站的访问量不大,对网速要求也不高,主要是宣传和信息传递的作用,加上本人之前在***上 ...
- 在docker容器中python3.5环境下使用DIGITS训练caffe模型
********* 此处使用的基础镜像为 nvcr.io/nvidia/digits:18.06,镜像大小为6.04GB,可从nvidia官方pull此镜像: 容器配置: CUDA:9.0 CUDNN ...
- nginx反向代理docker容器化django
1.新建Dockerfile FROM python:3.8.5 MAINTAINER ChsterChen ENV PYTHONUNBUFFERED 1 COPY pip.conf /root/.p ...
- Docker容器学习梳理 - 基础环境安装
以下是centos系统安装docker的操作记录 1)第一种方法:采用系统自带的docker安装,但是这一般都不是最新版的docker安装epel源[root@docker-server ~]# wg ...
- docker 容器启动时设置环境变量source
镜像启动时,自动执行的是~/.bashrc文件,所以,环境变量需要配置在该文件内,这样镜像启动时,可自动执行该文件,使环境变量生效. vi ~/.bashrc ------------------- ...
随机推荐
- 【邀请函】小投入 大产出—微软智能云(Azure)之CDN 专题
会议时间 2016 年 11 月 24 日 14:00-16:00 会议介绍 尊敬的客户: 您是否还在为如何提高网站的响应速度以及用户增长造成的源站压力烦恼?是否还在担心源站 IP 暴露存在安全隐患? ...
- solidity语言10
pragma solidity ^0.4.16; contract OwnedToken { // TokenCreator是个合约类型,由后面部分定义.只要不用于创建新合约,引用它就好 TokenC ...
- geth访问公有链
同步以太坊,配置rpc地址 mkdir /opt/blockchain nohup geth --syncmode "fast" --cache=1024 --maxpeers 3 ...
- 爬虫入门之urllib库(一)
1 爬虫概述 (1)互联网爬虫 一个程序,根据Url进行爬取网页,获取有用信息 (2)核心任务 爬取网页 解析数据 难点 :爬虫和反爬虫之间的博弈 (3)爬虫语言 php 多进程和多线程支持不好 ja ...
- Selenium2学习(九)-- 多窗口,句柄(handle)
前言 有些页面的链接打开后,会重新打开一个窗口,对于这种情况,想在新页面上操作,就得先切换窗口了.获取窗口的唯一标识用句柄表示,所以只需要切换句柄,我们就能在多个页面上灵活自如的操作了. 一.认识多窗 ...
- Struts2学习-拦截器2续
定义拦截器有2种办法:1.实现Interceptor接口2.集成AbstractInterceptor抽象类 一.方法1 ..... <struts> <package name=& ...
- 使用VM Tools让VMware虚拟机里的ubuntu能够共享Windows系统的文件夹
我们经常有这样的使用场景,在宿主机Windows(Linux)操作系统上通过VMware软件安装了一个Linux(Windows)的虚拟机, 然后需要在两种操作系统中通过某种介质共享数据. 一种比较麻 ...
- CentOS 6.4安装谷歌浏览器(chromium)不是chrome
原文转载于http://www.wypblog.com/archives/782 今天给大家介绍如何在CentOS 6.4平台上面安装chromium浏览器,和Google的Chrome也类似,虽然不 ...
- linux服务基础之CentOS6编译安装mariadb
1. 下载mariadb https://downloads.mariadb.org/mariadb/+releases/ 2. 解压到指定目录 # tar xf mariadb--linux-x86 ...
- 更改win7关机菜单选项功能
说明:如果你不希望别人对你的电脑进行注销切换等操,那么可以使用如下的方法 实现效果: 实现步骤: 效果1 1>切换用户: 2>注销:(需重启资源管理器生效) 效果2: