Docker 构建镜像并利用宿主机上的 Docker 引擎来运行容器。虽然我们在日常工作中常将这两个术语放在一起使用,但理解 镜像(即蓝图)与 容器(即运行实例)之间清晰的界限,是掌握 Docker 的基石。
一个 Docker 镜像 是一个只读的模板,其中包含了一套用于创建 Docker 容器的指令。这就好比面向对象编程(OOP)中的“类”——这是一个蓝图,我们可以基于它创建多个“对象”(即容器)。
与作为单个文件存在的虚拟机快照不同,Docker 镜像是由一系列只读层构建而成的。Dockerfile 中的每一条指令都会向镜像中添加一个新的层。
镜像的关键特性:
- 不可变性: 镜像一旦构建完成,就无法再被更改。如果你需要修改应用程序代码或更新依赖项,就必须构建一个新的镜像。这种不可变性保证了环境的一致性。
- 可移植性: 因为镜像本身就包含了应用程序代码、运行时、库以及环境变量,所以它在任何安装了 Docker 的机器上都能以完全相同的方式运行。这就完美解决了令人头疼的“在我机器上能跑”的问题。
- 可共享性: 我们可以将镜像推送到像 Docker Hub 这样的中央注册中心,让全球各地的团队都能使用完全相同的开发、测试和生产环境。
Docker 容器
一个 Docker 容器 是 Docker 镜像的一个可运行实例。如果说镜像是房屋的设计蓝图,那么容器就是依据那张蓝图建造出来的实体房屋。
当我们启动一个容器时,Docker 会获取只读镜像,并在其顶部添加一个临时的、薄的 读-写层。在运行容器期间所做的任何更改——比如创建新文件、修改日志或安装临时包——都发生在这个顶部的读-写层中。
我们可以使用 Docker API 或 CLI 来创建、启动、停止、移动或删除容器。我们还可以将容器连接到一个或多个网络,并为其附加持久化存储(数据卷)。
运行 Docker 容器
docker run --publish 8000:8080
--detach --name alias_name application_name:1.0
在这个例子中,容器内运行在端口 8080 上的应用被连接到了宿主机的 8000 端口。现在,宿主机可以通过 URL localhost:8000 来访问该应用。
Docker 镜像与容器之间的区别
Docker 镜像
—
蓝图(类)
逻辑实体;只读模板。
不可变。构建后无法更改。
存储时仅占用磁盘空间(不消耗 CPU/RAM)。
通过构建 Dockerfile 创建。
docker run 命令运行镜像来创建。 可以推送到 Docker Hub 并从中拉取。
由多个只读层组成。
无法连接或进入镜像。
可以独立于容器存在。
Docker 容器与虚拟机镜像的区别
虚拟机镜像
—
虚拟机镜像启动需要几分钟。
虚拟机镜像的资源占用非常密集。
隔离是在操作系统级别进行的。
虚拟机镜像在系统级别管理依赖项。