Docker 学习篇(三)
1、为什么 Docker 运行起来比虚拟机 VM 快?
在上篇文章,我们用 Docker 运行了 hello-world 程序,其实可以看出,Docker 和虚拟机类似,都是另一种形式的计算机。
但是当我们使用 service docker restart 命令重启 Docker 时,运行起来的速度明显比 VM 虚拟机快的多(Docker 秒级别,虚拟机分钟级别),这是什么原因呢?
首先 po 一张图,这是我查了一些资料,看了一些视频之后的理解。
传统的虚拟机,需要先根据物理机(宿主机)虚拟出一个操作系统,然后在操作系统上完成各种各样的配置,这样并不能充分的利用物理机的性能。
Docker 则是一种操作系统级别的虚拟技术,它运行在操作系统之上的用户空间,Docker 中的所有的容器和物理机共用一个系统内核,容器引擎提供了进程级别的隔离,让每个容器都像运行在单独的系统之上,但是又能够共享很多底层资源。
综上所述, Docker 更为轻量、快速和易于管理。
2、Docker 是如何工作的?
Docker 是一个 Client-Server 结构的系统,当我们执行一条 Docker 命令时,内部的执行流程如下所示(需要配合图2一起看哈):
(1)客户端通过 Socket 与 Docker 内部的后台守护进程建立连接。
(2)客户端将 Docker 命令发送给守护进程。
(3)守护进程接受命令并管理运行在 Docker 中的容器。当我们要运行某个容器时,首先会判断本地是否已经存在这个容器,如果已经存在则直接运行,否则找到镜像,根据镜像生成容器再运行,找镜像会先在本地找,如果本地不存在,才去仓库pull。
3、Docker 常用命令
(1)、帮助命令
1、docker version:验证docker是否安装成功。
2、docker info:显示Docker系统信息,包括镜像数、容器数、使用的仓库hub、可用的内存、宿主机的域名等等。
3、docker --help:当docker命令记不住了,可以使用这个命令打印出docker的所有命令,Commands展示的就是docker的所有命令。
(2)、镜像命令
1、docker images:列出本地的所有镜像。REPOSITORY:镜像名称。
TAG:镜像的版本号,一个镜像可以有多个版本,好比如 redis 有多个版本一样,图中的 latest 表示是最新版本。当我们自己制作镜像时,如果不指定 TAG 的话,Docker 将默认其 TAG 等于 latest。
IMAGE ID:镜像ID。
CREATED:镜像创建时间。
SIZE:镜像大小。
2、docker images -a:列出本地所有的镜像,包含中间镜像层,镜像是分层的,可以把它想象成一个千层饼,一层裹着一层,加上 -a 参数,里层的镜像也能展示出来。
3、docker images -q:只显示镜像ID。docker images -a 和 docker images -q 可以组合成一条命令 docker images -qa,显示所有镜像的镜像ID,后续当我们想要删除多个镜像,可以把 docker images -qa 查出的结果,传给 docker 的 rm 删除命令,就可以实现镜像的批量删除。
4、docker images --digests:显示镜像的摘要信息,我们发现返回结果中多了一个DIGEST,表示镜像的摘要信息。
5、docker images --no-trunc:显示完整的镜像信息,我们发现返回的IMAGE ID不再是截取的。
6、docker search 某个XXX镜像名字:从镜像仓库(http://hub.docker.com或者阿里云)查找某个XXX镜像。
7、docker pull 某个XXX镜像名字:从镜像仓库下载镜像,如果没有指定镜像版本号,默认pull的是latest版本的镜像。
8、docker rmi 某个XXX镜像名字:删除本地一个或多个镜像。
(3)、容器命令
1、docker run -it 镜像ID:新建并启动容器。
2、docker ps:列出所有容器,通过这个命令,我们可以看到容器的状态,UP:表示容器正在运行,DOWN:表示容器启动失败。
3、docker logs 容器ID:查看容器日志。
4、docker inspect 容器ID:查看容器内部细节,结果会返回一大堆json 串,因为我们之前说过容器和镜像都是分层的,类似一个千层饼,一层套一层,而 json 串也是一层套一层,所以返回的是 json 串格式。在讲解数据卷和容器的时候,会更加详细地讲解这个命令。
5、docker stop 容器ID:停止容器运行。
6、docker cp:将容器中的数据拷贝到宿主机上。在下面这种情况下,就我们要把容器停掉,但是它里面产生的数据我们想保留下来,此时就可以用这条命令将重要的数据持久化到宿主机上。
docker cp 10b9a3588:/tmp/yum.log /root,将10b9a3588这个容器tmp目录下的yum.log文件拷贝到主机的root目录下。