环境部署方式的优缺点
环境部署需要很多东西,也是开发过程与项目上线必须要考虑的一个重要环节,随着项目的迭代更新,系统会越来越庞杂,其所依赖的环境也会需要经常的变动更新,一个基本的项目就至少需要nginx、mysql、php、redis等服务。因此,开发时团队的开发环境的统一就是一个很骚的事情。随着项目越来越复杂,会导致以下一些问题:
1. 依赖的服务越来越多,本地开发环境的搭建成本越来越高
2. 由于团队成员使用的操作系统或者软件版本的不同,可能会导致线上出现bug
3. 每次新增一项服务的时候,所有的开发人员都需要重新配置一下环境
4. 在部署集群服务时,需要启动大量的虚拟机,需要高配的机器
5. 由于很多情况下都是将所有服务安装在一个虚拟机中,所以很难进行服务的水平扩展
以上三点问题,对于问题1、2、3都可以使用vagrant来统一管理虚拟机,各个开发人员使用统一的box,其实都是可以解决的,但是每次更新服务的时候,都需要更新box文件,在部署出现错误的时候也无法很方便的回退至原来的环境,尤其是在部署集群服务时,大量的虚拟机需要占用很多的内存。
本次的搭建方式
考虑到以上涉及到的几点问题,所以采用将服务拆分到容器的方式进行环境的搭建,就是一个容器一个服务。由于docker容器每次升级,都会留下上一个版本的image,所以即便部署错误,也能很容易的进行回退,有点版本管理的味道。
从Docker的设计可以看到,构建镜像的过程中可以指定唯一一个容器启动的指令,因此Docker天然适合一个容器只运行一种服务,而这也是官方更推崇的。
dockerFile
前面并没有介绍dockerFile,我会在搭建环境的过程中详细解释dockerFile的用法。这里就说明一下dockerFile几个常用关键字的意思。
FROM image_name
指定镜像
COPY <宿主机路径> <容器路径>
复制宿主机文件到容器中
ADD <宿主机路径> <容器路径>
ADD命令和COPY命令很相似,但是ADD命令的<宿主机路径>可以直接使用url
EXPOSE 端口号
开放容器端口,该命令与docker run中的-p参数不一样,
-p参数表示绑定宿主机与容器的端口,EXPOSE只是开放了容器的端口,在宿主机中访问时需要使用container_ip:port,
而-p参数指定的端口,在宿主机中访问时可以直接使用127.0.0.1:port访问。
RUN
可以指定要在容器中执行的命令,可以使用该命令安装php扩展
准备工作
由于采用分服务方式搭建,事先需要准备好docker项目目录,将服务分好目录结构,如下
your-docker-path/
├── mysql/
│ ├── data/ // mysql的数据存放目录
│ ├── log/ // mysql的日志文件目录
│ └── Dockerfile
├── nginx/
│ ├── Dockerfile
│ ├── log/ // nginx日志文件目录
│ ├── nginx.conf // nginx的配置文件
│ └── sites-enabled // nginx的虚拟站点配置
│ ├── default.conf
├── php/
│ ├── Dockerfile
│ ├── log/ // php的日志文件目录
│ ├── php-fpm.conf // php-fpm配置文件
│ ├── php.ini // php配置文件
└── redis/
├── data/ // redis持久化后的数据存放目录
├── log/ // redis的日志文件目录
├── redis.conf // redis配置文件
└── Dockerfile
如果需要其他服务,比如memcache,则新增一个memcache目录,配置好memcache的dockerFile文件即可。