Docker实践

前言

本文并不是一篇Docker的入门文章, 而是面向对Docker有必定了解的开发人员, 文章不会介绍如何安装Docker, 以及什么是Docker镜像,什么是Docker容器这些概念,若是须要了解请前往Docker官方文档。这里咱们只探讨一下Docker在开发中的实践,或者说咱们怎么用Docker来帮助咱们在开发中受益。前端

背景

随着NodeJS的发布,前端便像嗑了药似的疯狂发展,各类概念,框架,插件层出不穷,致使前端小伙伴压力很大(鄙人后端,前端不大专业,若有不当请包涵),别的不说,就一个前端开发环境的搭建可能就要花费很长时间,一个npm install执行半天,中途还有可能由于本机环境的缘由报各类摸不着头脑的错,并且node_modules文件夹异常庞大,win下删都删不掉,常常心生骂娘冲动。所以本文就实践一下如何用Docker来帮咱们解决前端开发中遇到的这些问题,最后也会简单分析下后端的Docker应用。node

项目

话很少说,咱们开始,直接上项目,码代码....
假如咱们有以下项目 dockerdemo:
目录结构 package.jsonwebpack

很明显这个项目依赖了不少插件(项目比较早,用的grunt,用gulp,webpack的小伙伴勿喷),若是是您的第一个项目的话你大概须要作如下步骤去搭建整个开发环境。web

  • 安装node,须要跟团队负责人肯定版本信息
  • 安装grunt或者gulp
  • 安装bower
  • 安装express
  • 安装sass或less,貌似要依赖ruby
  • 克隆源码
  • 执行npm install
  • 执行bower install
  • ......

其间还要经历各类等待,甚至出现不明不白的错误。下面咱们就一步步用Docker搭建咱们的前端开发环境docker

Dockerfile

分析一下不难发现,咱们须要的是一个安装了node,npm的环境,若是咱们能有一个预装好的系统那就最好不过了,幸运的是Docker刚好能知足咱们的这个需求,去DockerHub 搜一下就会发现官方提供了node的镜像,并且各个版本包罗万象,这样事情就好办了,开始写Dockerfile构建咱们的镜像。没错咱们的镜像就是基于官方node镜像。假如你本机的项目目录位于/home/xiaoqiang/projects/dockerdemo,咱们在项目目录下新建一个Dockerfile文件,并添加以下代码:express

FROM node:4.4.7

RUN mkdir -p /home/project/dockerdemo

ADD . /home/project/dockerdemo  

WORKDIR /home/project/dockerdemo

VOLUME /home/project/dockerdemo

EXPOSE 9000 35729

RUN npm install -g grunt && npm install -g bower

CMD ["./grunt_release.sh"]

grunt_release.sh以下npm

#!/bin/sh

npm install
bower install --allow-root
grunt build

分析下上面文件的内容:json

  1. 第一行,表示咱们的镜像给予官方node4.4.7版本镜像
  2. 第二行,RUN指令表示在镜像构建时执行后面的命令,这里咱们在镜像中建立项目目录
  3. 第三行,ADD指令表示将宿主机中的文件添加到镜像中去,这里咱们将本机的项目目录中的源码内容一并添加到镜像中去
  4. 第四行,WORKDIR指令表示将工做目录切换到制定目录下,至关于cd,这里就是咱们的项目目录
  5. 第五行,VOLUME指令表示为镜像添加一个卷,而卷具备以下特色:
    1. 卷能够在多个容器中共享数据
    2. 对于卷的修改会当即响应到宿主机或者容器中
    3. 对于卷的修改不会被提交到镜像中去
    4. ...
      这里咱们指定项目目录做为卷,后面咱们在运行容器的时候会指定一个本机的文件夹做为容器中卷在宿主机上存储数据的地方。
  6. 第六行,EXPOSE指令表示所运行的容器会公开指定端口,一样咱们在运行容器的时候会指定一个本机的端口映射到容器公开的端口上。
  7. 第七行,运行安装grunt跟bower的命令,这样当咱们在启动容器的时候,就能够直接使用他们了。
  8. 第八行,CMD指令是指定在容器启动后默认执行的命令,该命令能够被覆盖。

好了,代码分析完了,总之大致思路就是咱们把本机项目目录映射到容器中去,而且在容器中公开能够访问网页的端口,并在容器启动是执行相应命令,如安装插件,启编译,启动server等。gulp

构建

Dockerfile写完了下面就是基于该文件构建镜像了,代码很简单:
build_docker.sh后端

#!/bin/sh
sudo docker build -t dockerdemo .

执行该命令等待完成后,咱们就能够基于该镜像运行咱们的容器了,或者说咱们的环境基本搭建完成了。

容器

运行容器的命令也很简单,代码以下: run_docker.sh

sudo docker run -it --rm --name dockerdemo -v /home/xiaoqiang/projects/dockerdemo:/home/project/dockerdemo -p 9000:9000 -p 35729:35729 dockerdemo
  1. --name指定容器的名字
  2. --rm指定在容器退出后自动删除该容器
  3. -v表示用本机的指定文件夹映射到容器中的卷,这里是为了保证咱们的代码能够即时相应到容器中去。
  4. -p表示用本机指定端口映射到容器中的端口

这样你就能够享受编码的愉快过程了,而不用头疼环境的搭建了。

总结

你可能以为还得写这么多命令多么麻烦,若是这么想说明你仍是没有理解其中的道理。

  1. 这些命令只须要编写一次,而不用每一个进入该项目的开发人员都去编写,一般由项目搭建者写好,其余人只须要执行构建(build_docker.sh)跟运行(run_docker.sh)脚本就能够了,其余的都不须要关心。
  2. 整个环境的安装中除非有网络断开的状况,不然不会报错,由于镜像是官方的,不可能有问题,你必定会一次安装成功。
  3. 咱们能够把容器部署到测试环境中,生产环境中,这样就能够保证咱们这些环境中的运行环境是一致的,不会再说”我这里是好的呀,你哪里怎么不行呢?必定是你的问题“,换句话说,咱们打包的是运行环境,这个是一致的。

最后

Docker技术还比较年轻,对于它的理解目前是仁者见仁,智者见智,很难说最佳实践是什么,这一套只是个人一些思考跟应用,可能有不少不合适不合理不正确的地方,还望指点,若是感受有用还望不吝点赞~~~

相关文章
相关标签/搜索