Docker 简介与完全安装指南:从入门到实践
在当今的软件开发领域,Docker 已经成为不可或缺的技术栈。它不仅改变了软件的打包、分发和部署方式,更推动了 DevOps 文化的普及和微服务架构的落地。无论您是开发者、测试工程师还是运维人员,掌握 Docker 都将显著提升您的工作效率。
本文将为您提供 Docker 技术的全面介绍,包括核心概念解析、实际应用场景、多平台安装指南以及配置优化建议,帮助您快速入门并建立扎实的 Docker 基础。
Docker 技术简介
什么是 Docker?
Docker 是一个开源的应用容器引擎,基于 Go 语言开发并遵从 Apache 2.0 协议开源。它允许开发者将应用及其所有依赖打包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 或 Windows 机器上,也可以实现虚拟化。
Docker 如日中天,这不是单纯的炒的概念,Docker 的确解决了开发和运维的痛点,比如版本的搬迁,从测试环境搬迁到预发、生产环境,在企业开发与测试中,得到了非常广泛的应用。
Docker 的核心特性
- 开放源码:Docker 是一个开放源码的软件项目,基于 GO 语言,拥有活跃的社区支持
- 轻量级容器:Docker 可以让开发打包他们的应用以及依赖包到一个轻量级、可移植的容器中
- 跨平台部署:Docker 打包好容器,可以发布到任何流行的 Linux 机器上,也可以实现虚拟化
- 完全隔离:容器是完全使用沙箱机制,互相之间不会有任何接口,确保安全性
- 性能优异:Docker 容器性能开销极低,这个才是关键(通常只有 1-5% 的性能损耗)
- C/S 架构:Docker 使用客户端-服务器(C/S)架构模式,使用远程 API 来管理和创建 Docker 容器
Docker 的设计理念
Docker 借鉴了标准的集装箱的概念。标准的集装箱将货物运往世界各地,Docker 将这个模型运行到自己的设计中。唯一不同的是:集装箱是运输货物,Docker 是运输软件。
这种标准化的"软件集装箱"带来了革命性的变化:
- 标准化:统一的容器格式,一次构建,到处运行
- 隔离性:每个容器都有独立的文件系统、网络和资源
- 可移植性:无需关心底层基础设施差异
- 版本控制:镜像支持分层存储和版本管理
Docker vs 传统虚拟机
理解 Docker 与传统虚拟机(VM)的区别,有助于更好地选择合适的技术方案。
核心对比
| 特性 | Docker 容器 | 传统虚拟机 (VM) |
|---|---|---|
| 启动速度 | 几秒甚至毫秒级 | 几十秒到几分钟 |
| 资源占用 | 几 MB 到几百 MB | 几 GB |
| 性能损耗 | 1-5% | 10-30% |
| 隔离级别 | 进程级隔离 | 系统级隔离 |
| 密度 | 单机可运行数百个容器 | 单机通常几十个 VM |
| 操作系统 | 共享宿主机内核 | 每个 VM 独立 OS |
| 适用场景 | 微服务、持续集成 | 多租户、强隔离需求 |
架构图解
传统虚拟机架构:
┌─────────────────────────────────┐
│ 应用程序 A/B/C │
├─────────────────────────────────┤
│ Guest OS (完整操作系统) │
├─────────────────────────────────┤
│ Hypervisor (虚拟化层) │
├─────────────────────────────────┤
│ Host OS (宿主操作系统) │
├─────────────────────────────────┤
│ 硬件基础设施 │
└─────────────────────────────────┘Docker 容器架构:
┌─────────────────────────────────┐
│ 容器 A | 容器 B | 容器 C │
├─────────────────────────────────┤
│ Docker Engine (容器引擎) │
├─────────────────────────────────┤
│ Host OS (宿主操作系统) │
├─────────────────────────────────┤
│ 硬件基础设施 │
└─────────────────────────────────┘关键区别:
- VM 需要完整的 Guest OS,而容器共享宿主机内核
- Hypervisor 层较重,Docker Engine 更轻量
- 容器启动无需引导操作系统,因此速度极快
Docker 的应用场景
Docker 在现代软件开发和运维中有着广泛的应用:
1. 开发环境一致性
问题: "在我机器上是好的!"——这是开发团队最常见的抱怨。
解决方案:
- 使用 Docker 定义开发环境(Dockerfile)
- 所有开发者使用相同的容器环境
- 消除"环境差异"导致的问题
2. Web 应用自动化打包和发布
- 将 Web 应用及其依赖(Nginx、Node.js、Python 等)打包成镜像
- 一键部署到测试、预发、生产环境
- 支持蓝绿部署、滚动更新等高级发布策略
3. 自动化测试和持续集成/持续部署(CI/CD)
- 在干净的容器环境中运行测试,避免污染
- Jenkins、GitLab CI 等工具原生支持 Docker
- 并行执行多个测试任务,提升效率
4. 微服务架构
- 每个微服务运行在独立容器中
- 服务间通过网络通信,天然解耦
- 易于水平扩展和负载均衡
5. 数据库和后台应用部署
- 快速部署 MySQL、PostgreSQL、Redis 等常见服务
- 通过卷(Volume)持久化数据
- 轻松实现主从复制、集群等高可用架构
6. 环境隔离与多租户
- 在同一台机器上运行多个互不干扰的应用
- 为不同客户/项目提供隔离的运行环境
- 资源限制防止某个应用占用过多资源
7. 快速原型开发和实验
- 快速搭建临时环境进行测试
- 尝试新技术无需担心污染系统
- 用完即删,不留痕迹
Docker 的核心组件
Docker 生态系统由三个核心概念组成:镜像(Image)、容器(Container)、仓库(Registry)。
核心概念详解
| 组件 | 说明 | 类比 |
|---|---|---|
| Docker 镜像 | Docker 镜像是用于创建 Docker 容器的模板。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来。 | 类的定义 / 光盘镜像 |
| Docker 容器 | 容器是镜像的运行实例,是独立运行的一个或多个应用。镜像相当于类,容器相当于类的实例。 | 类的实例 / 运行中的程序 |
| Docker 仓库 | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub 提供了庞大的镜像集合供使用,用户也可以将自己本地的镜像推送到 Docker 仓库供其他人下载。 | Git 仓库 / 应用商店 |
其他重要组件
| 组件 | 说明 |
|---|---|
| Docker 客户端 | Docker 客户端通过命令行或者其他工具使用 Docker API 与 Docker 的守护进程通信。用户通过客户端发送指令。 |
| Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。可以是 Linux 服务器、macOS 或 Windows 机器。 |
| Docker 守护进程(Docker Daemon) | 是 Docker 服务器端进程(dockerd),负责支撑 Docker 容器的运行以及镜像的管理。监听 Docker API 请求。 |
| Dockerfile | 一个文本文件,包含构建镜像的所有指令。定义了镜像的构建步骤。 |
| Docker Compose | 用于定义和运行多容器 Docker 应用的工具。通过 YAML 文件配置应用服务。 |
| Docker Volume | 数据卷,用于持久化容器数据和在容器间共享数据。 |
| Docker Network | 网络驱动,管理容器间的通信以及容器与外部的网络连接。 |
工作流程
1. 编写 Dockerfile
↓
2. 构建镜像 (docker build)
↓
3. 推送镜像到仓库 (docker push) [可选]
↓
4. 从仓库拉取镜像 (docker pull) [可选]
↓
5. 运行容器 (docker run)
↓
6. 管理容器生命周期 (start/stop/restart)Docker 安装完全指南
Docker 支持多种操作系统,下面将详细介绍各平台的安装方法。
前置要求
在安装 Docker 之前,请确保您的系统满足以下要求:
Linux 系统:
- 64 位 CPU 架构(x86_64、amd64、armhf、arm64 等)
- Linux 内核版本 3.10 或更高版本
- 至少 1GB 可用内存(推荐 2GB+)
- 足够的磁盘空间(取决于您要运行的容器)
macOS 系统:
- macOS 10.15 (Catalina) 或更高版本
- 至少 4GB RAM
Windows 系统:
- Windows 10 64 位:专业版、企业版或教育版(Build 15063 或更高)
- Windows 11
- 启用 Hyper-V 和容器功能
方法一:Linux 系统安装(推荐)
Ubuntu / Debian 系统
步骤 1:卸载旧版本(如果存在)
sudo apt-get remove docker docker-engine docker.io containerd runc步骤 2:更新软件包索引
sudo apt-get update步骤 3:安装必要的依赖
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release步骤 4:添加 Docker 官方 GPG 密钥
# 创建目录
sudo mkdir -p /etc/apt/keyrings
# 下载 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 设置权限
sudo chmod a+r /etc/apt/keyrings/docker.gpg步骤 5:设置稳定版仓库
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null注意:如果您使用的是 Debian,将
ubuntu替换为debian。
步骤 6:安装 Docker Engine
# 更新软件包索引
sudo apt-get update
# 安装最新版本的 Docker Engine、containerd 和 Docker Compose
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin步骤 7:验证安装
# 检查 Docker 版本
docker --version
# 运行测试容器
sudo docker run hello-world如果看到 "Hello from Docker!" 的消息,说明安装成功!
CentOS / RHEL / Fedora 系统
步骤 1:卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine步骤 2:安装必要的依赖
sudo yum install -y yum-utils步骤 3:添加 Docker 仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo步骤 4:安装 Docker Engine
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin步骤 5:启动 Docker
sudo systemctl start docker
sudo systemctl enable docker步骤 6:验证安装
sudo docker run hello-world一键安装脚本(适用于大多数 Linux 发行版)
Docker 官方提供了一个便捷的安装脚本,适合快速部署:
# 下载并执行安装脚本
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh安全提示:在生产环境中,建议审查脚本内容后再执行:
bashcat get-docker.sh # 查看脚本内容
方法二:macOS 系统安装
macOS 用户使用 Docker Desktop for Mac,它提供了图形界面和完整的 Docker 功能。
步骤 1:下载安装包
访问 Docker Desktop for Mac 下载页面
根据您的芯片类型选择:
- Intel 芯片:下载
Docker Desktop for Mac (Intel) - Apple Silicon (M1/M2/M3):下载
Docker Desktop for Mac (Apple Silicon)
步骤 2:安装 Docker Desktop
- 双击下载的
.dmg文件 - 将 Docker 图标拖拽到 Applications 文件夹
- 打开 Applications 文件夹,双击 Docker.app
- 按照提示完成安装
步骤 3:启动并验证
- 在 Launchpad 中找到 Docker 并启动
- 首次启动会要求授权,点击 OK
- 等待 Docker 启动完成(菜单栏会出现 Docker 图标)
- 打开终端,运行:
docker --version
docker run hello-world使用 Homebrew 安装(可选)
如果您已安装 Homebrew,可以使用以下命令:
# 安装 Docker Desktop
brew install --cask docker
# 启动 Docker Desktop
open /Applications/Docker.app方法三:Windows 系统安装
Windows 10/11 用户使用 Docker Desktop for Windows。
前置要求
启用 WSL 2(Windows Subsystem for Linux):
- 以管理员身份打开 PowerShell
- 运行以下命令:
# 启用 WSL
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
# 启用虚拟机平台
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
# 重启计算机
Restart-Computer下载并安装 WSL 2 Linux 内核更新包: WSL2 Linux kernel update package
设置 WSL 2 为默认版本:
wsl --set-default-version 2步骤 1:下载 Docker Desktop
访问 Docker Desktop for Windows 下载页面
步骤 2:安装
- 双击下载的
.exe安装文件 - 确保勾选 "Use WSL 2 instead of Hyper-V"(推荐)
- 按照安装向导完成安装
- 重启计算机
步骤 3:启动并验证
- 从开始菜单启动 Docker Desktop
- 接受服务条款
- 等待 Docker 启动(系统托盘会出现 Docker 图标)
- 打开 PowerShell 或 CMD,运行:
docker --version
docker run hello-world方法四:其他安装方式
使用 Snap 安装(Ubuntu)
sudo snap install docker使用 Fish 包管理器安装
# Arch Linux
sudo pacman -S docker
# 启动服务
sudo systemctl start docker
sudo systemctl enable dockerDocker 配置与优化
安装完成后,进行适当的配置可以提升使用体验。
1. 配置非 root 用户使用 Docker
默认情况下,Docker 需要 root 权限。为了方便使用,可以将当前用户添加到 docker 用户组:
# 创建 docker 用户组(如果不存在)
sudo groupadd docker
# 将当前用户添加到 docker 组
sudo usermod -aG docker $USER
# 激活组更改(或重新登录)
newgrp docker
# 验证(不需要 sudo)
docker run hello-world安全提示:加入 docker 组的用户具有与 root 等效的权限,请谨慎操作。
2. 配置国内镜像加速器
由于 Docker Hub 在国外,国内访问速度较慢。建议配置镜像加速器:
创建或编辑配置文件
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://huecker.io",
"https://dockerhub.timeweb.cloud",
"https://noohub.ru"
]
}
EOF重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker验证配置
docker info | grep -A 10 "Registry Mirrors"3. 配置开机自启
# 设置 Docker 开机自启
sudo systemctl enable docker
# 查看状态
sudo systemctl status docker4. 调整存储驱动(高级)
Docker 支持多种存储驱动,默认使用 overlay2。如需调整:
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"storage-driver": "overlay2",
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
EOF
sudo systemctl restart dockerDocker 基本命令速查
安装完成后,以下是一些常用的 Docker 命令:
镜像管理
# 搜索镜像
docker search nginx
# 拉取镜像
docker pull nginx:latest
# 查看本地镜像
docker images
# 删除镜像
docker rmi <image_id>
# 构建镜像
docker build -t myapp:1.0 .容器管理
# 运行容器
docker run -d --name my-nginx -p 8080:80 nginx
# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# 停止容器
docker stop <container_id>
# 启动容器
docker start <container_id>
# 重启容器
docker restart <container_id>
# 删除容器
docker rm <container_id>
# 查看容器日志
docker logs <container_id>
# 进入容器内部
docker exec -it <container_id> /bin/bash系统管理
# 查看 Docker 信息
docker info
# 查看版本
docker version
# 清理未使用的资源
docker system prune
# 查看磁盘使用
docker system df常见问题与故障排查
问题一:Docker 服务无法启动
现象:
sudo systemctl start docker
# 报错:Failed to start docker.service解决方案:
查看详细错误信息:
bashsudo journalctl -u docker.service -n 50 --no-pager检查配置文件语法:
bashsudo dockerd --validate重置 Docker(会删除所有容器和镜像):
bashsudo systemctl stop docker sudo rm -rf /var/lib/docker sudo systemctl start docker
问题二:权限被拒绝
现象:
docker run hello-world
# Got permission denied while trying to connect to the Docker daemon socket解决方案:
使用 sudo:
bashsudo docker run hello-world或将用户加入 docker 组(见上文配置部分)
问题三:拉取镜像速度慢
现象:docker pull 非常慢或超时
解决方案:
配置国内镜像加速器(见上文配置部分)
手动指定镜像源:
bashdocker pull registry.docker-cn.com/library/nginx检查网络连接:
bashping docker.io
问题四:端口冲突
现象:
Error starting userland proxy: Bind for 0.0.0.0:80 failed: port is already allocated解决方案:
查找占用端口的进程:
bashsudo lsof -i :80停止占用端口的服务,或使用其他端口:
bashdocker run -p 8080:80 nginx
问题五:磁盘空间不足
现象:
No space left on device解决方案:
清理未使用的资源:
bash# 清理停止的容器、未使用的网络和悬空镜像 docker system prune # 清理所有未使用的镜像 docker image prune -a # 清理所有未使用的卷 docker volume prune查看磁盘使用情况:
bashdocker system df移动 Docker 数据目录到大容量磁盘:
bash# 编辑配置文件 sudo tee /etc/docker/daemon.json <<-'EOF' { "data-root": "/path/to/large/disk/docker" } EOF # 迁移现有数据 sudo systemctl stop docker sudo rsync -avz /var/lib/docker/ /path/to/large/disk/docker/ sudo systemctl start docker
问题六:容器无法访问网络
现象: 容器内无法 ping 通外部地址
解决方案:
检查防火墙规则:
bashsudo iptables -L -n重启 Docker 网络:
bashsudo systemctl restart docker检查 DNS 配置:
bash# 编辑配置文件 sudo tee /etc/docker/daemon.json <<-'EOF' { "dns": ["8.8.8.8", "114.114.114.114"] } EOF sudo systemctl restart docker
Docker 安全最佳实践
1. 不要以 root 身份运行容器
# 在 Dockerfile 中创建非 root 用户
RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser2. 限制容器资源
# 限制内存和 CPU
docker run -d --memory=512m --cpus=1.5 nginx
# 限制进程数
docker run -d --pids-limit=100 nginx3. 只读文件系统
# 以只读模式挂载文件系统
docker run -d --read-only nginx
# 需要写入时使用 tmpfs
docker run -d --read-only --tmpfs /tmp nginx4. 定期更新
# 更新 Docker Engine
sudo apt-get update
sudo apt-get upgrade docker-ce
# 更新镜像
docker pull nginx:latest5. 扫描镜像漏洞
# 安装 Trivy
sudo apt-get install trivy
# 扫描镜像
trivy image nginx:latest学习资源推荐
官方文档
在线课程
- Docker 官方认证课程(DCA)
- Udemy: Docker Mastery
- Coursera: Containerization with Docker
书籍推荐
- 《Docker 技术入门与实战》
- 《Docker Deep Dive》by Nigel Poulton
- 《Using Docker》by Adrian Mouat
社区资源
- Docker Community Forums
- Stack Overflow: docker 标签
- Reddit: r/docker
总结
通过本文的详细教程,您已经掌握了:
✅ Docker 核心概念:镜像、容器、仓库的关系和工作原理
✅ 技术优势:与传统虚拟机的对比及应用场景
✅ 多平台安装:Linux、macOS、Windows 的详细安装步骤
✅ 配置优化:用户权限、镜像加速、存储驱动等配置
✅ 常用命令:镜像和容器管理的基本操作
✅ 故障排查:6 类常见问题及解决方案
✅ 安全实践:容器安全的最佳实践
下一步学习建议
- 动手实践:尝试部署一个简单的 Web 应用(如 Nginx、WordPress)
- 学习 Dockerfile:编写自己的镜像构建文件
- 探索 Docker Compose:管理多容器应用
- 了解编排工具:学习 Kubernetes 或 Docker Swarm
- 实战项目:将现有项目容器化
Docker 是现代软件开发和运维的基石技术,掌握它将为您打开 DevOps、云计算、微服务等领域的大门。祝您学习愉快!
延伸阅读:如果您对 Docker 的其他主题感兴趣,可以查看我们的 Docker 容器管理、Docker 镜像详解、Docker 进程管理 以及 Docker 镜像源配置。