Docker属于Linux容器技术的一种封装,提供简单易用的容器使用接口,它是目前最流行的Linux容器解决方案。
Docker使用Go语言进行开发实现,基于Linux内核的cgroup,namespace,以及AUFS类的UnionFS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。
Docker将应用程序与该程序的依赖打包在一个文件里面(镜像)。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。
基于Docker的沙箱环境可以实现轻型隔离,多个容器间不会相互影响。
三个基本概念学习docker,首先需要了解Docker的三个基本概念:
镜像(Image):类似于虚拟机中的镜像,是一个包含有文件系统的面向Docker引擎的只读模板。任何应用程序运行都需要环境,而镜像就是用来提供这种运行环境的。例如一个Ubuntu镜像就是一个包含Ubuntu操作系统环境的模板,同理在该镜像上装上Apache软件,就可以称为Apache镜像。容器(Container):类似于一个轻量级的沙盒,可以将其看作一个极简的Linux系统环境(包括root权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序。Docker引擎利用容器来运行、隔离各个应用。容器是镜像创建的应用实例,可以创建、启动、停止、删除容器,各个容器之间是是相互隔离的,互不影响。注意:镜像本身是只读的,容器从镜像启动时,Docker在镜像的上层创建一个可写层,镜像本身不变。仓库(Repository):类似于代码仓库,这里是镜像仓库,是Docker用来集中存放镜像文件的地方。注意与注册服务器(Registry)的区别:注册服务器是存放仓库的地方,一般会有多个仓库;而仓库是存放镜像的地方,一般每个仓库存放一类镜像,每个镜像利用tag进行区分,比如Ubuntu仓库存放有多个版本(12.04、14.04等)的Ubuntu镜像。Docker和虚拟机有什么区别虚拟机(virtualmachine)是一个运行在宿主机之上的完整的操作系统,比如在Windows系统里面运行Linux系统。VM运行自身操作系统会占用较多的CPU、内存、硬盘资源。虚拟机的启动需要的步骤比较多,所以启动的速度也会比较慢。一句话概括就是:虚拟机是硬件资源的虚拟化,可模拟出一台完整的计算机和操作系统。
Docker的本质是Linux容器,容器不是模拟一个完整的操作系统,而是对进程进行隔离。Docker不同于VM,只包含应用程序以及依赖库,基于libcontainer运行在宿主机上,并处于一个隔离的环境中。这使得Docker相比于虚拟机具有体积小、启动快、资源占用少等特点。一句话概括就是:Docker是操作系统级别的虚拟化环境。
Docker容器本身几乎没有什么开销,但是使用AUFS会一定的性能损耗。Docker的NAT在较高网络数据传输中会引入较大的工作负载,带来额外的开销。不过container的性能与native相差不多,各方面的性能都一般等于或者优于虚拟机。
Docker和虚拟机在IO密集的应用中都需要调整优化以更好的支持IO操作,两者在IO密集型的应用中都应该谨慎使用。
Docker的基本架构Docker主要采用CS架构,主要由下面三部分组成:
docker命令行工具(Dockerclient):是用户使用Docker的主要方式,与Dockerdaemon通信并将结果返回给用户,Dockerclient也可以通过socket或者RESTfulapi访问远程的Dockerdaemon。
docker守护进程(Dockerdaemon):运行在宿主机上,管理宿主机上的镜像和容器相关操作。
docker仓库(Dockerhub/registry):共享和管理Docker镜像,用户可以上传或者下载上面的镜像。
Docker常用操作指令docker的安装相对简单,按照官方文档即可非常快速的安装好,这里主要介绍一些常用的docker指令,方便日后查询备用。
镜像管理指令通常我们安装完docker第一步需要做的就是查看docker的一些基本信息,比如版本号等,我们就可以使用下面的基本信息查询指令。
#查看当前Docker的版本dockerversion#查看当前系统Docker信息dockerinfo
想要查看本地下载好的镜像文件,我们可以使用下面的指令。
dockerimages
想要管理docker镜像的下载、发布和删除,可以使用下面一些常用指令。
#从Dockerhub上下载镜像,image_tag可以不指定,默认为最新版本dockerpullimage_name:image_tag#从私有Registry中下载镜像dockerpullregistry_deamon/image_name:image_tag#发布docker镜像到Dockerhubdockerpushimage_name:image_tag#发布镜像到私有Registrydockerpushregistry_deamon/image_name:image_tag#删除镜像dockerrmiimage_id/image_name容器管理指令
说完镜像操作,我们再来看看docker容器的一些常用操作。想要查看容器的运行情况和其他详情细节,可以使用下面的一些容器查看指令。
#查看当前有哪些容器正在运行dockerps#列出所有的容器,包含停止运行dockerps-a#查看容器内部详情细节dockerinspectcontainer_id/container_name
初始化启动一个容器:
#启动一个容器dockerrun-i-tubuntu/bin/bash#--name指定容器的名称,否则会随机分配一个名称dockerrun-t-i--nametest_containerubuntu/bin/bash#-v绑定挂在一个Volume,在宿主机和Docker容器中共享文件或目录dockerrun-t-i-v/host:/containerubuntu/bin/bash
查看容器产生的一些日志。
#查看容器全部日志dockerlogscontainer_id/container_name#实时查看日志输出dockerlogs-fcontainer_id/container_name
容器的启动、停止、杀死、重启、删除。
#启动容器dockerstartcontainer_id/container_name#停止容器dockerstopcontainer_id/container_name#杀死容器dockerkillcontainer_id/container_name#重启容器dockerrestartcontainer_id/container_name#删除容器dockerrmcontainer_id/container_name
有时我们对一个容器做了一些变动,想要把这个变动的容器输出成为我们自己定制的镜像应该怎么做呢?
docker