热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于Docker部署LNMP架构

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



一、 什么是 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 命令退出,不影响容器&#xff0c;
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&#61;nginx stable repo 
baseurl&#61;http://nginx.org/packages/centos/$releasever/$basearc h/ 
gpgcheck&#61;1 
enabled&#61;1 
gpgkey&#61;https://nginx.org/keys/nginx_signing.key 
module_hotfixes&#61;true 

[root&#64;qianfeng_nginx ~]# yum -y install nginx nfs-utils 

#设置 nginx 服务配置 
[root&#64;qianfeng_nginx ~]# cd /etc/nginx/conf.d [root&#64;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 &#61; /50x.html { 
root /usr/share/nginx/html; 


location ~ \.php$ { 
root /usr/share/nginx/html; 
fastcgi_pass :9000; 
fastcgi_index index.php; 
fastcgi_param SCRIPT_FILENAME 
$document_root$fastcgi_script_name; 
include fastcgi_params; 

 

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

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

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

[root&#64;qianfeng_nfsphp ~]# vim /etc/exports 
/usr/share/nginx/html (rw,sync) [root&#64;qianfeng_nfsphp ~]# mkdir -p /usr/share/nginx/html [root&#64;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 # 导入数据库 
 



修改/etc/php.ini 文件
 


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



5) 访问 
 


 

 

 

 

安装完成后用浏览器访问&#xff1a;

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


推荐阅读
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • 小程序自动授权和手动接入的方式及操作步骤
    本文介绍了小程序支持的两种接入方式:自动授权和手动接入,并详细说明了它们的操作步骤。同时还介绍了如何在两种方式之间切换,以及手动接入后如何下载代码包和提交审核。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
author-avatar
宝宝贝贝侠
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有