[IT]docker,容器, 镜像(区别和联系)

2 阅读3分钟

Docker 三大核心概念关系图 +-----------------------------------+ | Docker Registry (仓库) | | +-----------------------------+ | | | Image (镜像) | | | | +---------------------+ | | | | | Container (容器) | | | | | | +-------------+ | | | | | | | App | | | | | | | | + Deps | | | | | | | | + Config | | | | | | | +-------------+ | | | | | +---------------------+ | | | +-----------------------------+ | +-----------------------------------+

Docker核心概念关系图

层级关系:Docker Registry → Image → Container
(从存储到运行:镜像仓库 → 镜像 → 容器实例)

三者关系详解

1. 镜像(Image) - 静态模板

  • 定义:只读的模板,包含应用程序及其运行环境的所有内容
  • 特点
    • 类似软件安装包(如 .exe 文件)
    • 由多层(Layer)组成,每层都是一个文件系统更改
    • 存储在本地或远程仓库中
  • 示例nginx:latestubuntu:20.04

2. 容器(Container) - 运行实例

  • 定义:镜像的运行时实例
  • 特点
    • 类似正在运行的进程
    • 在镜像基础上增加一个可写层
    • 每个容器相互隔离
    • 启动快、资源占用少
  • 示例:运行中的Nginx服务器实例

3. 仓库(Registry) - 镜像存储库

  • 定义:集中存储和分发镜像的地方
  • 类型
    • 公共仓库:Docker Hub(默认)
    • 私有仓库:企业自建(如 Harbor)
  • 示例:从 docker.io/library/nginx 拉取镜像

层级关系与工作流程

层次结构

Docker Registry (远程/本地仓库)
        ↓
    镜像(Image) ← 通过 Dockerfile 构建
        ↓
    容器(Container) ← 运行中的实例
        ↓
    容器数据(Volume) ← 持久化存储

创建与运行流程

# 1. 从仓库拉取镜像(或本地构建)
docker pull ubuntu:20.04

# 2. 查看本地镜像
docker images
# REPOSITORY   TAG       IMAGE ID        CREATED        SIZE
# ubuntu       20.04     xxx...          ...            72.8MB

# 3. 从镜像创建并运行容器
docker run -it ubuntu:20.04 /bin/bash

# 4. 查看运行中的容器
docker ps
# CONTAINER ID  IMAGE         COMMAND      STATUS        NAMES
# abc123def     ubuntu:20.04  "/bin/bash"  Up 2 minutes  vibrant_euler

类比解释

概念面向对象编程操作系统软件安装
镜像类定义(Class)系统镜像(ISO文件)安装程序(.exe/.dmg)
容器对象实例(Object)运行的虚拟机已安装并运行的程序
仓库代码仓库(GitHub)软件源应用商店

实际操作中的关系

从镜像到容器

# 一个镜像可以创建多个容器
docker run -d --name web1 nginx:alpine
docker run -d --name web2 nginx:alpine
docker run -d --name web3 nginx:alpine
# 现在有3个容器,都基于同一个nginx镜像

容器修改可保存为新镜像

# 1. 运行容器并做修改
docker run -it ubuntu:20.04 /bin/bash
# 在容器内:apt-get update && apt-get install -y curl

# 2. 退出容器,将其保存为新镜像
docker commit <容器ID> my-ubuntu-with-curl:v1

Dockerfile构建镜像

# Dockerfile - 定义镜像的构建步骤
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y nginx
COPY index.html /var/www/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
# 构建镜像
docker build -t my-nginx:v1 .

# 运行容器
docker run -d -p 8080:80 my-nginx:v1

数据流动关系

开发者机器:
    Dockerfile → (docker build) → 本地镜像 → (docker run) → 容器

团队协作:
    本地镜像 → (docker push) → Docker Hub → (docker pull) → 同事机器 → 容器

生产环境:
    CI/CD管道 → 构建镜像 → 推送到私有仓库 → 生产服务器拉取并运行容器

重要特性总结

  1. 镜像层缓存机制

    # 每一条指令都创建一个新的镜像层
    FROM ubuntu:20.04          # 层1:基础镜像
    RUN apt-get update         # 层2:更新包列表
    RUN apt-get install nginx  # 层3:安装nginx
    COPY app /var/www/html     # 层4:复制应用文件
    
  2. 容器与镜像的关系

    • 容器 = 镜像 + 可写层
    • 可写层在容器删除时丢失(除非使用卷Volume)
  3. 生命周期

    镜像存在周期:构建 → 存储 → 分发 → 删除
    容器存在周期:创建 → 启动 → 停止 → 删除
    

简单记忆法则

  1. 镜像食谱(Recipe)
  2. 容器做好的菜(Dish)
  3. 仓库食谱书(Cookbook)
  4. Docker厨房(Kitchen)

关键点:一个镜像可以创建多个容器,但容器不能直接变成镜像(需要通过commit或重新构建)。容器运行时的所有修改都在可写层,不影响原始镜像。