Docker 从零到精通:知识与跨平台使用指南
Docker 作为容器化技术的标杆,已成为现代软件开发、运维和云原生架构中不可或缺的工具。本文将从基础概念到高级实践,系统性地讲解 Docker 的所有核心知识,并详细说明在不同操作系统上的安装与使用方法。
一、Docker 简介与核心概念
1.1 什么是 Docker?
Docker 是一个开源的应用容器引擎,基于 Go 语言开发。它允许开发者将应用及其所有依赖打包到一个轻量级、可移植的容器中,然后发布到任何支持 Docker 的环境中运行。
相比传统虚拟机,Docker 的核心优势在于:
- 启动速度快:秒级甚至毫秒级启动,虚拟机需加载完整操作系统
- 资源利用率高:容器共享宿主机内核,无需为每个应用分配独立操作系统
- 镜像体积小:采用分层存储机制,传输和部署效率高
- 环境一致性:实现“一次构建,处处运行”,彻底解决环境差异问题
1.2 三大核心概念
Docker 的生态体系由三个核心组件构成:
镜像(Image) —— 镜像是一个只读模板,包含创建 Docker 容器所需的所有指令、文件系统和参数。可以将其理解为软件的“安装包”或“模具”。镜像采用分层存储结构,Dockerfile 中的每条指令都会创建一个新层。
容器(Container) —— 容器是镜像的可运行实例。镜像与容器的关系,类似于面向对象编程中类与对象的关系。容器具有轻量级、可移植和隔离性等特点。
仓库(Repository) —— 仓库是集中存储和分发镜像的平台。Docker Hub 是官方公共镜像仓库,全球开发者可在此共享和获取标准化的应用镜像。
1.3 Docker 架构
2025 年的 Docker 架构包含三大核心组件:
- Docker Daemon:后台服务进程,负责容器生命周期管理
- Docker CLI:命令行工具,通过 REST API 与 Daemon 交互
- Docker Hub:官方镜像仓库,2025 年新增了 AI 模型容器专区
二、Docker 在不同系统上的安装
2.1 Linux 系统安装(Ubuntu / CentOS)
Docker 在 Linux 上的运行依赖于 Linux 内核的 Namespace(资源隔离)和 Cgroups(资源限制)等特性。Linux 是 Docker 运行最自然的环境。
系统要求
- 64 位系统,内核版本 ≥ 5.4(推荐)
- 支持 systemd 或 Upstart
- 硬件建议:4 核 CPU、8GB 内存、50GB 磁盘空间
Ubuntu 安装步骤
# 1. 卸载旧版本(如有)
sudo apt-get remove docker docker-engine docker.io containerd runc
# 2. 安装依赖包
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
# 3. 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 4. 设置稳定版仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 5. 安装 Docker 引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 6. 验证安装
sudo docker run hello-world
CentOS 安装步骤
# 1. 安装依赖包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 2. 添加 Docker 官方仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 3. 安装 Docker CE
sudo yum install docker-ce docker-ce-cli containerd.io
# 4. 启动 Docker 并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 5. 验证安装
sudo docker run hello-world
一键脚本安装法
对于大多数 Linux 发行版,也可使用官方提供的便捷安装脚本:
curl -fsSL https://get.docker.com | sh
# 或
wget -qO- https://get.docker.com | sudo sh
该方式会自动检测发行版类型、配置软件源并安装最新稳定版。
配置用户组(免 sudo 运行)
sudo usermod -aG docker ${USER}
# 注销并重新登录后生效
2.2 Windows 系统安装
Windows 无法原生运行 Linux 容器,需要借助 Hyper-V 或 WSL 2(Windows Subsystem for Linux 2)构建轻量级 Linux 虚拟机来运行 Docker。
系统要求
- Windows 10 2004 及以上(64 位)或 Windows 11
- 启用 Hyper-V 或 WSL 2
- 硬件最低 4GB 内存
安装步骤
-
启用 WSL 2(如未启用):以管理员身份运行 PowerShell,执行:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart wsl --set-default-version 2 -
下载 Docker Desktop for Windows:访问 Docker 官网 下载安装包
-
安装:双击
.exe安装包,安装时勾选“启用 WSL 2 集成” -
启动并配置:启动 Docker Desktop → Settings → General → 勾选 “Use the WSL 2 based engine” → Apply & Restart
-
验证:在 PowerShell 或 CMD 中运行:
docker --version docker run hello-world
2.3 macOS 系统安装
macOS 同样无法原生运行 Linux 容器,需借助 Hypervisor.framework(Intel 芯片)或 Rosetta 2(Apple Silicon M1/M2)。
系统要求
- macOS 10.15 及以上(Intel)或 macOS 11 及以上(Apple Silicon)
- 建议 4GB 以上内存
安装步骤
-
下载 Docker Desktop for Mac:访问 Docker 官网 下载
.dmg安装包 -
安装:双击
.dmg文件,将 Docker 图标拖入 Applications 文件夹 -
启动:从 Applications 中启动 Docker Desktop
-
配置(M1/M2 芯片):安装时勾选“使用 Rosetta 翻译”
-
验证:在终端中运行:
docker --version docker run hello-world
2.4 国内镜像加速配置
由于网络原因,国内用户拉取镜像可能较慢,建议配置镜像加速器。
配置方法(所有系统通用):
编辑 /etc/docker/daemon.json(Linux)或通过 Docker Desktop 设置界面(Windows/macOS)添加:
{
"registry-mirrors": [
"https://<your-id>.mirror.aliyuncs.com",
"https://docker.1ms.run",
"https://docker-0.unsee.tech"
]
}
重启 Docker 后生效。阿里云用户可登录容器镜像服务获取专属加速器地址。
三、镜像管理
3.1 拉取镜像
# 从 Docker Hub 拉取镜像
docker pull nginx:latest
docker pull ubuntu:22.04
3.2 查看本地镜像
# 列出所有本地镜像
docker images
# 查看镜像构建历史(分层结构)
docker history <镜像名>
3.3 删除镜像
docker rmi <镜像ID或名称>
docker image prune # 删除未使用的镜像
3.4 导出与导入镜像
# 导出镜像为 tar 文件
docker save -o myimage.tar <镜像名>
# 从 tar 文件加载镜像
docker load -i myimage.tar
四、容器管理
4.1 创建和运行容器
# 基本运行
docker run nginx:latest
# 后台运行(-d)
docker run -d nginx:latest
# 指定名称(--name)
docker run -d --name my-nginx nginx:latest
# 端口映射(-p 主机端口:容器端口)
docker run -d -p 8080:80 --name web nginx:latest
# 挂载数据卷(-v)
docker run -d -v /host/data:/container/data --name app myapp:latest
# 设置环境变量(-e)
docker run -d -e ENV_VAR=value myapp:latest
# 资源限制(-m 内存,--cpus CPU)
docker run -d -m 512m --cpus=1.5 nginx:latest
# 自动重启策略(--restart)
docker run -d --restart unless-stopped nginx:latest
关键参数说明:
-d:后台运行模式-p:端口映射(主机端口:容器端口)-v:数据卷挂载-e:环境变量注入--restart:自动重启策略(no / on-failure / always / unless-stopped)
4.2 查看容器状态
# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# 实时资源监控
docker stats
4.3 容器生命周期管理
# 启动/停止/重启容器
docker start <容器名或ID>
docker stop <容器名或ID>
docker restart <容器名或ID>
# 暂停/恢复容器
docker pause <容器名或ID>
docker unpause <容器名或ID>
# 删除容器
docker rm <容器名或ID>
4.4 进入容器
# 在运行中的容器内执行命令
docker exec -it <容器名或ID> /bin/bash
# 附加到容器主进程
docker attach <容器名或ID>
4.5 查看日志
# 查看容器日志
docker logs <容器名或ID>
# 实时跟踪日志
docker logs -f <容器名或ID>
# 查看最近 100 行
docker logs --tail=100 <容器名或ID>
4.6 文件复制
# 从容器复制文件到主机
docker cp <容器名>:<容器内路径> <主机路径>
# 从主机复制文件到容器
docker cp <主机路径> <容器名>:<容器内路径>
五、Dockerfile 编写与镜像构建
Dockerfile 是一组逐条执行的指令集合,用于自动创建 Docker 镜像。
5.1 Dockerfile 基本语法
# 基础镜像
FROM python:3.11-slim
# 设置工作目录
WORKDIR /app
# 复制文件
COPY ./app /app
# 安装依赖
RUN pip install --no-cache-dir flask==2.3.2 requests==2.31.0
# 暴露端口
EXPOSE 5000
# 容器启动命令
CMD ["python", "app.py"]
5.2 常用指令说明
| 指令 | 说明 |
|---|---|
FROM |
指定基础镜像 |
WORKDIR |
设置工作目录(优于 RUN cd) |
COPY |
复制文件/目录到镜像(优于 ADD) |
ADD |
复制文件,支持 URL 和自动解压 |
RUN |
在构建时执行命令 |
CMD |
容器启动时执行的命令(可被覆盖) |
ENTRYPOINT |
容器启动时执行的命令(不可被覆盖) |
EXPOSE |
声明容器监听的端口 |
ENV |
设置环境变量 |
ARG |
构建时参数(支持参数化构建) |
VOLUME |
声明数据卷 |
5.3 Dockerfile 最佳实践
1. 选择合适的基础镜像
- 优先使用官方镜像
- 选择精简版镜像(如
alpine、slim)以减小体积
2. 最小化层数
- 每条指令创建一个层,合并相关命令可减少层数
- 示例:
RUN apt-get update && apt-get install -y package && apt-get clean
3. 利用构建缓存
- 将变化最不频繁的指令放在 Dockerfile 前面
- 先复制依赖配置文件,再复制源代码
4. 使用 .dockerignore
- 排除不需要的文件和目录
- 避免将敏感信息、大文件等打包进镜像
5. 多阶段构建
- 分离构建环境与运行环境,大幅减小镜像体积
- 示例:
# 第一阶段:构建环境
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
# 第二阶段:运行环境(精简)
FROM alpine:latest
COPY --from=builder /app/myapp /usr/local/bin/
CMD ["myapp"]
多阶段构建可将生产镜像从 1.2GB 缩减至 15MB。
6. 安全考虑
- 不在 Dockerfile 中硬编码密码、密钥等敏感信息
- 使用 Docker Secrets 或环境变量传递敏感数据
- 避免以 root 用户运行容器(使用
USER指令切换)
5.4 构建镜像
# 基本构建
docker build -t myapp:v1.0 .
# 指定 Dockerfile
docker build -t myapp:v1.0 -f ./path/to/Dockerfile .
六、仓库与镜像分发
6.1 登录 Docker Hub
docker login
# 输入用户名和密码
6.2 标记镜像
docker tag myapp:latest username/myapp:latest
6.3 推送镜像
docker push username/myapp:latest
docker push registry.example.com/myapp:v1.0 # 私有仓库
6.4 拉取镜像
docker pull username/myapp:latest
docker pull registry.example.com/myapp:v1.0
七、数据管理(持久化)
Docker 容器是无状态的,容器删除后其中的数据会丢失。Docker 提供了几种数据持久化方案。
7.1 Volume(数据卷)—— 推荐方式
Volume 由 Docker 引擎统一管理,独立于容器生命周期,即使容器删除数据依然保留。
# 创建数据卷
docker volume create my-data
# 挂载数据卷到容器
docker run -d -v my-data:/app/data --name app myapp:latest
# 查看所有数据卷
docker volume ls
# 删除数据卷
docker volume rm my-data
7.2 Bind Mount(绑定挂载)
直接将宿主机目录挂载到容器中,适合开发环境。
docker run -d -v /host/path:/container/path myapp:latest
7.3 数据管理最佳实践
- 生产环境优先使用 Volume
- 数据库等有状态服务必须配置数据持久化
- 定期备份重要数据卷
八、网络管理
Docker 提供了多种网络模式,用于控制容器间的通信。
8.1 网络模式详解
| 模式 | 说明 | 适用场景 |
|---|---|---|
| bridge | 默认网络模式,容器拥有独立 IP 和网络命名空间 | 同主机容器间通信 |
| host | 容器共享宿主机网络命名空间 | 需要最高网络性能的场景 |
| none | 无网络 | 不需要网络的场景 |
| overlay | 跨多台 Docker 主机的网络 | 集群环境、Swarm 模式 |
| macvlan | 容器拥有独立 MAC 地址,像物理设备一样连接网络 | 从虚拟机迁移的场景 |
8.2 网络操作命令
# 查看网络列表
docker network ls
# 创建自定义网络
docker network create mynet --driver bridge --subnet 172.18.0.0/16
# 启动容器并加入网络
docker run -d --name db --network mynet mysql:latest
docker run -d --name app --network mynet myapp:v1.0
# 查看网络详情
docker network inspect mynet
# 删除网络
docker network rm mynet
自定义网络的优势在于容器之间可以通过容器名称直接通信。
九、Docker Compose(多容器编排)
Docker Compose 是 Docker 官方开源工具,用于定义和运行多容器应用。通过一个 YAML 配置文件,即可一键启动/停止整个应用栈。
9.1 安装 Docker Compose
# Linux:下载二进制文件
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --version
注:最新版 Docker Desktop 已内置 Compose 插件,可直接使用 docker compose 命令。
9.2 docker-compose.yml 示例
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
depends_on:
- app
restart: unless-stopped
app:
build: .
environment:
- ENV=production
volumes:
- ./data:/app/data
depends_on:
- db
db:
image: postgres:13
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
9.3 Compose 常用命令
# 后台启动所有服务
docker-compose up -d
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs -f
# 停止并删除所有服务(保留数据卷)
docker-compose down
# 停止并删除所有服务(同时删除数据卷)
docker-compose down -v
# 重新构建并启动
docker-compose up -d --build
十、安全最佳实践
1. 使用最小化基础镜像 —— 减小攻击面
2. 定期进行镜像漏洞扫描
docker scan myimage:latest
推荐工具:Trivy、Clair、Anchore
3. 避免使用特权模式 —— --privileged 会破坏容器隔离性
4. 不要以 root 用户运行容器 —— 在 Dockerfile 中使用 USER 指令切换
5. 使用镜像签名验证
docker buildx build --provenance=true --sbom=true -t signed-image .
6. 定期更新基础镜像(建议每周)
7. 敏感信息管理 —— 使用 Docker Secrets 或环境变量,不硬编码在镜像中
十一、常见问题排查
11.1 Docker 守护进程未启动
# Linux
sudo systemctl status docker
sudo systemctl start docker
11.2 权限不足
# 将用户加入 docker 组
sudo usermod -aG docker ${USER}
11.3 镜像拉取失败(网络问题)
- 检查代理设置
- 配置国内镜像加速器
- 尝试换源
11.4 端口冲突
# 查看端口占用
netstat -tulpn | grep <端口号>
# 更换映射端口
docker run -d -p 8081:80 nginx:latest
总结
本文系统性地讲解了 Docker 的完整知识体系,从核心概念(镜像、容器、仓库)到多平台安装(Ubuntu、CentOS、Windows、macOS),从基础操作到进阶实践(Dockerfile 编写、数据持久化、网络配置、Docker Compose 编排、安全加固)。
掌握 Docker 是进入云原生和 DevOps 世界的基石。建议读者在实际项目中逐步实践,将理论知识转化为实战能力。随着容器技术的不断发展,Docker 仍在持续演进——2025 年的 Docker 已从单纯的容器引擎发展为完整的云原生开发平台,值得持续关注和学习。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)