docker简介
一、docker是什么?
docker是一个开源的应用容器引擎
Docker是基于Google公司推出的Golang语言开发而来,基于Linux内核的Cgroups、NameSpace,以及Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。
最初的docker 是基于LXC的,后来转为自研的Libcontainer
二、容器和虚拟机的区别
容器没有自己的内核,它的应用程序直接运行在宿主机的内核上。他只是划分出一块块独立的空间,这些空间里运行的环境互不影响。
虚拟化是虚拟出一个完整的操作系统,然后在操作系统内运行自己的程序
容器共享主机内核,无法像虚拟机一样实现完全隔离,容器的大小比虚拟机要小很多,非常轻巧启动迅速
三、为什么要用docker
1. 更高效的利用
容器不需要进行硬件虚拟化及运行一个完整操作系统的额外开销,docker对系统的资源利用率更高
2. 更快的启动时间
传统的虚拟机启动时间比docker更久,docker容器启动的时候无须启动一个完整的操作系统,启动更快,大大的解决部署的时间
3. 一致的环境
通过dockerfile来构建镜像,开发所需要的环境都集成在容器中,无须考虑环境不一致带来的问题,方便团队更加快速的部署
4. 更轻松的迁移
docker可以在很多个平台运行,无论是win linux 虚拟机 云平台等等,都可以轻松迁移到一个新的环境,无须担心由于环境问题导致程序无法运行
四. docker的架构
docker使用的是c/s架构,客户端和服务端可以运行在同一台机器上,客户端与服务器端通信使用REST API
Docker Daemon
docker的守护进程监听docker api请求管理docker对象,如:
- 镜像(images)
- 容器(containers)
- 网络(networks)
- 卷(volumes)
一个守护进程也可以与其它守护进程通讯来管理docker服务
Docker Client
docker客户端使用docker api与守护进程进行通讯
Docker registries
docker仓库用来存储docker镜像,docker hub是任何人都可以访问的公共仓库,docker默认从公共的仓库中拉取镜像
Images
镜像是只读的模板,通过镜像基于另外一个镜像,并且进行一些额外的自定义。
例如:构建一个centos的镜像,但是可以安装nginx,创建属于自己镜像
要构建自己的镜像,需要使用dockerfile来构建自己的镜像。dockerfile中的每条指令都会在镜像中创建一层,更改dockerfile重建镜像时,仅重建已更改的图层
Containers
容器时镜像的可运行实例,我们可以通过Docker API或者CLI创建、启动、停止、移动、删除容器,也可以将容器连接到一个或者多个网络,将存储连接到容器,甚至可以基于容器的当前状态创建镜像
容器删除后,未存储在持久化存储中数据的任何更改都会消失
容器创建的过程
- 获取镜像,使用docker pull,从仓库拉取镜像,使用镜像创建容器
- docker将读写文件系统分配给容器,作为容器的最后一层,这允许正在运行的容器在本地文件系统中创建修改文件和目录
- docker创建一个网络接口将容器连接到默认网络,为容器分配地址,默认情况下容器可以使用主机的网络连接到外部网络
- docker启动容器并执行/bin/bash,如果没有前台进程使其夯住,容器将停止