容器并不是新概念。几十年来,UNIX 系统一直以 chroot 命令来提供简单的文件系统隔 离。自 1998 年起,FreeBSD 有了jail 命令,它把chroot 的沙盒机制扩展至进程。2001 年 左右,Solaris Zones 提供了一个相对完整的容器化技术,但它只能用于 Solaris 操作系统。 同样在2001 年,Parallels 公司(当时称为SWsoft)推出用于Linux 的商业容器技术,名 为 Virtuozzo,并于 2005 年把核心技术开源,称其为 OpenVZ。3 然后,谷歌开始为 Linux 内核开发CGroups 机制,并开始将它的基础设施容器化。2008 年,Linux 容器(Linux Containers,LXC)项目启动,它把 CGroups、内核命名空间以及 chroot 等技术融合,提供 了一套完整的容器方案。最后,Docker 于 2013 年补充了当时容器化技术的不足,将容器 技术带入主流。
Docker 利用现有的 Linux 容器技术,以不同方式将其封装及扩展——主要是通过提供可移植的 镜像,以及一个用户友好的接口——来创建一套完整的容器创建及发布方案。Docker 平台拥有 两个不同部分:负责创建与运行容器的 Docker 引擎,以及用来发布容器的云服务 Docker Hub。
Docker 引擎提供了一个快速且便捷的接口用来运行容器。在此之前,使用如 LXC 等技术 运行容器需要相当多的专业知识以及手动操作。Docker Hub 提供大量的公共容器镜像以供 下载,方便用户快速上手,并且避免了重复劳动。Docker 还进一步开发了更多的工具,如 集群管理工具 Swarm、用于处理容器的图形用户界面 Kitematic,以及部署 Docker 主机的 命令行工具 Machine。
==============================================
chroot命令用来在指定的根目录下运行指令。chroot,即 change root directory (更改 root 目录)。在 linux 系统中,系统默认的目录结构都是以/
,即是以根 (root) 开始的。而在使用 chroot 之后,系统的目录结构将以指定的位置作为/
位置。
==================
LXC 以及联合文件系统(ofilee)
LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。
联合文件系统
联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。
联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
另外,不同 Docker 容器就可以共享一些基础的文件系统层,同时再加上自己独有的改动层,大大提高了存储的效率。
Docker 中使用的 AUFS(AnotherUnionFS)就是一种联合文件系统。 AUFS 支持为每一个成员目录(类似 Git 的分支)设定只读(readonly)、读写(readwrite)和写出(whiteout-able)权限, 同时 AUFS 里有一个类似分层的概念, 对只读权限的分支可以逻辑上进行增量地修改(不影响只读部分的)。
Docker 目前支持的联合文件系统种类包括 AUFS, btrfs, vfs 和 DeviceMapper。
==============================================
===========================================================
Docker集群管理工具
通用的容器格式与运行环境的标准
=============================================
稳定且生产就绪的容器引擎
容器的服务编排和网络连接
===================================
系统架构可以通过执行uname -m查询
可以通过http://get.docker.com提供的脚本来安装Docker
执行curl -sSL | sh 或wget -q0- |sh就可以了
wget 是一个从网络上自动下载文件的自由工具,支持通过 HTTP、HTTPS、FTP 三个最常见的 TCP/IP协议 下载,并可以使用 HTTP 代理。
============================================
查看SELinux处于什么模式,可以通过执行sestatus命令的结果查看
=========================================
不使用sudo命令执行docker
一个可行的解决方法是把用户放进 docker 用户组
sudo usermod -aG docker $USER
============================================
debian参数是我们打算使用的镜像
请求docker提供一个容器中的shell
docker run -i -t debian /bin/shell
-i -t参数表示我们想要一个附有tty的交互会话
/bin/bash参数表示你想获得一个bash shell.
当你退出shell时,容器就会停止
========================================
我们打算将一个名为cowsay的应用docker化。
首先启动一个容器,并安装一些包
docker run -it --name cowsay --hostname cowsay debian bash
执行docker commit时,你需要提供的参数包括:
容器的名称cowsay,新镜像的名称cowsayimage,用来存放镜像的仓库名称test
现在,我们创建了一个能随时使用,并且已安装cowsay的镜像
docker run test/cowsayimage /usr/games/cowsay "Moo"
=============================================================
Docker的镜像由多个不同的“层”组成
当一个镜像被转化成一个容器时,docker引擎会在镜像之上添加一个处于最上层的可读写文件系统