Docker 完全指南

来源:21CTO
ID:www_21cto_com
Docker 作为新瓶装旧酒的一门技术,用简单便捷的操作极大改变了软件开发的流程与生态环境,本文我们就来了解一下 。注:Docker 目前已改名为 Moby 。
更新历史

  • 2017.05.01: 完成初稿
 
快速入门
  • Docker 最初 dotCloud 公司内部的一个业余项目
  • Docker 基于 Go 语言
  • Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案
  • Docker 的基础是 linux 容器(LXC)等技术
  • Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多
  • Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器
 
下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现 。
Docker 完全指南

文章插图
 
 
Docker 完全指南

文章插图
 
 
容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小 。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可 。
主要优势为:
  • 更快速的交付和部署 - 容器成为了最小单位
  • 更高效的虚拟化 - 内核级虚拟化
  • 更轻松的迁移和拓展
  • 更简单的管理
 
安装
官方网站提供了 mac, Linux 和 windows 版本的安装教程 。我们只要跟着官方文档即可,这里不再赘述 。
不过需要提一下 Kitematic 这个图形化工具(官方给出的定义是 Visual Docker Container Management on Mac & Windows),对于熟悉和了解 Docker 是很好的帮助,大家可以体验一下 。
守护进程
运行 Docker 守护进程时,可以用 -H 来改变绑定接口的方式,比如 sudo /usr/bin/docker -d -H tcp://0.0.0.0:2375,如果不想每次都输入这么长的命令,需要加入以下环境变量 export DOCKER_HOST="tcp://0.0.0.0:2375"
图形用户界面
虽然我们可以用命令来控制 docker,但是如果能有一个 web 管理界面,操作什么的会方便很多,比较常见的有
  • Shipyard
  • Potainer
 
基本概念
基本概念主要有三个:
  • 镜像(Image)
  • 一个只读的模板,镜像可以用来创建 Docker 容器
  • 用户基于镜像来运行自己的容器 。镜像是基于 Union 文件系统的层式结构
  • 可以简单创建或更新现有镜像,或者直接下载使用其他人的 。可以理解为生成容器的『源代码』
  • 容器(Container)
  • 容器是从镜像创建的运行实例,在启动的时候创建一层可写层作为最上层(因为镜像是只读的)
  • 可以被启动、开始、停止、删除 。每个容器都是相互隔离的、保证安全的平台
  • 可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序
  • 仓库(Registry)
  • 集中存放镜像文件的场所,可以是公有的,也可以是私有的
  • 最大的公开仓库是 Docker Hub
  • 国内的公开仓库包括 Docker Pool 等
  • 当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了
  • Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务
 
另外 Docker 采用的是客户端/服务器架构,客户端只需要向 Docker 服务器或守护进程发出请求即可完成各类操作 。那么问题来了,我们能用 Docker 来做什么呢?我们可以:
  • 统一、优化和加速本地开发和构建流程
  • 保证不同的环境中可以得到相同的运行结果
  • 创建隔离环境用于测试
 
Docker 可以提供的隔离有:
  • 文件系统隔离:每个容器都有自己的 root 文件系统
  • 进程隔离:每个容器都运行在自己的进程环境中
  • 网络隔离:容器间的虚拟网络接口和 IP 地址都是分开的
  • 资源隔离和分组:使用 cgroups 将 CPU 和内存之类的资源独立分配给每个 Docker 容器
 
常用命令