Hexo

Docker 基础知识

2019-04-06

概论

Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

Docker 使用 C/S 架构,使用远程 API 来管理和创建 Docker 容器。Docker 容器通过 Docker 镜像来创建。容器和镜像的关系有点类似于面向对象中的对象与类。

和虚拟机的差别

Docker 可以简单理解为一个轻量级的虚拟机,但实际上 Docker 和虚拟机的差别是很大的。

虚拟机架构

图0:[外文翻译]虚拟机与Docker有何不同?

Guest OS 是为虚拟机安装的操作系统,是一个完整的操作系统内核。Hypervisor 层可以理解为一个硬件虚拟化平台,在 Host OS 是以内核态的驱动存在的。

虚拟机实现资源隔离是利用独立的 OS,并且利用 Hypervisor 虚拟化 CPU、内存、I/O 设备。Hypervisor会为每个虚拟的CPU创建一个数据结构,模拟CPU的全部寄存器的值,在适当的时候跟踪并修改这些值。需要指出的是在大多数情况下,虚拟机软件代码是直接跑在硬件上的,而不需要Hypervisor介入。只有在一些权限高的请求下,Guest OS需要运行内核态修改CPU的寄存器数据,Hypervisor会介入,修改并维护虚拟的CPU状态。

Hypersivor 实现内存虚拟化是创建一个 shadow page table。正常情况下页表实现虚拟内存到物理内存的翻译。在虚拟化的情况下,物理内存仍然是虚拟的,所以需要 shadow table 来实现 虚拟内存 - 虚拟的物理内存 - 真实的物理内存的转化。

对于 I/O 设备虚拟化,也是使用软件模拟的。比如虚拟机写文件时候,实际是写入一个 HOST OS 的文件上,文件模拟了虚拟的磁盘。

Docker 架构

图1:[外文翻译]虚拟机与Docker有何不同?

Docker Daemon 是对 Linux NameSpace、Cgroup、镜像管理文件系统的封装。没有利用一个独立的 Guest OS 实现环境隔离,而是利用 Linux 内核本身支持的容器方式实现资源和环境隔离。

Linux NameSpace 负责实现环境隔离Cgroup 负责实现资源限制;利用镜像实现根目录环境隔离。

总结

  • Docker 速度更快,占用资源更少
  • 虚拟机隔离性强于 Docker,Docker 主要是进程级别的隔离,一旦 Docker 中进程取得了 root 权限,实际上也就是获得了宿主机的 root 权限,进而就可以破坏隔离性。
  • 虚拟机可以通过镜像实现环境交付的一致性,但是镜像分发无法体系化;Docker 在 Dockerfile 中记录了容器的构建过程,在集群中可以实现快速分发和快速部署。

使用的几个例子

1
docker run ubuntu:15.10 /bin/echo "Hello, world"

Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器中执行 echo 命令。

1
docker run -i -t ubuntu:15.10 /bin/bash

参数:

  • -t 表示在容器中指定一个伪终端/中断
  • -i 允许对容器内的标准输入进行交互
1
docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo 'hello'; sleep 1; done"

-d 表示运行在后台,命令会返回一个长字符串(容器的 ID),可以通过 docker ps 来查看当前运行的容器。

使用docker logs docker_id可以查看后台运行的 docker 的输出。

可以使用docker stop 来停止容器运行

参考

  1. Docker 与虚拟机简介以及比较
  2. 虚拟机与 Docker 有何不同
  3. 菜鸟教程
Tags: docker

扫描二维码,分享此文章