Docker学习笔记
什么是 Docker
Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 linux 基金会,遵从了 Apache 2.0 协议,项目代码在GitHub上进行维护。
Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。
在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。
为什么要使用 Docker?
首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。 其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。
容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。
更多Docker相关教程见以下内容:
Docker安装应用(CentOS 6.5_x64) http://www.codesec.net/Linux/2014-07/104595.htm
Ubuntu 14.04安装Docker http://www.codesec.net/linux/2014-08/105656.htm
Ubuntu使用VNC运行基于Docker的桌面系统 http://www.codesec.net/Linux/2015-08/121170.htm
阿里云CentOS 6.5 模板上安装 Docker http://www.codesec.net/Linux/2014-11/109107.htm
Ubuntu 15.04下安装Docker http://www.codesec.net/Linux/2015-07/120444.htm
在Ubuntu Trusty 14.04 (LTS) (64-bit)安装Docker http://www.codesec.net/Linux/2014-10/108184.htm
在 Ubuntu 15.04 上如何安装Docker及基本用法 http://www.codesec.net/Linux/2015-09/122885.htm
具体说来,Docker 在如下几个方面具有较大的优势。
1) 更快速的交付和部署
对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
2) 更高效的虚拟化
Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
3) 更轻松的迁移和扩展
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
4) 更简单的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
5) 对比传统虚拟机总结
特性
容器
虚拟机
启动
秒级
分钟级
硬盘使用
一般为 MB
一般为 GB
性能
接近原生
弱于
系统支持量
单机支持上千个容器
一般几十个
Docker安装(Ubuntu 14.04)
1) 通过系统自带包安装
Ubuntu 14.04 版本系统中已经自带了 Docker 包,可以直接安装。
sudo apt-get update
sudo apt-get install -y docker.io
sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io
如果使用操作系统自带包安装 Docker,目前安装的版本是比较旧的 1.0.0。 要安装更新的版本,可以通过使用 Docker 源的方式。之后要讲到的Docker 加速器需要1.3.2版本以上,所以建议直接使用Docker 源的方式安装最新版本。
2)通过Docker源安装最新版本
要安装最新的 Docker 版本,首先需要安装 apt-transport-https 支持,之后通过添加源来安装。
sudo apt-get install apt-transport-https
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
sudo bash -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
sudo apt-get update
sudo apt-get install lxc-docker
Docker 的安装资源文件存放在Amazon S3,会间歇性连接失败。所以安装Docker的时候,会比较慢。你可以通过执行下面的命令,高速安装Docker。
curl -sSL https://get.daocloud.io/docker | sh
适用于Ubuntu,Debian等大部分Linux,会3小时同步一次Docker官方资源。如果安装不成功,可以选择使用二进制包安装方式。下载二进制包
Docker 的三个基本概念
1) 镜像(Image)
Docker 镜像就是一个只读的模板。
例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。
镜像可以用来创建 Docker 容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
2)容器(Container)
Docker 利用容器来运行应用。
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
*注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。
3)仓库(Repository)
仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。当然,用户也可以在本地网络内创建一个私有仓库。当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上pull下来就可以了。
*注:Docker 仓库的概念跟Git类似,注册服务器可以理解为 GitHub 这样的托管服务。
Docker 加速器
由于国内网络问题的限制,你要从 Docker Hub 上下载一个镜像,非常慢,可能要等半天。国内就有公司(DaoCloud)推出了Docker 加速器(即Docker Hub Mirror服务),要使用该加速器,需要去DaoCloud注册一个帐号,得到相应的加速器地址。配置Docker加速器命令如下:
echo "DOCKER_OPTS=\"\$DOCKER_OPTS --registry-mirror=http://×××××.m.daocloud.io\"" | sudo tee -a /etc/default/docker
sudo service docker restart
该脚本可以将--registry-mirror加入到你的Docker配置文件/etc/default/docker中。适用于Ubuntu14.04,其他版本可能有细微不同。其中×××××需要替换为你自己的地址。
尝试去拉镜像会发现速度变快很多:
docker pull ubuntu:14.04
Mirror是Docker的官方机制,它是Registry的一种特殊类型,在部署了Registry之后,需要开启Mirror模式并做一定的配置。具体的流程如下:
Docker Hub 由 Index 和 Registry 构成,Index 保存 Image Layer 的 hash 和关联关系等元数据(Metadata),Registry 用于存储 Image Layer 的实际二进制数据。在客户端没有配置 registry-mirror 参数的情况下,每一次docker pull,客户端都会先连接 Index 获取元数据,然后再连接 Registry 获取实际的 Image 文件。由于Docker Hub 的 Index 节点和 Regsitry 都部署国外,国内用户访问,经常遭遇连接超时或中断的情况,下载速度也极其缓慢。在启用了Mirror 之后,访问流程如下:
客户端的 Docker Daemon 连接 Index 获取 Metadata,这一部分的数据量极小,直连国外的速度可以忍受。
根据 Metadata 的信息,Docker Daemon 与 Mirror 服务器建立连接。如果 pull 的 Image 在 Mirror 上已经有缓存,就直接在 Mirror 上返回地址并下载。
如果 Image 在 Mirror 并无缓存,Mirror 会与 Docker Hub Registry 建立连接,下载 Image,提供给用户的同时,在本地缓存。
Mirror 下载 Docker Hub Image 采用 stream 的方式,即可以一边下载,一边提供给客户端的 Docker Daemon,不必等Image完全下载完。
通过以上的描述,可以发现,对于常用的 Image,Mirror 缓存命中率会非常高,如 Ubuntu 等基础 Image,这会极大提高下载速度。同时,Docker Image 采用分层的结构,即使 Image 被更新,也只是下载最新一层非常少的增量数据。
Mirror 服务亦可以通过网络优化,加速对远端 Docker Hub Registry 的访问速度,如采用高速的商业 VPN 建立从 Mirror 到 Docker Hub Registry 的访问。