本文目录
  1. 3. 虚拟机和Docker有什么区别?
  2. 4. Docker运行时有哪些组件?
  3. 5. docker pull 命令从客户端到服务端是怎么执行的?
  4. 6. Docker的镜像和容器的概念和联系
  5. 7. 你都知道哪些Docker命令?
  6. 8. Docker镜像构建步骤

Docker 基础与常用操作

认识虚拟机与容器、Docker 运行组件、镜像、容器、命令和构建流程。

3. 虚拟机和Docker有什么区别?

维度 虚拟机(VM) Docker容器
虚拟化层级 虚拟化整个硬件层,包含完整操作系统 基于操作系统内核,共享宿主机内核
资源占用 重,每个VM需要独立OS,占用GB级空间 轻,容器共享内核,通常MB级大小
启动速度 慢(分钟级) 快(秒级)
性能损耗 较大,有Hypervisor层开销 接近原生性能
隔离性 强,完全隔离 较弱,共享内核(通过namespace和cgroup隔离)
镜像管理 完整系统镜像,体积大 分层镜像,体积小,便于分发
代表技术 VMware、VirtualBox、KVM Docker、Containerd

4. Docker运行时有哪些组件?

组件 说明
Docker Daemon(dockerd) Docker守护进程,负责管理容器的生命周期、镜像、网络、存储等
containerd 容器运行时的高层管理组件,负责容器生命周期管理、镜像分发等
runc 底层容器运行时,直接与Linux内核交互,执行实际的容器创建和运行(基于OCI标准)
Docker CLI(docker) 命令行客户端,用户通过它与Docker Daemon交互
Docker Registry 镜像仓库,存储和分发Docker镜像(如Docker Hub、私有Registry)
Docker API 暴露RESTful API供CLI和第三方工具调用

调用链:Docker CLI → Docker Daemon → containerd → runc → Linux Kernel


5. docker pull 命令从客户端到服务端是怎么执行的?

执行流程:

1. 用户执行 docker pull nginx

2. Docker CLI 将请求发送给本地 Docker Daemon(dockerd)
 通过 Unix Socket TCP 连接通信

3. Docker Daemon 收到请求后,委托给 containerd 处理

4. containerd 查找本地是否已有该镜像的缓存层

5. 若无缓存或需要更新,containerd 向配置的 Registry(默认Docker Hub)
   发起 HTTPS 请求,获取镜像的 manifest(清单文件)

6. 解析 manifest,获取镜像的所有层(layer)信息

7. 逐层下载(并行),每层通过 digest(SHA256哈希)校验完整性

8. 下载的层存入本地存储(通常在 /var/lib/docker/ 目录下)

9. 所有层下载完成后,组装为完整的镜像,注册到本地镜像列表

10. 返回成功信息给 CLI,显示 Pull complete

6. Docker的镜像和容器的概念和联系

镜像(Image)

  • 一个只读的模板,包含了运行应用所需的所有内容:代码、运行时、库、环境变量、配置文件
  • 采用分层存储(Union File System),每一层对应一次构建指令
  • 镜像是静态的,不可修改

容器(Container)

  • 镜像的运行实例
  • 在镜像的只读层之上添加一层可写层(Copy-on-Write)
  • 容器是动态的,有生命周期(创建、运行、停止、删除)

联系

镜像 (docker run) → 容器
类比:类(Class) 实例化 对象(Object)
  • 一个镜像可以创建多个容器
  • 容器停止后,可写层数据保留(除非删除容器)
  • 容器的修改不会影响原始镜像

7. 你都知道哪些Docker命令?

镜像相关

docker pull <image>         # 拉取镜像
docker build -t <name> .    # 构建镜像
docker images               # 列出本地镜像
docker rmi <image>          # 删除镜像
docker tag <image> <tag>    # 给镜像打标签
docker push <image>         # 推送镜像到仓库

容器相关

docker run -d -p 8080:80 <image>   # 创建并运行容器
docker ps                          # 查看运行中的容器
docker ps -a                       # 查看所有容器
docker stop <container>            # 停止容器
docker start <container>           # 启动容器
docker restart <container>         # 重启容器
docker rm <container>              # 删除容器
docker exec -it <container> bash   # 进入容器终端
docker logs <container>            # 查看容器日志
docker inspect <container>         # 查看容器详细信息

其他

docker compose up -d               # 启动编排服务
docker compose down                # 停止并移除编排服务
docker system prune                # 清理无用资源
docker volume ls                   # 查看存储卷
docker network ls                  # 查看网络

8. Docker镜像构建步骤

  1. 编写 Dockerfile
FROM python:3.11-slim          # 基础镜像
WORKDIR /app                   # 设置工作目录
COPY requirements.txt .        # 复制依赖文件
RUN pip install -r requirements.txt  # 安装依赖
COPY . .                       # 复制源代码
EXPOSE 8000                    # 声明端口
CMD ["python", "app.py"]       # 启动命令
  1. 执行构建命令
docker build -t myapp:v1 .
  1. 构建过程

    • Docker 读取 Dockerfile,逐行执行指令
    • 每条指令生成一个镜像层(Layer),有独立的缓存
    • 若某层未变化,会使用缓存(Build Cache),加速构建
    • 最终所有层叠加形成完整镜像
  2. 验证

docker run -p 8000:8000 myapp:v1

优化要点:合理排序指令(频繁变化的放后面)、使用 .dockerignore、合并 RUN 指令减少层数、使用多阶段构建减小镜像体积。