Docker容器

Docker基础修炼2--Docker镜像原理及常用命令

本文主要是介绍Docker基础修炼2--Docker镜像原理及常用命令,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

通过前文的讲解对Docker有了基本认识之后,我们开始进入实战操作,本文先演示Docker三要素之镜像原理和相关命令。

本文的演示环境仍然沿用上一篇文章在本地Centos7中安装的环境,如果你本地没有搭建Docker环境,也可以直接使用前文提到的Docker练习场(play-with-docker)在线进行练习。

在正式开始之前,我们先回顾下几个常用的命令,尤其是Docker帮助命令是掌握众多命令的万能钥匙,一定要多用。

一、Docker帮助命令

1.1 查看Docker版本命令

查看Doceker版本信息可以使用docker version命令或-v参数(–version),其中-v参数是–version的缩写。

docker -v

[root@docker ~]# docker -v
Docker version 19.03.6, build 369ce74a3c

docker --version

[root@docker ~]# docker --version
Docker version 19.03.6, build 369ce74a3c

docker version

[root@docker ~]# docker version
Client: Docker Engine - Community
 Version:           19.03.6
 API version:       1.40
 Go version:        go1.12.16
 Git commit:        369ce74a3c
 Built:             Thu Feb 13 01:29:29 2020
 OS/Arch:           linux/amd64
 Experimental:      false
Server: Docker Engine - Community
 Engine:
  Version:          19.03.6
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.16
  Git commit:       369ce74a3c
  Built:            Thu Feb 13 01:28:07 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

1.2 查看Docker详细信息命令

我们还可以使用docker info命令查看docker相关的更广泛的操作系统范围内的信息

docker info

[root@docker ~]# docker info
Client:
 Debug Mode: false
Server:
 Containers: 1
  Running: 0
  Paused: 0
  Stopped: 1
 Images: 1
 Server Version: 19.03.6
 Storage Driver: devicemapper
  Pool Name: docker-253:1-1912367-pool
...省略部分内容
 Docker Root Dir: /var/lib/docker
...省略部分内容
[root@docker ~]#

显示内容太多了,我省略了一部分,其中可以查看容器总数、有多少容器在运行、有多少容器已经停止、镜像总数以及内存、容量等信息。

1.3 万能帮助命令

命令何其多,不一定能全记住,也没必要全记住。就像可以在Linux下可以通过man命令查看各个命令的用法一样,Docker也提供了帮助命令。

docker --help

[root@docker ~]# docker --help
Usage:  docker [OPTIONS] COMMAND
...省略

里边包含了每个命令的各种详细用法,根据需要查询即可。

二、Docker镜像原理

前文已提到Docker三要素:镜像、容器、仓库。镜像是最基础的,就像我们在做面向对象编程开发时写的实体类,只有有了类才能生成实例对象。接下来我们分析下镜像的原理和特点。

2.1 Docker镜像原理及UnionFS

2.1.1 Docker镜像是什么

我们搞技术不像搞数据公式,要明确给事物一个非常严苛的名称。对于一门技术的命名或定义,个人认为只要理解就好,至于名称你可以任意给他取。

我给Docker的定义是***一个轻量级可运行的独立软件包***,只不过这个软件包除了包含我们自己开发的业务代码软件之外,还包含了运行该软件所需的所有环境,也就是他包含了代码、运行时环境、库、配置文件等等软件运行所需的所有内容。

2.1.2 Docker镜像原理

Docker镜像本质就是一个文件,底层依赖于***联合文件系统(UnionFS)***。

  • 什么是UnionFS?

***UnionFS***是一种分层、轻量级、高性能的文件系统,支持对文件系统的修改作为一次提交来层层叠加。这很类似于我们生活中的千层饼或鸡蛋,由蛋黄、蛋清、蛋壳一层一层的最终构成了一个鸡蛋。

  • UnionFS的特性

联合文件系统最大特点就是***分层***和***联合加载***。

在加载时可以一次同时加载多层文件系统,通过联合加载把各层文件系统叠加起来,从外部看只能看到一个文件系统,最终的文件系统保护所有底层的文件和目录。

  • Docker镜像分层结构及加载原理

由于docker镜像底层采用联合文件系统,自然而然docker镜像也是分层的。docker采用的联合文件系统为aufs (advanced multi layered unification filesystem),是一种可堆叠的联合文件系统。

按照docker官网的说法,docker文件系统分为两层:bootfs和rootfs

bootfs层

在这里插入图片描述

bootfs包含了bootloader和linux内核,用户是不能对这层作任何修改的,在内核启动之后,bootfs实际上会unmount掉。

rootfs则包含了一般系统上的常见目录结构,类似于/dev, /proc, /bin等等以及一些基本的文件和命令。

rootfs层

对于linux上不同版本的问题,docker可以同时运行多个rootfs。

在这里插入图片描述

Docker的文件系统是分层的,它的rootfs在mount之后会转为只读模式, Docker在它上面添加一个新的文件系统,来达成它的只读。由于共享一个内核,这也是为什么docker比虚拟机消耗资源更少的根本原因

images层

从下图中,我们能看到多个只读的文件系统,Docker中把他们称为层。image是只读的,container部分则是可写的。如果用户想要修改底层只读层上的文件,这个文件就会被先拷贝到上层,修改后驻留在上层,并屏蔽原有的下层文件。

在这里插入图片描述

container层

最后一部分是容器(container), 容器是可读写的。

在系统启动时,Docker会首先一层一层的加载image,直到最先面的base image,这些image都是只读的。最后,在最上层添加可读写的一个容器, 这里存放着诸如unique id,网络配置之类的信息。

在这里插入图片描述