---
title:
slug:
description:
creation: 2026-06-17
lastmod: " 2026-06-17"
image: cover.png
math:
license:
hidden: false
draft: false
categories:
tags:
  - docker
  - 镜像
  - 容器
---

# 镜像与容器

## 镜像（Image）

我们可以将容器镜像视为一个单独的包，其中包含运行容器/进程所需的所有内容。在本例中，它将包含 Node 环境、后端代码和已编译的 React 代码。

镜像是一个**只读模板**，其中包含创建 Docker 容器的说明。一旦创建了镜像，无法修改或更改它。只能创建一个新的或者向其中添加额外的层。

镜像由层组成，这些层基本上代表文件系统的变化。每一层代表一组文件系统变更，包括添加、删除或修改文件。

**类比**：
- 镜像 = 类（Class）
- 容器 = 对象（Object）


## 容器（Container）

就像 app 或者软件，实现方式略有不同，但是提供了类似的隔离。我们运行的是数据库、消息队列、网络服务器。

每个容器化的进程都可以在完全独立于其它容器的隔离环境中运行，也独立于主机。

容器是镜像的可运行实例。您可以使用 Docker API 或 CLI 创建、启动、停止、移动或删除容器。

**特点**：
- **自包含**：每个容器都具备其运行所需的一切，无需依赖主机上任何预安装的依赖项。
- **隔离**：由于容器是独立运行的，因此它们对主机和其他容器的影响极小，从而提高了应用程序的安全性。
- **独立**：每个容器均独立管理。删除一个容器不会影响其他容器。
- **可移植**：容器可以在任何地方运行！

## 镜像分层（Image Layers）

镜像中的每一层都包含一系列文件系统更改。让我们来看一个理论上的镜像：
1. 第一层添加了基本命令和包管理器，例如 apt。
2. 第二层安装 Python 运行时和 pip。
3. 第三层复制 requirements.txt。
4. 第四层安装依赖项。
5. 第五层复制源代码。

<img src="https://docs.docker.com/get-started/docker-concepts/building-images/images/container_image_layers.webp" alt="screenshot of the flowchart showing the concept of the image layers" style="zoom:50%;" />

## Dockerfile

`Dockerfile` 是一个基于文本的脚本，它提供了有关如何构建镜像的指令集。

```dockerfile
FROM python:3.13
WORKDIR /usr/local/app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY src ./src
EXPOSE 8080
RUN useradd app
USER app
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]
````

## 构建缓存

当您运行 `docker build` 创建新镜像时，Docker 会检查是否可以重用之前构建的层。有效使用构建缓存可以加快构建速度。

## 手动创建镜像（commit 示例）

通过 commit 可以将容器的更改保存为新的镜像层。更多内容可参见 [[Docker Compose 与多容器管理]] 中的相关实践。

