docker运行容器需要本地存在对应的镜像,如果本地不存在该镜像,docker会从镜像仓库下载该镜像
docker镜像是怎么实现增量的修改和维护的?
每个镜像都由很多层次构成,docker使用Union FS将这些不同的层结合到一个镜像中去
通常UnionFS有两个用户,一方面可以实现不借助LVM、RAID将多个disk挂到同一个目录下,另一个更常用的就是将一个只读的分支和一个可写的分支联合在一起,Live CD正是基于此方法可以允许在镜像不变的基础上允许用户在其上进行一些写操作
docker在OverlayFS上构建的容器也是利用了类似的原理
从docker镜像仓库获取镜像的命令是docker pull,其格式为:
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
docker使用google公司推出的GO语言进行开发实现
基于linux内核的cgroup、namespace,以及OverlayFS类的UnionFS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术
由于隔离的进程独立于宿主和其他隔离的进程,因此称其为容器。
gopackage main // 指定当前源文件所在的包名
import "math/rand" // 引入一个标准库包
const MaxRand = 16 // 声明一个具名整型常量
// 一个函数声明
/*
StatRandomNumbers生成一些不大于MaxRand的非负
随机整数,并统计和返回小于和大于MaxRand/2的随机数
个数。输入参数numRands指定了要生成的随机数的总数。
*/
func StatRandomNumbers(numRands int) (int, int) {
// 声明了两个变量(类型都为int,初始值都为0)
// 内置基本类型int
var a, b int
// 一个for循环代码块
for i := 0; i < numRands; i++ {
// 一个if-else条件控制代码块
if rand.Intn(MaxRand) < MaxRand/2 {
a = a + 1
} else {
b++ // 等价于:b = b + 1
}
}
return a, b // 此函数返回两个结果
}
// main函数,或主函数,是一个程序的入口函数。
func main() {
var num = 100
// 调用上面声明的StatRandomNumbers函数,
// 并将结果赋给使用短声明语句声明的两个变量。
x, y := StatRandomNumbers(num)
// 调用两个内置函数(print和println)。
print("Result: ", x, " + ", y, " = ", num, "? ")
println(x+y == num)
}