Docker快速入门——第二章Docker基本概念
第一章传送:Docker快速入门——第一章Docker入门
Docker 镜像
1.什么是Docker镜像
Docker 镜像(Images) 是一个只读模板,用于创建Docker容器(Container)它包含了运行某一个应用程序所需的一切:
- 操作系统基础(如Ubuntu、Alpine)
- 运行时环境(如Python、Node.js、Java)
- 应用代码
- 依赖库、配置文件等
“📌类比理解:
镜像(Image) ≈ 类(Class)
容器(Container) ≈ 对象(Instance)
你可以用同一个镜像启动多个容器,就像用一个类创建多个对象。”
2.Docker镜像的核心特点
只读性 | 镜像本身不可修改,确保一致性与可重现性 |
分层结构(Layered) | 镜像由多个只读层(layers)叠加而成,每一层代表一个文件系统变更 |
写时复制(Copy-on-Write) | 容器启动时,在镜像顶部添加一个可写层,只有修改文件时才复制到该层 |
轻量 & 高效 | 多个镜像可共享相同的基础层,节省磁盘和网络带宽 |
可移植 | 镜像可在任何安装了 Docker 的环境中运行(“Build once, run anywhere”) |
3.镜像的分层结构(Layering)
Docker 镜像不是单一的“大文件”,而是由多个只读层(Layers) 按顺序叠加而成。
每一层代表文件系统的一次变更(change),比如安装一个软件、复制一个文件、设置环境变量等。每一层都是只读的,层与层之间是增量存储(只记录变化),多个镜像可以共享相同的底层(如基础操作系统层)
Docker 镜像 = 一个“透明的三明治”
假设你要做一个三明治:最底层:一片面包(基础操作系统,比如 Ubuntu)
中间层:涂上花生酱(安装 Python)
再上一层:放上果酱(安装 Flask 框架)
最顶层:放上你的应用代码(app.py)
这个三明治做好后,不能直接吃(因为它是“只读模板”),但你可以:复制一份,然后在上面加生菜、番茄(这就是“容器”)
别人也可以用同样的配方做一模一样的三明治
4.如何管理Docker镜像
常用命令
| 列出本地所有镜像 |
| 从 Registry 拉取镜像(如 |
| 从 Dockerfile 构建镜像 |
| 删除本地镜像 |
| 查看镜像详细信息(包括层、配置等) |
| 查看镜像的构建历史和各层大小 |
5.镜像的命名与标签
镜像名称格式:[registry-host/] [namespace/] repository[:tag]
例如:nginx:latest、library/ubuntu:22.04、myregistry.com/myapp:v1.0
latest 是默认标签,但不推荐在生产中使用,建议使用明确版本号(如 v1.2.3)以确保可重现性。
6.Dockerfile:构建镜像的“配方”
Docker镜像通常通过Dockerfile定义。这是一个文本文件,包含一系列指令:
# 使用官方 Python 基础镜像
FROM python:3.11-slim# 设置工作目录
WORKDIR /app# 复制依赖文件并安装
COPY requirements.txt .
RUN pip install -r requirements.txt# 复制应用代码
COPY . .# 暴露端口
EXPOSE 5000# 启动命令
CMD ["python", "app.py"]
运行:
docker build -t my-python-app .
Docker 容器
1.什么是 Docker 容器?
Docker 容器是一个标准化的软件单元,它将应用程序及其所有依赖(如代码、运行时、系统工具、库和配置文件)打包在一起,确保应用在任何支持 Docker 的环境中都能一致地运行。
2.容器的核心特性
- 隔离性:每个容器拥有独立的文件系统、网络、进程空间等(通过 Linux 的 namespaces 和 cgroups 实现)。
- 轻量级:不包含完整操作系统,启动通常只需几毫秒到几秒。
- 可移植性:一次构建,随处运行(“Build Once, Run Anywhere”)。
- 版本控制:容器基于镜像(Image)创建,镜像可版本化、分层存储。
- 可扩展性:支持快速复制多个相同容器实例,便于水平扩展。
3.容器的生命周期
Docker 容器有以下几种状态:
- Created:已创建但未启动。
- Running:正在运行。
- Paused:暂停运行。
- Stopped/Exited:已停止。
- Dead:容器处于不可恢复状态。
常用命令管理容器生命周期:
# 启动容器
docker run -d --name myapp nginx# 查看运行中的容器
docker ps# 停止容器
docker stop myapp# 启动已停止的容器
docker start myapp# 删除容器
docker rm myapp# 进入容器内部(交互式)
docker exec -it myapp /bin/bash
4.容器与镜像的关系
- 镜像(Image):只读模板,用于创建容器。例如
nginx:latest
。 - 容器(Container):镜像的运行实例。容器在镜像之上添加一个可写层(称为容器层)。
"✅简单理解:把镜像类比于Java中的类(Class),容器是对象(Instance)"
镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层。
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume) 、或者 绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。
Docker 仓库
Docker 仓库(Docker Registry)是用于存储、分发和管理 Docker 镜像(Images)的服务。它是 Docker 生态系统中不可或缺的一部分,使得开发者可以轻松地共享和部署容器化应用。
1. 什么是 Docker 仓库?
Docker 仓库是一个集中存放 Docker 镜像的地方。你可以把它理解为“镜像的代码仓库”,类似于 Git 仓库之于源代码。
- 镜像(Image):应用的打包模板。
- 仓库(Repository):一组相关镜像的集合(通常是一个应用的不同版本)。
- 注册表(Registry):托管多个仓库的服务。
2.Docker仓库的类型
1.公共仓库
- 特点:任何人都可以拉取(pull)镜像,部分允许公开推送(push)。
- 适用场景:开源项目、官方基础镜像分发。
公有仓库是允许用户免费上传、下载的公开镜像服务。比如官方的 Docker Hub ,也是默认的 Docker Repository,里面拥有着大量的高质量镜像。但是国内访问它可能比较慢,国内的云服务商提供了针对 Docker Hub 的镜像服务(Registry Mirror
),这些镜像服务被称为镜像加速器。国内常见有阿里云加速器、网易加速器、DaoCloud 加速器等。
2.私有仓库
- 特点:仅授权用户可拉取或推送镜像,保障安全。
- 适用场景:企业内部应用、商业软件、敏感业务系统。
除了公有仓库外,用户还可以在本地搭建私有仓库。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 docker
命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。除了官方的 Docker Registry 外,还有第三方软件实现了 Docker Registry API,甚至提供了用户界面以及一些高级功能。比如,Harbor 和 Sonatype Nexus。