2014年有个项目需要研发人员配置统一开发环境,权衡后选择了成熟的vagrant。当时docker正在风头上,但生态远没有今日成熟,这个原因导致了docker落选。因为没有现实使用价值,这也是我一直没去了解docker的原因。

近期运维部署方面工作增加,又想起docker。月初从官方的文档开始,再到《Docker–从入门到实战》开源版的电子书,对docker有了初步的了解。看文档中产生的疑惑点通过搜索引擎查找答案,加上在服务器上动手实践,目前的docker技能已经可以在正式环境中使用了。

关注点

和vagrant相比,docker的主要优势是轻量级。然而毕竟是两个不同的虚拟化工具,理解原理后才能更好的使用。在使用docker之前和期间,以下关注点逐一的被解惑,极大的促进了对docker的理解。

  1. 运行方式

    vagrant管理虚拟机的运行,虚拟机上跑的操作系统基本上都很熟悉,上手就快。而docker运行的是容器,容器中的进程能同时被宿主和容器看到,这要归功于linux namespace技术。需要注意的是容器中必须有前台进程运行,否则容器将被停止。

  2. 网络

    容器运行的进程,默认是对宿主机和其他容器屏蔽。如果需要对宿主暴露端口,在运行容器时显示指定-p选项。如果对其他容器暴露网络,可以创建私有网络或使用旧式的-link选项。

  3. 存储

    docker基于AUFS(Advance UnionFS),镜像这一层是只读的。容器运行时产生的数据会放入可读写的最上面一层,容器停止后数据不会消失,宿主机的文件系统可以查找和访问到。例如nginx的日志文件或者mysql的数据文件,通过find命令可以找到其位于/var/lib/docker/overlay/的某个目录内。

  4. 对volume的理解

    Volume可以将容器以及容器产生的数据分离开来。启动时不指定挂载的宿主机目录,则只是实现了在容器内创建文件夹的功效。如果希望容器内的某个文件夹与宿主机的同步,volume的功能就体现出来了。

  5. 进入容器

    刚开始使用docker时,思维方式和运行虚拟机相同:进去看看容器内部有什么,敲几个命令熟悉一下。实际上是除非busybox或者操作系统这类容器,其他的容器进去了也没用。例如运行nginx的容器,用docker attach命令进入容器,什么命令也敲不了。后来转念一想,nginx是容器前台运行的进程,attach到这个进程有何意义?

    如果需要查看容器内部的东西,推荐使用docker exec命令,从侧面实现进入容器的效果。

  6. 多服务打包

    某些服务经常不是独立的,例如lnmp架构,部署时需要一起。可以使用docker-compose解决多服务依赖和打包。

以上关注点弄明白后,docker基础基本上掌握了。

docker使用场景

docker的轻量赋予了它十分方便的运行和部署容器的能力。目前能想到最有用的是多实例共存:同一个镜像启动多次,每次暴露不同的端口,对宿主机而言就轻易做到了多实例共存。

例如一台机器上的redis,想要为多个应用提供服务,docker出现之前常见的解决方案:

  1. 使用不同的数据库,例如0号数据库做session用, 1号数据库做cache用,等等;
  2. 启动多个redis实例。先准备多份redis配置,然后修改redis管理脚本。

有了docker之后,只需要运行两次docker run命令,每次指定-p参数不同就实现了同样功能,十分的方便。

参考

  1. https://www.docker.com/
  2. https://www.gitbook.com/book/yeasy/docker_practice
  3. http://www.infoq.com/cn/articles/docker-core-technology-preview
  4. http://dockone.io/article/129