Docker 的概念和理解

Docker 容器和虚拟机的区别

  • 虚拟机需要安装Guest OS。如果运行多个虚拟机,需要安装多个Guest OS。比较浪费存储资源。
  • Docker运行的机器不用安装多个Guest OS,Docker container的容器其实还是主机的操作系统上运行。
  • 虚拟机启动需要经历安装的操作系统启动过程,启动比较缓慢。
  • Docker容器的启动仅仅是启动一个在宿主机运行的进程,启动非常快速。
  • 虚拟机可以实现完全彻底的资源隔离(CPU,内存,磁盘和网络)。但是未使用的资源也不会被其他虚拟机使用,存在一定的资源浪费。
  • Docker使用namespace实现资源的隔离,但不是真正的资源物理隔离。资源隔离没有使用虚拟机彻底。但是资源利用率高。
  • 虚拟机每个Guest OS都有一套独立的内核和程序库。可以在不同虚拟机中运行多个完全不同的系统和软件环境。但是虚拟机占用资源较高。
  • Docker和宿主系统共用一个内核和应用程序库。占用资源少,同样资源机器可运行的容器数远大于可运行的虚拟机数量。

Docker联合文件系统AUFS

AUFS全称为Another Union File System。是一种联合文件系统。它可以把不同物理位置的文件合并mount到同一个目录。

Docker镜像为分层结构,任何对镜像的修改都是创建一个新层,新层中保存了镜像的修改内容。最后,将这个新层,连同之前所有的分层一起,保存为新的镜像。

AUFS将这些层挂载到同一个目的地,于是在使用Docker时候,我们看到的是这些分层合并后的结果。

不建议自己创建的Docker镜像存在过多不必要的分层。镜像最多为127层,超过这个层数为会出现问题。过多的分层会占用过多的存储空间,减慢镜像加载的速度。

Docker如何隔离资源

使用cgroup限制容器资源的使用。
使用内核的namespace进行运行环境的隔离。

  • Mount Namespace:每个容器能看到不同的文件系统层次结构
  • UTS Namespace:每个容器可以有自己的 hostname 和 domainame
  • IPC Namespace:每个容器有其自己的 System V IPC 和 POSIX 消息队列文件系统,因此,只有在同一个 IPC namespace 的进程之间才能互相通信
  • PID Namespace:每个 PID namespace 中的进程可以有其独立的 PID; 每个容器可以有其 PID 为 1 的root 进程;也使得容器可以在不同的 host 之间迁移,因为 namespace 中的进程 ID 和 host 无关了。这也使得容器中的每个进程有两个PID:容器中的 PID 和 host 上的 PID。
  • Network Namespace:每个容器用有其独立的网络设备,IP 地址,IP 路由表,/proc/net 目录,端口号等等。这也使得一个 host 上多个容器内的同一个应用都绑定到各自容器的 80 端口上。
  • User Namespace:在 user namespace 中的进程的用户和组 ID 可以和在 host 上不同;每个 container 可以有不同的 user 和 group id;一个 host 上的非特权用户可以成为 user namespace 中的特权用户。

Docker的相关概念

Image

类似于虚拟机的快照。容器中运行时需要的文件都需要储存在Image中。运行时Docker会读取所有层的内容生成一个文件系统,同时在最上层创建一个可写层。在运行时这个可写层可以保存数据,但是停止运行的时,这个可写层的内容会被销毁。每次从Image启动一个container都是一个“干净”的运行环境。

Container

Container是Docker的运行实例。可以从一个Image运行产生多个Docker container(这些container之间没有任何关系)。Container是可以读写的,但是任何修改的内容都是临时的,不会保存在Image中。

Network

默认来说即便是同一个Docker Daemon下运行的container之间的网络也是互相隔离的。用户可以创建一个或多个network,并分配给container。通过这种方式可以控制哪些container之间的网络是互通的。

Volume

Volume是Docker的数据卷。可以持久化保存container中生成的数据。即便是container被销毁有重建,volume中的数据也不会丢失。

Dockerfile

Dockerfile用于创建Docker Image。Dockerfile描述了Image文件构建的步骤,内容包含基于哪个Image,构建时需要执行什么命令,以及启动container时候的入口命令等。

你可能感兴趣的:(Docker 的概念和理解)