php发展

注册

 

发新话题 回复该主题

Docker从入门到实践 [复制链接]

1#

一般说来SPA的项目我们只要启一个静态文件Server就可以了,但是针对传统项目就不一样了,一个项目会依赖很多服务端程序。之前我们的开发模式是在一台开发机上部署开发环境,所有人都在这台开发机上使用Samba连接开发。老式开发是没什么问题的,但是前端因为引入了编译流程,增加了Webpack打包构建的行为,当多人共同开发的时候经常会因为内存爆满进程被杀导致打包失败。痛定思痛后为了解决这个问题,我决定将Docker引入我们的开发环境,通过将开发环境本地化来解决这个问题,所以有了本文。

本文内容主要是我之前分享的文字版,若想看重点的话可以看之前的Slide①

也可以查看分享视频②

WhyDocker?

普通的Web服务一般都会依赖很多程序,例如PHP,MySQL,Redis,Node等等。正常情况下我们会去手动安装这些程序来配置服务需要的环境,这样会带来几个问题:

同一环境不同的服务依赖同一个软件的不同版本,经典的例如python2和python3,本地Mac上是PHP7,但是服务只能支持PHP5.6。

同一环境不同的服务可能会修改同一份文件,例如系统的配置,Nginx的配置等,都会造成影响。

同一服务在多台机器上部署需要手工操作,导致大量的人力成本浪费。

这样逐个的安装软件实在是太麻烦了,所以大家就想干脆就直接把整个系统打包好放到机器上得了,于是就出现了虚拟机技术。这样做能保证系统环境的稳定以及重复的手工操作可以避免,但是也同样会带来一些问题:

打包后的虚拟机文件包含系统镜像所以特别大。

打包后的虚拟机文件包含系统镜像所以服务需要等待系统启动成功之后才能启动。

打包过程无法实现自动化。

针对第三点,后来出现了Vagrant使用vagrantfile的形式将镜像构建脚本化从而实现自动化的功能,不过其它两点没有解决。所以后来就出来了系统之上的进程级别虚拟化技术——Docker。它为我们带来了以下几个优点:

不需要打包系统进镜像所以体积非常小

不需要等待虚拟系统启动所以启动快速资源占用低

沙箱机制保证不同服务之间环境隔离

Dockerfile镜像构建机制让镜像打包部署自动化

Dockerhub提供镜像平台方便共享镜像

以下是VM和Docker技术的具体区别,可以看到VM是打包了GuestOS进入镜像中的,而Docker是直接基于宿主系统虚拟化的实例。

Docker基础

Docker支持Windows/Linux/Mac/AWS/Azure多种平台的安装,其中Windows需要Win10+,Mac需要EICaptain+。Docker是一个C/S架构的服务,安装好docker之后需要启动docker软件后才能使用docker命令。

Docker主要有Dockerfile,Image,Container,Repository四个基本概念。通过Dockerfile我们可以生成DockerImage(镜像)。自己制作的镜像可以上传到Dockerhub平台,也可以从平台上拉去我们需要的镜像。当镜像拉到本地之后,我们就可以实例化这个镜像形成一个Container(实例)了。一个简单的镜像启动的命令是:

$dockerrun[组织名称]/镜像名称:[镜像标签]`

其中除了镜像名称,其它的都是可选参数。组织名称不填默认为library,镜像标签不填则默认为latest。例如经典的启动一个HelloWorld镜像的过程如下:

可以看到当我实例化hello-world这个镜像的时候,docker发现本地没有这个镜像会先去Dockerhub远端拉取镜像,如刚才说的,默认是latest标签。拉取后就会实例化执行入口命令了。我们除了可以使用Dockerhub查找我们需要的镜像之外,也可以使用dockersearch命令来查找。16年的一篇文章③显示,Dockerhub上的镜像包总量已经超过40万了,并且以每周4-5k的速度增长着。

下面我们就来看看如何运行一个Nginx容器实例:

$dockerrun\

-d\

--rm\

-p0\

-v"$PWD/workspace":/var/

分享 转发
TOP
发新话题 回复该主题