概述
如果你刚开始学习 Docker,你一定经常听到三个词:
镜像(Image) 、容器(Container) 、仓库(Registry)
它们是 Docker 的三大核心概念,理解它们的关系,是掌握 Docker 的第一步
Docker 是什么
Docker 是一个开源平台,用于打包、分发和运行应用程序 。
它的核心思想是:一次打包,到处运行。
而实现这一目标的,就是我们今天要讲的三个核心概念
镜像(Image)------ 应用的"模板"
镜像 是一个只读的模板,里面包含了运行某个应用所需的一切:
- 应用代码
- 运行环境(如 Python、Node.js)
- 依赖库
- 配置文件
- 启动命令
你可以把它理解为一个应用程序的"快照"或"安装包"。
举个例子
nginx:latest
是一个镜像,包含了 Nginx 服务器的所有内容。python:3.9-slim
是一个镜像,包含了 Python 3.9 运行环境。
关键特点
- 只读:不能修改,只能用来创建容器。
- 分层存储:镜像由多个层组成,复用层可以节省空间。
- 可共享:可以上传到仓库,供他人下载使用。
容器(Container)------ 镜像的"运行实例"
容器 是镜像的运行实例 。
你可以把它理解为一个轻量级的、独立的"小电脑",里面正在运行一个应用。
举个例子
- 你用
nginx:latest
镜像启动了一个容器,这个容器就在运行 Nginx 服务。 - 你可以同时运行多个基于
nginx:latest
的容器,每个都是独立的。
关键特点
- 可读写:容器启动后,可以修改文件(但重启后会丢失,除非挂载卷)。
- 隔离运行:每个容器相互隔离,互不影响。
- 生命周期管理:可以启动、停止、删除容器。
常用命令
bash
docker run nginx # 从镜像启动一个容器
docker ps # 查看正在运行的容器
docker stop <container> # 停止容器
docker rm <container> # 删除容器
仓库(Registry)------ 镜像的"应用商店"
仓库 是存放和分发 Docker 镜像的地方。
你可以把它理解为一个"应用商店 "或"GitHub for 镜像"。
最著名的公共仓库是 Docker Hub(https://hub.docker.com),里面有很多官方和社区维护的镜像,比如:
ubuntu
mysql
redis
python
企业也可以搭建私有仓库,用于存储内部应用的镜像。
关键操作
bash
docker pull nginx # 从仓库下载镜像
docker push myapp:1.0 # 将自定义镜像上传到仓库
三者关系
[ 仓库(Registry) ]
↑ ↓ pull / push
[ 镜像(Image) ] ------------→ [ 容器(Container) ]
(只读模板) (运行实例)
流程说明
- 你从 仓库 下载一个 镜像 (如
nginx
) - 使用这个 镜像 启动一个 容器,应用开始运行
- 你修改了应用,生成了一个新的 镜像
- 把新镜像 推送到仓库,供其他人使用
实际操作示例
1. 从仓库拉取镜像
bash
docker pull ubuntu:20.04
2. 用镜像启动容器
bash
docker run -it ubuntu:20.04 /bin/bash
(-it
表示交互模式,进入容器终端)
3. 在容器中做些修改(如安装软件)
bash
apt-get update && apt-get install -y curl
4. 退出容器,提交为新镜像
bash
docker commit <container-id> my-ubuntu-with-curl
5. 推送到仓库(需先登录)
bash
docker tag my-ubuntu-with-curl yourname/my-ubuntu:latest
docker push yourname/my-ubuntu:latest
常见误区
误区 | 正确认知 |
---|---|
"镜像和容器是一样的" | 镜像是模板,容器是运行实例,关系类似"类与对象" |
"容器可以永久保存修改" | 默认情况下,容器删除后修改丢失,需用"卷(Volume)"持久化数据 |
"仓库只能是 Docker Hub" | 也可以是私有仓库(如 Harbor)、阿里云容器镜像服务等 |
总结
概念 | 类比 | 作用 |
---|---|---|
镜像(Image) | 软件安装包 / 蓝图 | 包含应用和依赖,用于创建容器 |
容器(Container) | 正在运行的程序 | 镜像的实例,应用实际运行的地方 |
仓库(Registry) | 应用商店 / GitHub | 存储和分发镜像 |
记住这个流程:
仓库 → 镜像 → 容器