Docker之路-认识docker
初识docker
Docker 是基于 OS 层的虚拟化技术之上的容器引擎,实现对进程的封装隔离。开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。
Docker为开发人员以及系统管理员提供了一个用于开发、部署、和在容器中运行应用的平台。
使用linux容器来部署应用这种方式称为容器化。
容器并非新的事物(古时候的陶罐也是一种容器,只不过存储的不是application),但是他们(容器)被用于轻松部署应用却很新鲜。
容器化变得越来月流行,应为容器化有太多优点:
- 灵活:即便在复杂的应用也可以被封装
- 轻量:容器通过共享主机内容及资源,减小自己的体重
- 可互换:你可以实时部署更新和升级
- 可移植:
one build,run everywhere!
可以在本地构建、部署到云,并在任何地方运行 - 可伸缩:你可以增加并自动分发容器副本
- 可堆叠:可以垂直地、动态地堆叠服务,即在原有镜像的基础新增功能
docker镜像和容器
docker服务中,有几个概念是需要我们首先理解的,最主要的是镜像images
和容器container
,这2个概念对于初学者来说很容易混淆,理解他们将有助于我们在操作容器时调理清晰。
Docker client
Docker提供给用户的客户端。Docker Client提供给用户一个终端,用户输入Docker提供的命令来管理本地或者远程的服务器。
Docker daemon
Docker服务的守护进程。每台服务器(物理机或虚机)上只要安装了Docker的环境,基本上就跑了一个后台程序Docker Daemon,Docker Daemon会接收Docker Client发过来的指令,并对服务器的进行具体操作。
Docker Registry
这个可认为是Docker Images的仓库,就像git的仓库一样,用来管理Docker镜像的,提供了Docker镜像的上传、下载和浏览等功能,并且提供安全的账号管理可以管理只有自己可见的私人image。
images
一个镜像是一个可执行包,包含了启动一个应用所需要的一切资源,例如:代码,运行时,lib库,环境变量以及配置文件。
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
Docker 镜像不包含任何动态数据,其内容在构建之后也不会被改变。
Docker镜像采用分层存储结构(AUFS)。每一层构建好后就不会在变,一层层构建,前一层是后一层的基础,由多层文件系统联合组成。
Docker 镜像可以传到 Docker Registry,Docker Registry里面可以创建私有或公共仓库,每个仓库可以包含多个标签(Tag),每个标签对应一个镜像。通过这个分层存储与标签管理,Docker 镜像可以像代码一样,非常方便的拉取,在任何 Docker Egnine上运行,带来全新的运维模式。
containers
容器是镜像的运行时实例,一个镜像在运行时在内存中会变成什么样子?它就像一个带状态的镜像或者理解成用户进程。你可以使用docker ps
来查看正在运行的容器列表。
Docker Container是真正跑项目程序、消耗机器资源、提供服务的地方,Docker Container通过Docker Images启动,在Docker Images的基础上运行你需要的代码。
你可以认为Docker Container提供了系统硬件环境,然后使用了Docker Images这些制作好的系统盘,再加上你的项目代码,跑起来就可以提供服务了。
容器的实质是进程
,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。容器销毁,数据随之被删除。任何保存于容器存储层的信息都会随容器删除而丢失。
镜像是容器的基础,每次执行 docker run 的时候都会指定哪个镜像作为容器运行的基础。在运行的容器中做文件修改,然后docker commit,就相当于在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
容器和虚拟机
大家都在说docker轻量,区别于传统的kvm,那么他们究竟有什么不同呢?
容器
在Linux上本地运行,并与其他容器共享主机的内核。它运行一个独立的进程,不占用比其他任何可执行程序更多的内存,使其轻量级。
虚拟机(VM)
运行一个成熟的“guest”操作系统,通过虚拟机监控程序对主机资源进行虚拟访问。通常,vm提供的资源比大多数应用程序所需的要多。
传统的虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需要的应用进程;而容器内的应用进程直接运行与宿主的内核,容器没有自己的内核,也没有硬件虚拟,容器是轻量级的虚拟化技术。
比较下两图的差异,左图虚拟机的Guest OS层和Hypervisor层在docker中被Docker Engine层所替代。
虚拟机的Guest OS即为虚拟机安装的操作系统,它是一个完整操作系统内核;虚拟机的Hypervisor层可以简单理解为一个硬件虚拟化平台,它在Host OS是以内核态的驱动存在的。
虚拟机实现资源隔离的方法是利用独立的OS,并利用Hypervisor虚拟化CPU、内存、IO设备等实现的。 对比虚拟机实现资源和环境隔离的方案,docker就显得简练很多。
docker Engine可以简单看成对Linux的NameSpace、Cgroup、镜像管理文件系统操作的封装。
docker并没有和虚拟机一样利用一个完全独立的Guest OS实现环境隔离,它利用的是目前Linux内核本身支持的容器方式实现资源和环境隔离。
简单的说,docker利用namespace实现系统环境的隔离;利用Cgroup实现资源限制;利用镜像实现根目录环境的隔离。
docker常用指令
## List Docker CLI commands
docker
docker container --help
## Display Docker version and info
docker --version
docker version
docker info
## Execute Docker image
docker run hello-world
## List Docker images
docker image ls
## List Docker containers (running, all, all in quiet mode)
docker container ls
docker container ls --all
docker container ls -aq