Docker的基础知识(一)
1.什么是Docker?
Docker是一种更轻量化的方式,使用Docker不需要安装客户OS;
Docker镜像中只隔离并安装服务器运行所需的程序和库文件,与主机共享OS资源,大大减少了镜像的体积。
相对于虚拟机,Docker提供了专门创建并部署镜像的功能和镜像上传和下载(push/pull)的功能。
2.Docker镜像和容器
基础镜像概念:它是指仅Linux发行版userland中安装的文件,一般为Linux发行版本的名称;“Docker镜像”通常是指安装基础镜像所需的程序、库、源代码之后创建的一个文件。
userland:即用户空间;在linux中,用户区是GNU,应用程序驻留在用户区中,而Linux内核(和大多数驱动程序)驻留在内核空间中。
引用:https://www.linux.org/threads/gnu-userland.11066/
Docker镜像:只将基础镜像中变化的部分创建为镜像,运行时将基础镜像与可变部分合并运行;
Docker“层”的概念:Docker不创建整个镜像,只针对变化的部分进行创建,然后继续引用父镜像;
上传和下载镜像是会同时上传/下载子镜像和父镜像,之后只传输内容有变化的镜像。
Docker容器:
Docker容器是处于运行状态的镜像,使用一个镜像可以创建多个容器;
镜像可以理解为可执行.exe文件,容器是进程;
已经运行的容器中,可以将更改的部分创建为镜像。
Dokcer Engine
Dokcer Engine是一个C/S架构的应用程序,主要包含:
- 常驻后台进程Dockerd
- 一个用来和Dockerd交互的REST API Server
- 命令行CLI接口,通过REST API进行交互
Docker 架构
Docker使用C/S架构,Docker客户端和Docker守护进程通信,Docker守护进程负责构建、运行和分发Docker容器;
Docker客户端和守护进程可以在同一个系统上运行,也可以将Docker客户端连接到远程Docker守护进程;Docker客户端和守护进程使用REST API通过UNIX套接字或者网络接口进行通信。
Docker daemon
用来监听Docker API的请求和管理Docker对象,比如镜像、容器、网络等。
Docker Client
是与Docker进行交互最主要的方法,比如可以通过docker run来运行一个容器,然后Docker Client会把命令发送给Docker Daemon。
Docker Registry
用来存储Docker镜像的仓库;默认情况下,我们使用docker pull或者docker run命令,就会从docker镜像仓库中去拉取镜像,使用docker push命令,会将我们构建的镜像推送到对应的镜像仓库中。
Images
镜像,只将基础镜像中变化的部分创建为镜像,运行时将基础镜像与可变部分合并运行。
Containers
容器,容器是一个镜像的可运行的实例,使用Docker REST API或者CLI来操作容器;容器的实质是进程,但与直接在宿主机执行的实例进程不同,容器进程属于自己的独立命名空间。容器可以拥有自己的root文件系统、网络配置、进程空间、用户ID。容器内的经常是运行在一个隔离环境里,使用起来,就好像在一个独立于宿主机的系统下操作一样,使得容器封装的应用比直接在宿主机运行更安全。
Docker核心
Docker namespace
Linux内核2.4.19中开始陆续引用namespace概念。目的是将某个特定的全局系统资源通过抽象的方法使得namespace中的进程看起来拥有它们自己的隔离的全局系统资源实例。
命名空间是Linux内核强大的特性;每个容器都有自己的命名空间,运行在其中的应用都是独立操作系统中运行一样,命名空间保证了容器之间彼此互不影响。
Docker CGroups
Docker Namespace来隔离docker其运行环境,使得容器中的进程看起来就像在一个独立的环境中运行;但仅允许环境隔离不够,因为这些进程是可以不受限制的使用系统资源。
Docker CGroups的目的是为了防止进程占用太多的资源而影响到其他进程;另外,在系统资源耗尽时,Linux内核会触发OOM这会让一些被杀掉的进程无辜死掉;因此为了让容器中的进程更加可控,使用Docker CGroups来限制容器中的进程允许使用的系统资源。
Docker UnionFS
UnionFS可以把文件系统上的多个目录内容联合挂载到同一目录下,而目录的物理位置是分开的。
bootfs: 包含操作系统boot loader和kernel;用户不会修改这个文件系统,一旦启动成功后,整个Linux内核加载进内存,之后bootfs会被卸载,从而释放内存。
rootfs: 包含典型的目录结构(/dev,/bin/,/etc,/usr,/lib,/tmp等);Linux系统在启动时,rootfs首先会被挂载为只读,启动完成后被修改为读写模式。
Dockerfile:
FROM ubuntu:14.04
ADD run.sh /
VOLUME /data
CMD ["./run.sh"]
联合文件系统对应的层次结构:
顶上两层,是Docker为Docker容器新建的内容,二这两层属于容器范畴,分别为docker的初始层init layer和可读可写层read-write layes。
init layer
:
大多是初始化容器环境时,与容器相关的环境信息,如容器主机名、host信息等。
read-write layes
:
docker容器内的进程只对可读可写层拥有写权限,对其他层的进程而言都是只读的。