一、 什么是 docker 
环境配置的难题 
软件开发最大的麻烦事之一,就是环境配置.用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来? 
用户必须保证两件事:操作系统的设置,各种库和组件的安装.只有它们都正确, 软件才能运行. 
举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量.

如果某些老旧的模块与当前环境不兼容,那就麻烦了. 
开发者常常会说:"它在我的机器可以跑了"(It works on my machine),言下之意就是,其他机器很可能跑不了.

环境配置如此麻烦,换一台机器,就要重来一次,旷日费时. 
很多人想到,能不能从根本上解决问题,软件可以带环境安装? 也就是说,安装的时候,把原始环境一模一样地复制过来.

虚拟机 
虚拟机(virtual machine)就是带环境安装的一种解决方案. 
它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统. 
应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样, 
而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响.

虽然用户可以通过虚拟机还原软件的原始环境.但是,这个方案有几个缺点: (1)资源占用多 
虚拟机会独占一部分系统资源,它运行的时候,其他程序就不能使用这些资源了. 哪怕虚拟机里面的应用程序真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行. 
(2)冗余步骤多 
虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录等, 操作繁琐. 
(3)启动慢 
启动操作系统需要多久,启动虚拟机就需要多久. 可能要等几分钟,应用程序才能真正运行.

Docker 出现的背景 
虽然虚拟机解决了带环境安装的问题, 不过在公司日常的研发和项目场景中, 以下情况仍普遍存在: 
A. 个人开发环境为了做大数据相关项目,需要安装一套大数据集群,常见的做法是在自己电脑里搭建 3 台与大数据版本对应的虚拟机,把大数据集群装起来后,考虑到以后很有可能还要使用一个干净的大数据集群,为了避免以后重复安装环境,通常会对整套大数据集群做一个备份,这样电脑里就有 6 个虚拟机镜像了。另外,后面在学习其他技术时,比如学习 Ambari 大数据集群,那么为了不破坏已有的虚拟机环境,又要重新搭建 3 台虚拟机,本机磁盘很快被一大堆的虚拟机镜像占满。

B. 公司内部开发环境公司里往往会以小团队的方式来做项目,一般由运维部门从他们管理的服务器资源中分配出虚拟机供团队内部开发测试使用。 
比如做一个与机器学习相关的项目: 
• 小明在运维部门分配的虚拟机上搭建了一套 Ambari 集群,拿来跑大数据相关业务 
• 小刚用 python3 写了一个机器学习算法,放到虚拟机上运行发现虚拟机里是python2,算法不兼容,于是把虚拟机里的 python 版本升级了,算法跑通了, 但 Ambari 用到 python 的部分功能可能就报错了 
• 小李开发了应用,放到虚拟机上启动 tomcat,发现虚拟机里的是 OpenJDK, 导致 tomcat 起不来,于是又安装了一个 JDK,这时候可能 Ambari 里的 Java 代码可能就报错了 
• 小赵想利用服务器资源做性能测试,发现虚拟机严重削减了性能,最终还是直接找物理机来跑测试,破坏了物理机原来的环境 
• 做完项目后,这些虚拟机上安装的东西往往变得没用了,下个项目组来还是得新申请虚拟机重新部署软件

C. 开发/测试/现场环境研发人员在开发环境里写好了代码做好测试后,提交给测试部门,测试人员在测试环境跑起来发现有 BUG,研发人员说在开发环境没这个 BUG,和测试人员多次扯皮解决 BUG 后发布版本. 在生产环境部署后,又发现有 BUG,这下又到工程人员和测试人员扯皮... 有时候为了兼容特殊的现

场环境,还需要对代码进行定制化修改,拉出分支,这样导致了每次到现场升级都是一场噩梦

D. 升级或迁移项目在每次发版本要升级到现场时,如果现场起了多个 tomcat 应用,那么需要对每个 tomcat 都先停掉,替换 war 包,然后再起起来,轮流着做,不仅繁琐而且很容易出错,如果遇到升级后出现严重 BUG,还要手工做回退。另外,如果项目想上云,那么在云上部署后要重新进行一轮测试,如果后面考虑其他云厂商,可能相同的测试还要再进行一次(比如更换了数据存储组件),费时费力。

总结以上列举的场景,他们存在的一个共同的问题是:没有一种既能够屏蔽操作系统差异,又能够以不降低性能的方式来运行应用的技术,来解决环境依赖的问题。 
Docker 解决了这些问题。

二、 Docker 的安装 
(一) 安装方式一: 安装 docker 源 
CentOS 7 (使用 yum 进行安装)

(二) 安装方式二: 直接下载 rpm 包进行安装: 
官 方 下 载 地 址 : https://download.docker.com/linux/centos/7/x86_64/stable/Packa ges/ 
找到相应的包下载下来rpm -ivh 包名

三、 Docker 基本操作 
查看本机的 image 
# docker image ls 
# docker images

获取 image 
# docker search centos #此命令会在 docker 官方仓库查找所需镜像,速度慢. 
# docker pull centos # 从默认仓库拉取 centos 镜像最新版

删除 image 
# docker image rm 镜像 #镜像指 镜像 ID 或 镜像名称:tag 
# docker rmi 镜像

查看容器 
# docker ps # 查看正在运行的容器 
# docker ps -a # 查看所有容器

启动容器 
# docker run -itd -h http://centos.docker.qf.com --name centos centos 
常用选项: 
-i # 允许你对容器内的标准输入 (STDIN) 进行交互 
-t # 在新容器内指定一个伪终端或终端

-d # 在后台运行容器,返回容器 ID 
-h # 指定容器的主机名,如果不指定,会随机生成一个 
--rm # 容器停止后删除掉,默认不会删除 
--name # 指定容器的名称 
-p <宿主端口>:<容器端口> # 端口映射,将容器指定端口映射到宿主机的指定端口. 可以用多个-p 选项指定多个端口映射 
-p 80 # 将容器的 80 端口映射到宿主机的随机端口 
-P # 将容器的所有端口映射到宿主机的随机端口 
-v <宿主目录>:<容器目录> #将宿主机的指定目录映射到容器的指定目录 
--privileged #需要修改某些特定的参数需要加上此选项, 正常运行一个容器不建议开放这个权限

连接容器 
对于正在运行的容器,我们可以在宿主机上连接容器 
# docker exec -it centos /bin/bash # 可用 exit 命令退出,不影响容器,
centos 是容器名字 
四、 基于 Docker 容器部署 LNMP 分离架构 
1) 获取镜像 
# docker pull centos:7.6.1810 #获取镜像

# docker images 
2) 准备容器 
# docker run -it -d --name nginx -h apache --privileged -p 80:80 -v 
/html:/usr/share/nginx/html f1cb7c7d58b7(IMAGE ID) 
# 准备 nginx 容器

# docker run -it -d –name php -h php --privileged -p 9000:9000 -v 
/html:/var/www/html f1cb7c7d58b7(IMAGE ID) 
# 准备 php 容器

# docker run -it -d –name mysql -h mysql --privileged -p 3306:3306 - v /mysql:/var/lib/mysql f1cb7c7d58b7(IMAGE ID) 
# 准备 mysql 容器

3) 准备环境

Nginx 
# docker exec -it apache /bin/bash #连接容器 
# hostname -I # 查看容器 ip 
#建立 nginx 的安装源 
# vim /etc/yum.repos.d/nginx.repo 
[nginx-stable] 
name=nginx stable repo 
baseurl=http://nginx.org/packages/centos/$releasever/$basearc h/ 
gpgcheck=1 
enabled=1 
gpgkey=https://nginx.org/keys/nginx_signing.key 
module_hotfixes=true

[root@qianfeng_nginx ~]# yum -y install nginx nfs-utils

#设置 nginx 服务配置 
[root@qianfeng_nginx ~]# cd /etc/nginx/conf.d [root@qianfeng_nginx conf.d]# vim default.conf server { 
listen 80; 
server_name www.qianfeng.com;

location / { 
root /usr/share/nginx/html; 
index index.php index.html index.htm; 
}

error_page 500 502 503 504 /50x.html; 
location = /50x.html { 
root /usr/share/nginx/html; 
}

location ~ \.php$ { 
root /usr/share/nginx/html; 
fastcgi_pass <nfsphp 主机 IP 地址>:9000; 
fastcgi_index index.php; 
fastcgi_param SCRIPT_FILENAME 
$document_root$fastcgi_script_name; 
include fastcgi_params; 

}

Mysql 
[root@qianfeng_db ~]# yum -y install mariadb-server mariadb 
# 安装 mysql 
[root@qianfeng_db ~]# systemctl start maraidb && systemctl enable mariadb

[root@qianfeng_db ~]# mysql -uroot 
mysql> create database qqfarm; # 创建 qqfarm 数据库mysql> grant all privileges on qqfarm.* to 'qqfarm'@'*' 
identified by 'qqfarm'; # 授 权mysql> exit

Php 
[root@qianfeng_nfsphp ~]# yum -y install nfs-utils php php-mysql php-devel php-gd php-fpm php-mcrypt php-mbstring php-xml 
[root@qianfeng_nfsphp ~]# groupadd -g 996 nginx [root@qianfeng_nfsphp ~]# useradd -u 998 -g nginx -M -s 
/sbin/nologin nginx 
[root@qianfeng_nfsphp ~]# vim /etc/php-fpm.d/www.conf listen=<本机 IP 地址>:9000 
listen_allower_client=<nginx 主机 IP 地址>,<。。。> user=nginx 
group=nginx 
[root@qianfeng_nfsphp ~]# sytemctl start php-fpm && systemctl enable php-fpm

[root@qianfeng_nfsphp ~]# vim /etc/exports 
/usr/share/nginx/html <nginx 应用服务器 IP 网段>(rw,sync) [root@qianfeng_nfsphp ~]# mkdir -p /usr/share/nginx/html [root@qianfeng_nfsphp ~]# systemctl start nfs && systemctl enable 
nfs

4) 部署项目 
将项目包上传 farm-ucenter1.5.zip 到服务器/html 目录下

php 容器端 
# unzip farm-ucenter1.5.zip 
# chmod 777 -R upload/ #给予权限

# mysql -ufarm -pfarm -h mysql 的 IP -D qqfarm < upload/qqfarm.sql 
# 导入数据库

修改/etc/php.ini 文件

# vim /etc/php.ini
进入 nginx 端 
# nginx -s reload # 重启 nginx

5) 访问

安装完成后用浏览器访问:

http://服务器 IP 地址 /upload/home

基于Docker部署LNMP架构相关推荐

  1. 云计算入门科普系列:基于Docker部署LNMP架构

    一. 什么是 docker  环境配置的难题  软件开发最大的麻烦事之一,就是环境配置.用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来?  用户必须保证两件事:操作系统的设置,各种 ...

  2. 基于docker部署的微服务架构(九): 分布式服务追踪 Spring Cloud Sleuth

    为什么80%的码农都做不了架构师?>>>    前言 微服务架构中完成一项功能经常会在多个服务之间远程调用(RPC),形成调用链.每个服务节点可能在不同的机器上甚至是不同的集群上,需 ...

  3. 基于docker微服务架构_使用基于微服务的流架构更好地进行大规模的复杂事件处理(第1部分)...

    基于docker微服务架构 基于微服务的流架构与开源规则引擎相结合,使实时业务规则变得容易 这篇文章旨在详细介绍我将OSS业务规则引擎与Kafka风格的现代流消息传递系统集成在一起的项目. 该项目的目 ...

  4. LNMP介绍及一键部署LNMP架构

    目录 一.LNMP 1.LNMP介绍 ①LNMP工作原理 ②LAMP工作原理 2.LAMP和LNMP的区别 3.编译安装的优点 4.各组件的主要作用 二.脚本一键部署LNMP架构 一.LNMP 1.L ...

  5. LNMP源码编译安装及一键部署LNMP架构

    目录 一.LNMP 1.LNMP介绍 1.1 LNMP工作原理 1.2.LAMP工作原理 2.LAMP和LNMP的区别 3.编译安装的优点 4.各组件的主要作用 三.LNMP架构的部署 1.安装ngi ...

  6. 推荐一款基于docker部署的个人免费笔记工具wiznote

    推荐一款基于docker部署的个人免费笔记工具wiznote 作为一个爱写作爱折腾的程序员,在做某个事情的时候,脑子里总是会联想并且不断蹦出各种奇怪的创意和想法,但是这些想法很多时候都是一闪而逝,事情 ...

  7. shell脚本一键部署lnmp架构

    shell脚本一键部署lnmp架构 1. 创建存放脚本的目录 2. 创建脚本文件 3. 编写脚本 4. 通过IP地址直接访问PHP界面 1. 创建存放脚本的目录 [root@localhost ~]# ...

  8. 源码编译安装部署LNMP架构(Nginx、MYSQL、PHP+论坛)

    目录 1.LNMP概述 1.1 LNMP所需要的安装包 2.Nginx安装 3. MYSQL安装 4. PHP安装 4.1 数据库安装 5. 论坛安装 6. 小结 1.LNMP概述 LNMP:Linu ...

  9. Docker部署LNMP环境

    Docker部署LNMP环境 172.16.10.0/24 Nginx:172.16.10.10 Mysql:172.16.10.20 PHP:172.16.10.30 网站的访问主目录:/wwwro ...

最新文章

  1. 新闻更新php html,phphtml 新闻发布系统,运用php+mysql,里面包括数据库和php文件。 Other systems 其他 249万源代码下载- www.pudn.com...
  2. Android跳转intent简单教程
  3. 浅析优化网站导航设计的几种常用方法
  4. Nginx高级应用--负载均衡、rewrite规则
  5. SQL Server 2005中, 创建维护计划时出现错误信息: 创建维护计划 失败
  6. iphone6s无4g显示无服务器,iPhone 6S无信号,镇定修复显现4G
  7. [MySQL] 为什么要给表加上主键
  8. BZOJ 1500 维修数列
  9. gsonformat插件_收藏非常有用的IDEA插件,没用过这些IDEA插件?怪不得写代码头疼
  10. .NET Core微服务之路:让我们对上一个Demo通讯进行修改,完成RPC通讯
  11. vue概述、vue文件特点、vue核心思想、双向数据流、单文件、启动一个vue项目、声明式渲染
  12. poj1064 二分搜索 挑战程序设计竞赛
  13. Twitter开放平台api key申请流程 (Twitter Consumer Key)
  14. 微软.NET设计上的一个错误(从.NET1.1--4.0),不知道以后.NET会不会修复这个错误...
  15. python contains 正则_Python 正则表达式
  16. 简单的省市区级联SQL脚本
  17. 线性代数(五)特征值和特征向量
  18. 中国烟草和水烟行业市场供需与战略研究报告
  19. 教你怎么从Java8升级到Java11
  20. uni-app 中微信小程序使用高德地图等第三方 SDK的方法

热门文章

  1. 华为 P30系列最高补贴1200元!华为开启以旧换新服务了
  2. 阿里巴巴宣布架构调整:集中发力推进三大战略 程立任集团CTO
  3. 又一台苹果第一代电脑顺利拍卖:成交价超过47万美元
  4. 【LeetCode】 Best Time to Buy and Sell Stock I II III IV 解题报告
  5. Java成神之路——一文搞懂CAS
  6. raiserror 在 java_SQL 抛出异常错误信息- RAISERROR (存储过程)
  7. php7 编译 pdo mysql_php7 编译 pdo_mysql 问题, [mysql_driver.lo] Error 1
  8. redis订阅怎么退出_关于redis,学会这8点就够了
  9. c函数sscanf的高级技巧(二)
  10. python爬取b站评论_学习笔记(1):写了个python爬取B站视频评论的程序