容器的概念
说到Docker首先要解释的一个概念就是容器。什么是容器(container)?容器技术并不是一个全新的概念,它又称为容器虚拟化。虚拟化技术目前主要有硬件虚拟化、半虚拟化、操作系统虚拟化等。
所谓容器,顾名思义就是来放东西的道具。大可把容器理解为一个沙盒,每个容器是独立的,容器间可以相互通信。
Docker简述
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。
Docker是基于Go语言实现的云开源项目,诞生于2013年初,最初是dotCloud公司发起。
Docker通过对应用组件的封装、分发、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”。这里应用组件,即可以是Web应用,也可以是一套数据库服务,甚至是一个操作系统或编译器。
Docker由镜像(Image)、容器(Container)、仓库(Repository) 三大核心组成。
-
镜像
Docker镜像(image)类似于虚拟机镜像。
例如:一个镜像可以只包含一个完整的Centos操作系统环境,可以把它称为一个Centos镜像,镜像也可以安装了Nginx应用程序(或者用户需要的其他软件),可以把它称为一个Nginx镜像。 -
容器
可以把容器看做是一个简易的Linux系统环境,以及运行在其中的应用程序打包而成的一个箱子。Docker利用容器这个箱子来隔离和运行应用镜像。 -
仓库
Docker仓库(Repostory)类似于代码的仓库。是Docker用来集中存放镜像文件的场所。
资源隔离
容器是如何实现进程、文件、网络等资源的隔离呢?
- Namespace
例如,容器进程启动时,只要启用了 Mount Namespace,并将自己打包的文件系统挂载好,就可以实现每个容器仅看到自己的文件,实现文件资源的隔离。总之,Docker 守护进程创建容器实例时都启用了相应的 Namespace,使得容器中的进程都处于一种隔离的运行环境之中。 - Cgroups
通过 Namespace,容器实现了资源的隔离,从而每个容器看起来都像是拥有自己独立的运行环境。注意,只是看起来。因为容器使用 cpu、内存等并不受限制,假如某个容器占用这些资源过高,就可能会造成其它容器运行迟缓甚至异常,这就需要 Cgroups 了。
cgroups 的全称是 control groups,是 Linux 内核提供的一种可以限制单个进程或者多个进程所使用资源的机制,可以对 cpu,内存等资源实现精细化的控制。
在docker 中,可以使用cgroup为每个进程容器分配不同的系统资源,例如CPU和内存。
网络隔离
每个进程容器运行在自己的网络命名空间里,拥有自己的虚拟接口和IP地址。
在知道docker是什么之后,我们来了解一下怎么使用它。
Docker的安装
-
Docker在Ubuntu上的安装
Ubuntu14.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在CentOS上的安装
CentOS7 系统CentOS-Extras库中已带 Docker,可以直接安装:$ sudo yum install docker
安装之后启动 Docker 服务,并让它随系统启动自动加载。
$ sudo service docker start $ sudo chkconfig docker on
创建镜像
1.基于已有的镜像容器创建
docker commit [options] container[repository]
option:-a, --author=“” 作者信息
-m,--message=“” 提交信息
-p, --pause=true 提交时暂停容器运行
2.基于本地模板导入创建
docker load < ***.tar --本地模板文件tar
3.基于Dockerfile文件构建镜像
docker build –t image-name basedir
创建 |启动容器
docker create image 创建的容器是停止状态
docker start/stopcontainer_id启动/停止容器
docker run image创建并启动容器