Docker 容器(一)
Docker
- 一、Docker是什么
- 1.什么是Docker
- 2.Docker特点
- 3.比较虚拟机和容器
- 二、Docker安装
- 1.Docker三大核心组件
- 2.安装步骤(Ubuntu)
- 3.阿里云镜像加速
- 三、Docker镜像
- 1.什么是镜像
- 2.UnionFS(联合文件系统)
- 3.Docker镜像加载原理
- 4.提交容器镜像
一、Docker是什么
1.什么是Docker
Docker 是一种轻量级的容器化技术,它允许开发者将应用程序及其所有依赖(如代码、运行时环境、系统工具、库等)打包成一个标准化的、可移植的“容器”(Container),并在任何支持 Docker 的平台上快速部署和运行。
2.Docker特点
-
轻量级与高效性
基于容器技术:与传统虚拟机(VM)不同,Docker 容器共享宿主机的操作系统内核,无需启动完整的操作系统,因此资源占用更少(MB级 vs. VM的GB级)、启动更快(秒级 vs. VM的分钟级)。高性能:接近原生运行效率,适合高密度部署(如微服务架构)。
-
环境一致性(一次构建,处处运行)
镜像(Image)机制:将应用及其依赖(如Java/MySQL等)打包成标准化的镜像,确保开发、测试、生产环境完全一致,避免“在我机器上能跑”的问题。跨平台运行:镜像可在任何支持 Docker 的系统中运行(Linux/Windows/macOS),实现真正的跨平台移植。
-
快速部署与扩展
一键部署:通过 docker run命令即可启动容器,无需手动配置环境,大幅简化运维。弹性伸缩:结合 Kubernetes 或 Swarm,可快速扩展容器实例以应对流量高峰。
-
隔离性与安全性
进程级隔离:每个容器拥有独立的文件系统、网络和进程空间,通过 Namespaces和 Cgroups实现资源隔离,避免应用间冲突。安全沙箱:容器内进程无法直接影响宿主机或其他容器(但安全性弱于VM,依赖宿主机内核安全)。
-
微服务与DevOps友好
微服务架构:每个服务可独立打包为容器,实现模块化开发和部署。CI/CD支持:镜像版本化管理,无缝集成 Jenkins/GitLab CI 等工具,提升持续交付效率。
-
开源与生态丰富
基于Go语言开发:轻量且高性能,社区活跃。强大工具链:提供 Docker Compose(多容器编排)、Docker Hub(镜像仓库)、Kubernetes 集成等生态支持。
3.比较虚拟机和容器
-
虚拟化层级
Docker:利用宿主机的内核,通过Namespaces和Cgroups隔离进程和资源,无独立操作系统。VM:通过Hypervisor(如VMware、KVM)虚拟出CPU、内存等硬件,每个VM需运行完整的Guest OS(如CentOS、Windows)。
-
资源效率
Docker:多个容器共享宿主机内核,无重复OS开销,资源利用率高,适合高密度部署。VM:每个VM独占虚拟硬件和OS,资源浪费明显(例如运行10个VM需启动10个OS内核)。
-
启动速度
Docker:秒级启动(直接调用宿主机内核)。VM:分钟级启动(需加载完整OS)。
-
隔离性与安全性
Docker:进程级隔离,安全性较弱(若宿主机内核漏洞会影响所有容器)。VM:硬件级隔离,安全性更强(一个VM被攻破不影响其他VM)。
-
适用场景
Docker:微服务、CI/CD、快速伸缩、DevOps(追求轻量和效率)。VM:强隔离需求(如多租户云平台)、运行不同OS的应用(如Windows/Linux混合环境)。
二、Docker安装
1.Docker三大核心组件
Docker 镜像(Image)
镜像是一个只读模板,包含运行应用所需的代码、运行时环境、库和配置。
一个镜像可创建很多个容器。
Docker 容器(Container)
容器是镜像的运行实例,类似于轻量级的虚拟机。每个容器都是相互隔离的、保证安全的平台。
Docker 仓库(Registry)
用于存储和分发 Docker 镜像的服务器,类似代码仓库。
2.安装步骤(Ubuntu)
👉戳我可查看官方文档
(1)卸载旧版本
在安装 Docker Engine 之前,您需要卸载任何冲突的软件包。
运行以下命令以卸载所有冲突的包:
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
# 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
#外网不能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 包。
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
③通过运行映像来验证安装是否成功:hello-world
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构建镜像)。
docker commit [OPTIONS] <容器ID或名称> <新镜像名>[:标签]
常用选项
选项 | 说明 |
---|---|
-a 或 --author | 指定镜像作者(如 -a "Your Name" ) |
-m 或 --message | 添加提交信息(类似 Git commit) |
-p 或 --pause | 在提交时暂停容器(默认行为) |
(1)慎用 docker commit
提交的镜像缺乏透明性(无法追溯修改步骤),推荐优先使用 Dockerfile构建可复现的镜像。
提交的镜像可能包含冗余文件(如缓存、临时文件),导致体积膨胀。
(2)清理无用数据
提交前建议在容器内清理缓存:
apt-get clean && rm -rf /var/lib/apt/lists/*
与 Dockerfile
对比
方式 | 优势 | 劣势 |
---|---|---|
docker commit | 快速保存临时修改 | 无法版本控制,难以维护 |
Dockerfile | 可复现、易维护、支持自动化构建 | 需手动编写构建步骤 |