Docker 101 - 概览

jopen 9年前

写这篇文章时,使用的Docker版本是1.6.1。 对于Docker这样迭代极快的系统,这很重要。

文章的目标读者是听说过Docker但并未使用过的用户。 希望能够介绍一些使用情况,并鼓励越来越多的用户。

Docker 101 - 概览

Docker 可以打包应用,从而作为软件开发的标准单元。 静态的概念是镜像(Image),动态的概念是容器(Container)。 是一种轻量级的虚拟化实现。

Docker家族

Docker 社区极为活跃,变更极大。开始使用之前,最好先看看官方文档,确认文章描述的还跟得上时代。:)

官方的主要组件有:

  • Docker Engine (aka Docker) - 创建和运行 Docker 容器
  • Docker Hub - 社区化的 Docker 资源。在这里可以获取和发布配置好的系统镜像。
  • Docker Compose - 组合 Dockers 形成统一服务的配置工具。事实上是 fig 的官方升级。
  • Docker Registry - Docker Hub 私有版,便于团队协同。
  • Docker Swarm - Docker 主机集群和容器调度。
  • Docker Machine - 自动化容器管配。可以应用在本地,远程或云端的 Docker 创建。有点像 Ubuntu 整合的 MaaS,然而轻巧很多。目前还处于 beta 版本。
  • Docker Mirror - Docker 提供了工具缓存 Docker Hub 的镜像,便于本地团队开发。

这么多是不是已经晕了?说好的小巧方便,易学易用呢?

这也不完全是 Docker 的错,发展太快了,不要说书籍,连博文都很快落后。 整理下思路,看看学了有没有用。

Docker 可以做什么

从把玩到实际应用,Docker可以:

快速且标准化的建立开发环境

这点类似 Vagrant,各有利弊。Docker 更模块化。Vagrant 概念更加容易理解。 如何开始?这里是 Mac OSX 下 Rails Docker开发案例

将里面所说的 fig 换成 docker-compose 即可,语法都是一样的。

整体说来的结构如下

  1. boot2docker做了命令行到vm中 docker 的翻译器,可以透明的在 Mac 下使用 docker
  2. docker 根据Dockerfile从本地或远程Docker Hub 中下载镜像(预定义的打包系统)并低开销的加载在 Container 中
  3. Dockerfile中还会定义一些配置命令,用于个性化 Container 中加载的镜像
  4. docker run 命令帮助用户在配置好的 container 运行程序

如果是 linux,那么基本从2开始就可以了,不用考虑 boot2docker 是什么。

其中 boot2docker 起到了 vm 的作用(基于 virtualbox),虚拟了一个 linux 系统。

将 docker 命令透明的转化到虚拟机的 docker daemon 中(因为 Docker 本来就是支持远程的)。 实际的实现基本是配置环境变量,因此非常稳定。

ruby 镜像中包括了基本的依赖,就像运行在一个标准的 linux 中,因为是公用的,大家都一样,不用担心编译需要什么包的问题。

docker 在容器中运行后,可以打包成新的镜像分发。其中还引入了版本的概念,和git很像,基本的操作包括 push/pull/commit 等

如果有什么特殊的需要,可以修改并保存在 Dockerfile 中,随 SCM 工具(git)提交,保证团队使用的一致性。

当然可以把数据库服务器应用都装在一个 image 中,但这并不 docker

docker 的哲学中,模块化是弹性的基础。

因此,我们需要 docker-compose.yml 来定义容器间的运行时关系。

docker-compose 会自动将相关的依赖注入各个 docker 容器的环境变量。正确的应用这些特性才能灵活的扩展。

还请详细参考官方的 Rails Docker 开发参考

在生产中弹性部署

Docker 最强大的地方,在于开包即用的生产特性。

利用 Docker Swarm 快速的创建 Docker 集群,瞬间实现弹性计算。

Docker Swarm 需要连接每个 host 上运行的 Docker Daemon,将多个本地,云端,甚至虚拟主机变成一个一体的抽象虚拟机。从而灵活的实现弹性部署。

整件事情也并不复杂,只需要一个网页的指导就可以了

如果能够有效的结合运营监控系统,就可以实现自动化的弹性适性部署,感觉就像拥有了全世界。而这一切,并不需要有个多么高科技的机房。

Demo 和产品分发

很多企业项目的上线,都特别痛苦。因为有无数的线上配置操作,长长的上线行动表让人窒息。运营工程师各个都要处女座加 AB 型,但仍然状况不断。

Docker 可以让这一切固化在版本控制的配置代码里。

即使面对爆发的流量需要紧急扩容,也可以将成本降低到最低(当然,这需要长期的实践和整体架构的支持)

Docker 也可以很容易的部署在 SaaS 服务的容器中,使用别人维护的基础设施,专注于核心业务逻辑。

也可以有效的利用计算需求时空分配不均的问题,最大限度降低门槛。

实际应用Docker(特别是中国)

Docker 最让人惊讶的恐怕就是在生产环境的普及,作为一个2岁的项目。在国内的京东和携程都得到了相当规模的应用。

当然,他们的吐槽也不少。好在很多问题都在快速的解决中。

我们看看入门 Docker 可能会遇到的一些困难和解决方案。

网速或者你懂的

Docker 镜像很难少于百兆,毕竟打包了个操作系统。网速会成为极大的问题。Docker 本地是个离散型的镜像库,因此同一镜像只需要下载一次。同时,还提供了 mirror 和 registry 两种工具或组件。

  • mirror 可以帮你重定向请求到本地或第三方的加速库,避免从缓慢而你懂的 Docker Hub 下载
  • registry 可以在内网存储团队镜像库,快速的分享成果。

入门时,可以应用国内的 DaoCloud 提供的免费加速镜像。注册后在控制台点加速器可以看到详细的说明。http://daocloud.io 官方的帮助说明在这里

另外实际使用时,软件内部的依赖管理系统如 deb 也会遭遇速度的问题。所以要预先部署一些工具如 artfactory / apt-cacher 等等。

docker 官方就提供了部署 apt-cacher工具的例子 看看是不是比以前方便一些。

文档和教程

Docker 太快了,搜到的博文都很可能是过期的。建议先从官方文档看起。

另外需要注意的是,Docker 是基于 linux 的,其他平台都需要合适的虚拟机方案。

硬件要求

普通的开发电脑就可以。但要体验集群,需要大内存和多核 CPU ,相对于 OpenStack 等的要求,应该说很贫民。对,是贫不是平。

团队开发

建议先从配置文件共享做起。做到镜像共享需要更多的熟悉。

文/王啸

来自:http://blog.2byte.us/devops/rails/ruby/mac/docker/2015/06/23/docker-overview.html