Docker 容器(一)

Docker

一、Docker是什么

1.什么是Docker

Docker 是一种轻量级的容器化技术​​,它允许开发者将应用程序及其所有依赖(如代码、运行时环境、系统工具、库等)打包成一个标准化的、可移植的"容器"(Container),并在任何支持 Docker 的平台上快速部署和运行。

2.Docker特点

  1. 轻量级与高效性​​

    ​​基于容器技术​​:与传统虚拟机(VM)不同,Docker 容器共享宿主机的操作系统内核,无需启动完整的操作系统,因此​​资源占用更少​​ (MB级 vs. VM的GB级)、​​启动更快​​(秒级 vs. VM的分钟级)。

    ​​高性能​​:接近原生运行效率,适合高密度部署(如微服务架构)。

  2. 环境一致性(一次构建,处处运行)​​

    ​​镜像(Image)机制​​:将应用及其依赖(如Java/MySQL等)打包成标准化的镜像,确保​​开发、测试、生产环境完全一致​​,避免"在我机器上能跑"的问题。

    ​​跨平台运行​​:镜像可在任何支持 Docker 的系统中运行(Linux/Windows/macOS),实现真正的​​跨平台移植​​

  3. 快速部署与扩展​​

    ​​一键部署​​:通过 docker run命令即可启动容器,无需手动配置环境,大幅简化运维。

    弹性伸缩​​:结合 Kubernetes 或 Swarm,可快速扩展容器实例以应对流量高峰。

  4. 隔离性与安全性​​

    ​​进程级隔离​​:每个容器拥有独立的文件系统、网络和进程空间,通过 Namespaces和 Cgroups实现资源隔离,避免应用间冲突。

    安全沙箱​​:容器内进程无法直接影响宿主机或其他容器(但安全性弱于VM,依赖宿主机内核安全)。

  5. 微服务与DevOps友好​​

    ​​微服务架构​​:每个服务可独立打包为容器,实现模块化开发和部署。

    ​​CI/CD支持​​:镜像版本化管理,无缝集成 Jenkins/GitLab CI 等工具,提升持续交付效率。

  6. 开源与生态丰富​​

    ​​基于Go语言开发​​:轻量且高性能,社区活跃。

    强大工具链​​:提供 Docker Compose(多容器编排)、Docker Hub(镜像仓库)、Kubernetes 集成等生态支持。

3.比较虚拟机和容器

  1. ​​虚拟化层级​​

    ​​Docker​​:利用宿主机的内核,通过Namespaces和Cgroups隔离进程和资源,​​无独立操作系统​​。

    ​​VM​​:通过Hypervisor(如VMware、KVM)虚拟出CPU、内存等硬件,每个VM需运行完整的Guest OS(如CentOS、Windows)。

  2. ​​资源效率​​

    ​​Docker​​:多个容器共享 宿主机内核,无重复OS开销,资源利用率高,适合高密度部署。

    ​​VM​​:每个VM独占虚拟硬件和OS,资源浪费明显(例如运行10个VM需启动10个OS内核)。

  3. ​​启动速度​​

    ​​Docker​​:秒级启动(直接调用宿主机内核)。

    ​​VM​​:分钟级启动(需加载完整OS)。

  4. ​​隔离性与安全性​​

    ​​Docker​​:进程级隔离,安全性较弱(若宿主机内核漏洞会影响所有容器)。

    ​​VM​​:硬件级隔离,安全性更(一个VM被攻破不影响其他VM)。

  5. ​​适用场景​​

    ​​Docker​​:微服务、CI/CD、快速伸缩、DevOps(追求轻量和效率)。

    ​​VM​​:强隔离需求(如多租户云平台)、运行不同OS的应用(如Windows/Linux混合环境)。

二、Docker安装

1.Docker​​三大核心组件​​

Docker 镜像(Image)​

镜像是一个​​只读模板​​,包含运行应用所需的代码、运行时环境、库和配置。

一个镜像可创建很多个容器。

Docker 容器(Container)

容器是镜像的​​运行实例​​,类似于轻量级的虚拟机。每个容器都是相互隔离的、保证安全的平台。

Docker 仓库(Registry)​

用于存储和分发 Docker 镜像的服务器,类似代码仓库。

2.安装步骤(Ubuntu)

👉戳我可查看官方文档

(1)卸载旧版本

在安装 Docker Engine 之前,您需要卸载任何冲突的软件包。

运行以下命令以卸载所有冲突的包:

bash 复制代码
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

(2)安装Docker Engine

①设置 Docker 的存储库。apt

bash 复制代码
# Add Docker's official GPG key:
#更新本地 APT 软件包索引
sudo apt-get update
#安装 ca-certificates(用于 HTTPS 连接验证)和 curl(用于下载文件),确保系统支持安全下载
sudo apt-get install ca-certificates curl
#创建目录 /etc/apt/keyrings,权限设置为 0755(所有者可读写执行,其他用户可读执行),用于存储 GPG 密钥
sudo install -m 0755 -d /etc/apt/keyrings
#使用 curl下载 Docker 的官方 GPG 密钥,保存到 /etc/apt/keyrings/docker.asc。
# -fsSL:静默模式(不显示进度),跟随重定向,忽略 SSL 证书错误(因已通过 ca-certificates验证)。
# -o:指定输出文件路径。
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc   
#将密钥文件权限设置为所有用户可读(a+r),确保 APT 可以访问该密钥
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  # 再次更新 APT 软件包索引,使新添加的 Docker 软件源生效。
sudo apt-get update
bash 复制代码
#外网不能ping通可使用阿里云镜像仓库
# 1. 安装依赖工具
sudo apt-get update
sudo apt-get install -y ca-certificates curl

# 2. 添加 Docker 的 GPG 密钥(阿里云镜像)
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# 3. 添加阿里云 Docker CE 镜像源
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 4. 更新 APT 并安装 Docker
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

②安装 Docker 包。

bash 复制代码
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

③通过运行映像来验证安装是否成功:hello-world

bash 复制代码
sudo docker run hello-world

3.阿里云镜像加速

阿里云控制台 访问容器镜像服务,即可打开镜像加速器。

三、Docker镜像

1.什么是镜像

**Docker 镜像(Image)**​​ 是一个​​只读的模板​​,包含运行某个应用程序所需的​​代码、运行时环境、依赖库、环境变量和配置文件​​。镜像是 Docker 容器的静态基础,容器则是镜像的运行实例

2.UnionFS(联合文件系统)

Union 文件系统(Union File System,简称 UnionFS)是一种​​分层、轻量级的文件系统​​,它将多个​​只读层(read-only layers)​​和一个​​可写层(writable layer)​​组合成一个单一的文件系统视图。

底层为只读层,上层为可写层,合并视图为用户看到的最终文件系统。

在Docker容器中的应用

(1)镜像分层存储​

Docker 镜像由多个​​文件系统​​组成,每层对应一个 Dockerfile 指令(如 RUN、COPY)。

(2)容器可写层​​

当启动容器时,Docker 在镜像的只读层之上添加一个​​可写层​​(容器层)。

所有文件修改(如创建、删除、更新)均发生在可写层,不影响镜像本身。

3.Docker镜像加载原理

BootFS (内核启动的必需品)

在 Docker 的镜像分层架构中,BootFS 是 ​​最底层的基础文件系统​​,直接依赖宿主机的 Linux 内核。

内核启动阶段​​:BootFS 是 Linux 内核启动时挂载的​​临时根文件系统​​,提供最基本的工具(如 init、modprobe)和驱动,用于加载真正的根文件系统(如 ext4、xfs)。

RootFS

RootFS(Root File System,根文件系统)是 ​​Linux 系统启动后挂载的最终文件系统​​,包含操作系统运行所需的​​所有用户空间文件和目录​​(如 /bin、/etc、/usr)。在 Docker 中,RootFS 是 ​​镜像的核心组成部分​​,直接决定了容器的运行环境。

BootFS vs. RootFS​

对比项 BootFS RootFS
用途 内核启动时的临时文件系统 容器/系统的永久根文件系统
是否必需 传统 Linux 必需,Docker 容器中省略 Docker 容器的必需层(如 ubuntu:22.04
典型内容 /boot/vmlinuz(内核)、/boot/initrd /bin/etc/usr等用户空间文件
生命周期 内核启动后卸载 容器运行时持续存在

Docker 镜像分层的好处​

  • 节省存储空间:多个镜像可以复用相同的基础层(如 ubuntu:22.04),避免重复存储。
  • 加速镜像构建与分发:如果 Dockerfile的某一层未变化(如 RUN apt-get update),直接复用缓存,跳过重复操作。
  • 环境一致性:镜像构建后,每层内容只读,确保开发、测试、生产环境完全一致。
  • 持多阶段构建:在最终镜像中仅保留必要层,丢弃中间层(如编译工具)。
  • 快速容器启动:容器启动时直接挂载镜像的现有层(无需解压完整文件系统)。
  • 安全与审计:每层有唯一的哈希值,确保镜像内容未被篡改(如 sha256:abcd...)。

4.提交容器镜像

docker commit命令用于将 ​​正在运行的容器​​ 的当前状态保存为一个 ​​新的镜像​​。适用于临时修改容器后需要持久化的场景(但推荐优先使用 Dockerfile构建镜像)。

bash 复制代码
docker commit [OPTIONS] <容器ID或名称> <新镜像名>[:标签]

常用选项

选项 说明
-a--author 指定镜像作者(如 -a "Your Name"
-m--message 添加提交信息(类似 Git commit)
-p--pause 在提交时暂停容器(默认行为)

(1)慎用 docker commit​​

提交的镜像​​缺乏透明性​​(无法追溯修改步骤),推荐优先使用 Dockerfile构建可复现的镜像。

提交的镜像可能包含​​冗余文件​​(如缓存、临时文件),导致体积膨胀。

(2)清理无用数据​​

提交前建议在容器内清理缓存:

bash 复制代码
apt-get clean && rm -rf /var/lib/apt/lists/*

Dockerfile对比

方式 优势 劣势
docker commit 快速保存临时修改 无法版本控制,难以维护
Dockerfile 可复现、易维护、支持自动化构建 需手动编写构建步骤