什么是 Docker?一文帮你讲透,小白也适用!

嗨,你好呀,我是猿java

1. 什么是 Docker?

Docker是什么?先让我们看看官方是如何介绍自己的,如下图:

img.png

通过官方文档可以总结出:Docker是加快构建、共享和运行应用程序的方式,它可帮助开发人员随时随地构建、共享、运行和验证应用程序,而无需繁琐的环境配置或管理。

2. Docker做了什么?

那么,docker镜像中包含哪些信息呢?

我们可以使用 docker inspect 命令:

1
docker inspect <IMAGE ID>

这个命令提供了关于镜像的详细 JSON 格式的元数据。
运行命令:docker inspect :
这会输出镜像的详细信息,包括其配置、环境变量、入口点等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
➜  ~ docker inspect 0914a9c5da33
[
{
"Id": "sha256:0914a9c5da3334670397105c2d6e5b89891c1035cc830a6fba9c69dc98c631fd",
"RepoTags": [
"yuanjava:1.0",
"yuanjava/yuanjava:1.0"
],
"RepoDigests": [
"yuanjava/yuanjava@sha256:c8639a339717eca9b2efa15874f8db5d24e0e4873e4499438792a787a7702d18"
],
"Parent": "",
"Comment": "buildkit.dockerfile.v0",
"Created": "2024-11-20T09:45:54.729042925Z",
"Container": "",
"ContainerConfig": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": null,
"Cmd": null,
"Image": "",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": null
},
"DockerVersion": "",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/openjdk-17/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"JAVA_HOME=/usr/local/openjdk-17",
"LANG=C.UTF-8",
"JAVA_VERSION=17.0.2"
],
"Cmd": null,
"Image": "",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": [
"java",
"-jar",
"/app.jar"
],
"OnBuild": null,
"Labels": null
},
"Architecture": "arm64",
"Variant": "v8",
"Os": "linux",
"Size": 444002525,
"VirtualSize": 444002525,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/86c8986f450e1b62bcf98a641849d1229766a871163b14078296f1ea33dd0f08/diff:/var/lib/docker/overlay2/529d3366ff778dc47745b488727f7819c0625f8f6dd462a1bc198b9804f39e94/diff:/var/lib/docker/overlay2/b00a5b320e9d2be01951c65fb828e9af3af401a28b5ede8852d984d3934faa04/diff",
"MergedDir": "/var/lib/docker/overlay2/fwt0ql0vtscsbdqvrjmoreust/merged",
"UpperDir": "/var/lib/docker/overlay2/fwt0ql0vtscsbdqvrjmoreust/diff",
"WorkDir": "/var/lib/docker/overlay2/fwt0ql0vtscsbdqvrjmoreust/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:f941f90e71a87df1d35c7a66a72fd3dda2c2884e1ad190da978321d548db23e2",
"sha256:2f263e87cb115336990db64a3be249209e30c070bfa33be47dca80928e4f0ec6",
"sha256:c82e5bf37b8a21c2e681da6e397fbb4f8095b3864cbad8d2a73f5ad2f69b6ff2",
"sha256:edd788d7b54a81ccc062640779e801f2f772f406b5ae2837e9754fbb6feddd64"
]
},
"Metadata": {
"LastTagTime": "2024-11-20T13:42:11.685226879Z"
}
}
]

docker和虚拟机的区别

Docker 容器和虚拟机(VM)都是用于隔离和管理计算资源的技术,但它们在实现方式和使用场景上有显著的区别:

  1. 架构层次:

    • Docker 容器: 容器是在操作系统层面上进行虚拟化。它们共享主机操作系统的内核,但在用户空间上是隔离的。这种方式使得容器启动速度快,占用资源少。
    • 虚拟机: 虚拟机是在硬件层面上进行虚拟化。每个虚拟机都运行一个完整的操作系统,包括自己的内核。虚拟机通过一个称为 Hypervisor 的软件层来管理,这使得它们更重且启动时间更长。
  2. 资源利用:

    • Docker 容器: 由于共享主机操作系统的内核,容器的资源利用更高效,通常占用更少的内存和存储空间。
    • 虚拟机: 由于每个虚拟机运行一个完整的操作系统,它们通常需要更多的资源,包括更多的内存和存储空间。
  3. 启动时间:

    • Docker 容器: 容器可以在几秒钟内启动,因为它们不需要启动完整的操作系统。
    • 虚拟机: 启动时间较长,因为需要启动完整的操作系统。
  4. 隔离性:

    • Docker 容器: 提供进程级别的隔离,虽然隔离性较好,但不如虚拟机。适合于需要快速启动和高密度部署的应用场景。
    • 虚拟机: 提供更强的隔离,因为每个虚拟机有自己的操作系统实例。因此,它们适合于需要更高安全性和隔离性的场景。
  5. 可移植性:

    • Docker 容器: 由于容器打包了应用程序及其所有依赖项,可以在任何支持 Docker 的环境中运行,从而提供了很高的可移植性。
    • 虚拟机: 虽然也具有一定的可移植性,但由于其体积较大,迁移和复制的成本更高。
  6. 使用场景:

    • Docker 容器: 适用于微服务架构、持续集成/持续部署 (CI/CD)、开发和测试环境等。
    • 虚拟机: 适用于需要完整操作系统环境的传统应用、运行多个不同操作系统的场景等。

总结来说,Docker 容器和虚拟机各有优缺点,选择使用哪种技术取决于具体的应用需求和环境要求。容器更轻量级,适合现代化的应用开发和部署,而虚拟机提供更强的隔离性和兼容性。

7. 交流学习

最后,把猿哥的座右铭送给你:投资自己才是最大的财富。 如果你觉得文章有帮助,请帮忙转发给更多的好友,或关注公众号:猿java,持续输出硬核文章。

drawing