《使用docker构建后端测试和线上服务》

一 docker的应用场景

RD对QA说:“诶?这个程序在我的环境里是好使的呀?”,QA怒视之!~
这个场景真实出现过,linux版本,gcc,版本,依赖版本会导致各种各样奇怪的问题。之前在B公司,每个新人都要自己动手搭建一套复杂的线上搜索环境,而这个时间通常需要1周。

上面是一些开发中的痛点,也是docker可以解决的方面。总结docker,我觉得的优点如下:

  1. 将线下和线上的环境统一,减少开发和测试的复杂度
    之前我们team的做法是把程序的依赖尝试都使用相对路径,并跟程序一起打包上线。思路很类似。现在很多公司都将docker用在这个地方,但我觉得如果docker更加稳定后应用场景会更多,更通用
  2. 集群管理可视化更加高效,开源的容器编排工具Kubernetes,可视化工具提供了强大的支持
  3. 云平台,测试机云平台可以利用docker技术提升整个集群的利用效率,榨干每一台机器的能力
  4. 开源社区强大,外围工具很多,如上下游服务发现组件如:etcd和Consul
  5. toB的业务发布后端程序更加简便
    例如:A公司开发游戏,发布给B公司进行运营,使用docker发布不用再编写复杂的部署说明手册了,变更也更加方便
  6. 需求迭代迅速,流量变化迅速的互联网web服务后端(易发布,易扩容)

二. 上手

  1. 运行的环境要求
    docker是典型的CS架构,docker client把要执行的程序发给驻守的服务Docker Machine执行。Linux可以不需要驻守进程外的任何环境,mac os和windows需要安装Boot2Docker。
    墙内的加速工具:DaoCloud

  2. 使用已有的docker镜像
    docker file:相当有用于构建二进制程序的makefile
    image镜像:相当于构建好的二进制文件
    container:相当于运行起来的二进制

    • 镜像的市场dockerhub
      这里面有官方officical的镜像如:ubuntu,redis,mysql等等。也有第三方发布的image(不保证安全性和质量)
    • image操作命令集合
      docker images
      shows all images.
      docker import
      creates an image from a tarball.
      docker build
      creates image from Dockerfile.
      docker commit
      creates image from a container.
      docker rmi
      removes an image.
      docker load
      loads an image from a tar archive as STDIN, including images and tags (as of 0.7).
      docker save
      saves an image to a tar archive stream to STDOUT with all parent layers, tags & versions (as of 0.7).

示例:
docker run -it -v $HOSTDIR:$DOCKERDIR
-p 127.0.0.1:$HOSTPORT:$CONTAINERPORT kaixhin/caffe:latest /bin/bash
说明:镜像 kaixhin/caffe:latest 分为作者名/镜像名:tag版本号
-it表示启动容器后会进入执行交互的shell命令终端tty
如果执行的时候没有下载好image文件,会首先默认执行docker pull
-v 表示将本地目录挂在到容器中的目录位置,这个对于容器运行后的数据持久化很有用
-p表示使用容器使用port到本机实际的port的映射

  1. 构建自己的docker 镜像
    有2种方式可以构建自己的镜像image
  • 使用docker commit(不推荐,因为细节变化不好维护,不好复用)
    具体:在已经运行的基础容器上面执行命令,保存修改并推出。之后通过docker commit来提交变更部分到自己的新镜像。这个过程类似git修改代码提交的过程。

  • 使用dockerfile + docker build命令
    dockerfile相当于Makefile,决定了镜像具体的构建过程和最终的效果。其使用了专门的DSL语言来描述。
    .dockerignore 类似.gitingore,忽略打包的镜像的文件
    FROM 依赖的基础镜像
    MAINTAINER维护着
    RUN就是运行
    CMD配置执行等同于docker run执行时的命令,只能有一条生效,如果需要执行多个启动命令,可以使用supervisored+配置多个启动进程来实现
    EXPOSE设置要使用的端口号
    ENV设置环境变量
    ADD将build同级目录下文件上传到容器的指定目录,如果是tar还会自动的解压缩
    COPY类似add,没有解压缩功能
    ENTRYPOINT
    VOLUME创建可以穿透到docker虚拟环境,持久化数据的目录
    USER镜像运行使用的用户账号
    WORKDIR工作目录,类似cd功能
    ONBUILD注入命令,在本dockerfile被FROM继承并build的时候插入

一个例子
FROM ubuntu:trusty
MAINTAINER zhaoming "ming.zhao@horizon-robotics.com"
RUN apt-get update \ && apt-get -y install \ curl \ wget \ apache2 \ libapache2-mod-php5 \ php5-mysql \ php5-sqlite \ php5-gd \ php5-curl \ php-pear \ php-apc
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf \
RUN mkdir -p /app && rm -rf /var/www/html && ln -s /app /var/www/html
COPY . /app
WORKDIR /app
RUN chmod 755 ./start.sh
EXPOSE 80
CMD ["./start.sh"]
注意:start.sh 需要跟本Dockerfile在同一级目录
由于build过程都是递进复用上一层的镜像,所以命令行数原则上越少镜像会越小,build过程更快
dockerfile最佳实践

  • 发布自己的镜像

docker push you/yourimage

  • 更自动化的方案
    在docker hub操作关联在github上的dockerfile项目,每次提交dockerfile的修改就可以触发自动构建流程
  1. 基于多个docker镜像构建后端服务
    互联网的后端服务需要多个模块协同组成micro-service,进而构建起整个互联网服务。官方建议一个docker容器中运行单个进程,这样更有利于服务的扩容和管理。这就需要容器间具备类似进程间通讯的机制
  • docker的解决方案-link连接

docker run -it -p 4567 --name testapp --link redis:db -v $PWD/webapp:/data/webapp zmoon/testapp /bin/bash
说明:--link redis:db表示本次启动的容器作为父容器,使用子容器redis,并重命名为db。在本容器中的webapp程序可以通过使用主机名"db"来作为子容器的ip访问相应服务。 如:redis = Redis.new(:host=>'db', :port=>'6379')
注意:link只支持在一台物理主机上的的容器之间连接

  • 使用Volume卷

docker run -it -d -P --volumes-from other-v-container my/apache_service
说明:other-v-container 是依赖的另一个容器,其中定义了
VOLUME /var/www/html
卷的特性:可以在容器间共享;卷是持久化的;卷会一直存在直到没有容器使用

  1. 服务集群编配工具和组件
  • Compose - Dockerfile 可以让用户管理一个单独的应用容器;而 Compose 则允许用户在一个模板(YAML 格式)中定义一组相关联的应用容器(被称为一个 project
    ,即项目),例如一个 Web 服务容器再加上后端的数据库服务容器等。
    web service with compose
  • etcd - 它的目标是构建一个高可用的分布式键值(key-value)数据库用来管理配置和提供服务发现功能,基于 Go 语言实现,部署多台具有高可用性。
  • kubernetes-Kubernetes 是 Google 团队发起的开源项目,它的目标是管理跨多个主机的容器,提供基本的部署,维护以及运用伸缩,主要实现语言为Go语言。适合更大规模的集群
  • Consul类似etcd,提供分布式环境下服务发现的功能,部署多台具有高可用性。

三 docker更多的使用场景

物联网IOT设备上运行的环境更加多样,不同的cpu:如arm等。不同的os如:android,linux多版本等。在这样的环境下引入docker可以更好的屏蔽不同的硬件环境以及更容易的自动升级,这部分工作在:Raspberry Pi with Docker 1.5.0

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 10,404评论 0 120
  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 15,418评论 15 147
  • 一、Docker 简介 Docker 两个主要部件:Docker: 开源的容器虚拟化平台Docker Hub: 用...
    R_X阅读 4,343评论 0 27
  • docker基本概念 1. Image Definition 镜像 Image 就是一堆只读层 read-only...
    慢清尘阅读 8,669评论 1 21
  • 又一个早起,身体不适,所以早饭也简单也少,我们会忘记很多事情又会记起很多事情,但是有人记得你说的话那就真的很...
    明风桦阅读 359评论 3 1