devDocker程序员

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

2015-11-12  本文已影响850人  skywalker

一 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

一个例子
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

  1. 基于多个docker镜像构建后端服务
    互联网的后端服务需要多个模块协同组成micro-service,进而构建起整个互联网服务。官方建议一个docker容器中运行单个进程,这样更有利于服务的扩容和管理。这就需要容器间具备类似进程间通讯的机制

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只支持在一台物理主机上的的容器之间连接

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

  1. 服务集群编配工具和组件

三 docker更多的使用场景

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

上一篇下一篇

猜你喜欢

热点阅读