Docker 介绍与实践

在2016年6月25日的 运维派 Ops-Day 做了关于 Docker 的演讲,以下为演讲的 keynote。

背景

有些时候,运维和开发之前往往会因为环境的不同而造成一些 bug 被部署到了生产环境。

有时候,开发非常想推进一些前沿技术,可是由于环境的不同导致生产环境出了问题。


近几年比较流行的概念是 DevOps,把运维和开发结合起来出一些解决方案,降低运维和开发之间的沟通成本。

Docker 是 DevOps 里的明星方案,2013年3月发布首个版本。

原理

Docker 是一整套完整的生态系统,除了本地运行的 Docker Engine,还有相对应管理远程仓库的 Docker Hub。

Docker Engine 的原理是 LXC,它是一种虚拟化 Linux 环境的技术,可以不用分割内核而创造出 Linux 的运行环境。Docker 正是基于它进行了封装,使用起来更加方便。

Image 镜像

Container 容器


Repositroy 仓库

Docker 的远程仓库使得开发、部署 Docker 镜像变得异常方便。

实践


Linux 下的安装相对简单,都是先添加源,然后再直接安装。Docker 默认是需要 root 权限的,如果需要非 root 用户使用 Docker,可以添加到 docker 的用户组。旧版本的 Windows 和 OSX 还需要自己安装虚拟机,新版的 Docker for MacDocker for Windows 就解决了这个问题,只需要下载下来跑就可以了。

使用 docker pull 可以直接从 docker hub 下载已经存在的镜像,而 docker images 可以列出本机所有的镜像。当我们把一个容器依据镜像跑起来的时候,其实就是一个类似 Linux 的环境,可以进行一系列的操作,比如下面的 ls

我们也可以基于一个镜像去进行一些操作,然后使用 docker commmit 去提交修改,这样我们就得到了一个新的镜像。

Docker 推荐的的方法是使用 Dockerfile 来定义一个镜像的所有内容。特别当团队成员不止一个的时候,这样 Dockerfile 就成了一种契约,定义了一个应用所需要的所有(包括环境、代码、依赖库)。而当 Dockerfile 有更新的时候,使用 docker build 会自动从有改动的地方开始 build,不需要全部重新再跑一边。

Dockerfile 里面还可以使用 ADD 添加本地文件,EXPOSE 来暴露接口,CMD 来定义运行容器的默认命令。另外也可以通过 docker savedocker loaddocker rm 来导出、导入和删除镜像。

可以通过 docker pulldocker push 来从远程的镜像仓库下载和推送镜像。

基于一个镜像我们可以跑起来一个容器,Docker 推荐一个容器只跑一个应用,比如服务器同时需要应用、redis、数据库的时候,可以跑三个容器。

开发环境可以用挂载数据卷(Volume)的方法来共享本地的文件,方便开发的时候修改文件。

也可以使用 docker-compose 来管理不同的容器,包括控制不同容器的 link,但是生产环境还不是特别推荐,因为不是特别稳定。

生产环境的时候可以用 docker machinedocker swarm 等工具来实现多机器和多集群管理。

一个完整的 Docker 流程是这样的:

  • 开发提交代码到代码托管平台(如 Github)。
  • CI 系统触发自动的 build,创建新镜像,push 到 Docker 远程仓库。
  • CI 系统触发自动部署脚本,去 Docker 远程仓库 pull 最新的镜像并启动。

小结

Docker 可以为开发、测试、运维提供一套完全一致的应用运行环境,减少了很多不确定性。

不过相对 VM 来说,Docker 容器的隔离性和安全性还是有差距的。

注:keynote中图片部分来源于网络