06月17, 2017

用docker安装lnmp系统

docker简介

docker有什么用

docker是一种容器化虚拟技术。那么对于研发来说,我们用docker有什么好处呢?想象以下几种情况:

  1. 你的项目需要更高级的PHP版本,但公司的其他项目依赖于低版本PHP导致你不敢升级,这时怎么办?
  2. 服务需要部署集群,但环境之间的依赖过于复杂,部署新机器费时费力,这时怎么办?
  3. 同事的代码坑爹,总是占用大量内存或CPU资源,导致你的项目资源使用不足,怎么办? 以上的回答就是用docker。

docker难不难

如果大家仅仅想用docker实现环境的隔离,或环境的打包迁移,我明确告诉大家,只要用过git,以及随便一种shell工具,那么你已经具备学习docker的能力了。

docker的原理

docker是一种容器的虚拟化技术,可以实现在同一台服务器,对环境进行隔离,类似于虚拟机的效果。通常大家的第一印象肯定是,卧槽,这玩意性能怎么样,不会跟虚拟机一样坑爹吧,能部署在生产环境嘛?事实上,各位大哥多虑了,不同于虚拟机,docker利用cgroup和namespace实现linux进程间的隔离,从而实现环境的隔离,当然,说这个的意思就是,docker是完全可以应用于生产环境的。

docker的几个核心概念

下面说一下docker的几个核心概念,有了这些概念我们才能进行下一步的实战。

  1. 镜像

    前面我说过通过git就很好入门docker的原因就是docker和git设计思路是一样的。只不过git是管理代码,docker管理环境。docker镜像就相当于git中的项目,你要在服务器运行你的git项目要怎么办?从中央版本库中拉下来然后通过环境启动呗,没错,docker也是一样的,你要运行镜像,就从中央仓库中docker pull下指定镜像,然后通过docker环境运行就可以了,具体命令后面会详细说。

  2. 容器

    容器就是docker运行的环境了。你从git上拉取项目时,PHP代码需要PHP环境运行,JAVA代码需要JAVA环境运行,所以docker也是一样的,只不过你从docker版本库拉下来的所有代码都统一的在docker的容器中运行。

  3. 中央版本库

    中央版本库就相当于git中的仓库,如github,码云等等。目前我一直在用的是网易的版本库(https://c.163.com/hub#/m/home/)。

在docker中运行lnmp环境实战

步骤

下面我们就尝试利用docker搭建lnmp的环境。搭建docker环境我们需要一台虚拟机,或者是云主机也行。这个请大家自行准备,我们先概括一下要操作的步骤。

  1. 在服务器中安装docker服务。
  2. 下载docker镜像。
  3. 利用容器跑起来docker镜像。
  4. 在镜像中安装我们的依赖环境,并生成我们自己的镜像。
  5. 运行我们自己的镜像。

安装docker服务

首先docker要求linux内核版本必须高于3.10,可以运行uname -r查看当前系统内核版本。 alt

然后centos可以执行yum install ,ubuntu可以执行wget -qO- https://get.docker.com/ | sh

yum -y install docker                      #for centos

或者

wget -qO- https://get.docker.com/ | sh      #for ubuntu

安装之后我们可以执行

service docker start

然后我们可以运行ps -ef命令查看一下是否启动

ps -ef|grep docker              #如果没成功只显示一个进程

下载docker镜像

我们下载centos7镜像

docker pull hub.c.163.com/public/centos:6.7-tools

下载完成之后,查看是否下载成功

docker images          #该命令列出所有镜像

很多同学可能有疑问,docker pull的地址是从哪搞来的,这个可以访问我博客上文说到的网易镜像链接,然后选择centos,点进去之后右上角会有该镜像的下载地址,直接复制下来粘贴到shell就行了。

运行容器

docker run -it hub.c.163.com/public/centos:6.7-tools /bin/bash

运行这条命令后,我们就进入到了我们的docker环境中,这个就是跟主机完全隔离的环境啦,激动吧各位,此时可以随便折腾这个环境了,安装nginx,php,mysql的过程在这里就不再赘述了,大家可以随便从网上下载个一键安装包什么的安装。

安装完lnmp环境后,我们可以直接运行exit命令退出docker容器环境。

exit;

生成我们自己的镜像

1)先查看一下刚才运行的容器id

docker ps -lq

我这里的ID是88e1804a70c8

2)提交生成新镜像

docker commit 88e1 naiqianz/webtest:v1

注意docker镜像的命名一般是author/project:version

启动我们的镜像

docker run -d -p 80:80 -p 3306:3306 -v /web:/www naiqianz/webtest:v1

命令说明:

  • -p 80:80:将容器的80端口映射到主机的80端口,3306同。
  • -v /web:/www:是将本地的/web目录挂载到容器的/www(容器配置的web目录)目录下。当然你也可以把mysql的存储目录也挂载到本地,这样重启数据就不会丢失了,这个-v后面的参数视你自己的安装储存目录而定。

这里再说一下-p命令,我们可以这样简单的理解,其实就是把主机的80端口的请求转发到容器的80端口。注意,前面的数字表示主机端口,后面的数字表示容器端口。如果你80端口已经占用过了,可以使用其他端口也行。比如-p 8080:80

善后工作

那么问题来了,我们现在想进这个新镜像怎么办呢?莫慌,看这里

docker run --rm -v /usr/local/bin:/target jpetazzo/nsenter

大家直接跑这条命令,成功了之后先查看下刚才运行的容器ID.

docker ps

我这里的容器ID是2a89823230fe

然后大家docker-enter镜像的id前几位就可以了。

docker-enter 2a89

进入镜像检查一遍lnmp是否已经启动,没启动的话挨个启动。然后在web目录可以创建一个文件,echo "hello 撒网怪",然后出来用浏览器,在输入框输入主机ip+端口访问,测试是否成功。

后续工作

本文因篇幅所限,一些docker的其他用法没有介绍。比如如何导出镜像到其他机器等等,但docker的核心应用已经在上文中都有所涉及了,大家按照上文操作完,相信已经掌握了docker的入门技术,后面就需要大家自己去探索了。在这里提醒以下几点。

  • docker run命令是docker的一个核心所在,我们挂载目录,映射端口,甚至分配主机的资源(如cpu,ip等)都通过run命令来执行。因此大家下面一定要好好看手册,看看run命令一些其他我没有介绍到的参数。

  • 为了docker运行更稳定,第一我们需要把容器中数据的目录挂载出来,第二我们可以用类似supervisor这类的工具实现docker的自动重启。

  • 这里为了简便,我们把lnmp环境都安装到了同一个centos镜像中,但生产环境下,我们经常把mysql,nginx,PHP环境部署成独立的不同镜像,已达到解耦的目的,其实和代码一样,封装和解耦本身就像矛盾的对立统一,没有标准答案,有些人可能觉得一键部署的方式比较方便,有些可能觉得解耦后每个容器的职责更加的单一。见仁见智。

  • 最后一点,如果大家按照上述教程部署在生产环境出问题了,麻烦通知我删文章跑路。

本文链接:http://www.qiana.info/post/docker_start.html

-- EOF --

Comments