Docker 详细介绍
一、Docker 是什么
Docker 是一个开源的容器化平台,它允许开发者将应用程序及其依赖项打包到一个标准化的单元(称为容器)中,确保应用在任何环境中都能以相同的方式运行。
简单来说,Docker 解决了 "在我的机器上能运行,在你的机器上却不能运行" 的问题。它通过容器化技术,将应用与底层基础设施隔离开来,实现了 "一次构建,到处运行" 的目标。
二、常见使用场景
1. 应用开发与测试
- 开发者可以在本地创建一致的开发环境,避免因环境差异导致的问题
- 测试人员可以快速部署相同的测试环境,确保测试结果的准确性
- 前后端开发者可以在各自的容器中工作,互不干扰
2. 持续集成 / 持续部署 (CI/CD)
- 在 CI 流程中,使用 Docker 构建应用并运行自动化测试
- 在 CD 流程中,通过 Docker 容器实现应用的快速、一致部署
- 支持蓝绿部署、金丝雀发布等高级部署策略
3. 微服务架构部署
- 每个微服务可以打包为独立的 Docker 容器
- 便于单独扩展、更新和管理各个服务
- 简化微服务之间的通信和依赖管理
4. 云原生应用开发
- 与 Kubernetes 等容器编排平台紧密集成
- 适合开发弹性伸缩、高可用的云原生应用
- 支持服务网格、配置管理等云原生技术
5. 大数据与 AI 应用部署
- 快速搭建分布式计算环境
- 简化机器学习模型的训练和部署流程
- 便于在不同环境间迁移数据处理工作流
6. 隔离性环境需求
- 为不同应用创建隔离的运行环境
- 安全测试和恶意软件分析
- 临时环境搭建和资源隔离
三、使用优势与劣势
优势
- 环境一致性:容器包含应用所需的所有依赖,确保在任何环境中行为一致
- 轻量级:容器共享主机操作系统内核,比虚拟机更节省资源
- 快速启动:容器启动通常只需几秒,远快于虚拟机
- 可移植性:可以在任何支持 Docker 的环境中运行,包括物理机、虚拟机、云服务等
- 资源高效利用:能够更有效地利用系统资源,提高服务器利用率
- 版本控制:支持容器镜像的版本管理,便于回滚和追踪
- 易于扩展:可以快速复制容器实现水平扩展
- 隔离性:提供一定程度的应用隔离,增强安全性
劣势
- 安全性限制:容器共享主机内核,隔离性不如虚拟机彻底
- 学习曲线:需要学习 Docker 特定概念和命令
- 存储管理复杂:容器的临时存储特性可能导致数据管理复杂
- 网络配置复杂:容器间网络配置相对复杂,特别是在大规模部署时
- Windows 支持有限:虽然支持 Windows,但体验和功能不如 Linux 完善
- 状态管理挑战:无状态应用更适合容器化,有状态应用需要额外的状态管理策略
四、Docker 使用详细步骤
1. 安装 Docker
在 Ubuntu 上安装
# 更新 apt 包索引
sudo apt-get update# 安装必要的依赖包
sudo apt-get install ca-certificates curl gnupg lsb-release# 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg# 设置 Docker 稳定版仓库
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# 安装 Docker 引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io# 验证安装是否成功
sudo docker run hello-world
在 CentOS 上安装
# 安装必要的依赖包
sudo yum install -y yum-utils# 设置 Docker 仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 安装 Docker 引擎
sudo yum install docker-ce docker-ce-cli containerd.io# 启动 Docker
sudo systemctl start docker# 设置 Docker 开机自启
sudo systemctl enable docker# 验证安装是否成功
sudo docker run hello-world
在 Windows 或 Mac 上安装
- 下载并安装 Docker Desktop
- 安装完成后,启动 Docker Desktop 应用
2. 基本 Docker 命令
镜像操作
# 搜索镜像
docker search <镜像名称># 拉取镜像
docker pull <镜像名称>:<标签> # 标签默认为latest# 查看本地镜像
docker images# 删除镜像
docker rmi <镜像ID或名称># 构建镜像
docker build -t <镜像名称>:<标签> <Dockerfile路径>
容器操作
# 运行容器
docker run [选项] <镜像名称> [命令]# 常用选项:
# -d: 后台运行
# -p: 端口映射,格式为 主机端口:容器端口
# -v: 挂载卷,格式为主机路径:容器路径
# -e: 设置环境变量
# --name: 指定容器名称
# -it: 交互式运行# 示例: 运行一个nginx容器
docker run -d -p 80:80 --name mynginx nginx# 查看运行中的容器
docker ps# 查看所有容器(包括停止的)
docker ps -a# 启动容器
docker start <容器ID或名称># 停止容器
docker stop <容器ID或名称># 重启容器
docker restart <容器ID或名称># 删除容器
docker rm <容器ID或名称># 进入容器
docker exec -it <容器ID或名称> /bin/bash# 查看容器日志
docker logs <容器ID或名称># 查看容器详细信息
docker inspect <容器ID或名称>
3. 创建自定义 Docker 镜像
-
创建 Dockerfile
在项目根目录创建一个名为
Dockerfile
的文件,例如:# 使用官方Python镜像作为基础镜像 FROM python:3.9-slim# 设置工作目录 WORKDIR /app# 复制当前目录下的所有文件到容器的/app目录 COPY . .# 安装依赖 RUN pip install --no-cache-dir -r requirements.txt# 暴露端口 EXPOSE 5000# 容器启动时执行的命令 CMD ["python", "app.py"]
-
构建镜像
docker build -t my-python-app:1.0 .
-
运行自定义镜像
docker run -d -p 5000:5000 --name myapp my-python-app:1.0
4. Docker Compose 管理多容器应用
当应用需要多个容器协同工作时(如前端、后端、数据库),可以使用 Docker Compose 简化管理。
-
安装 Docker Compose
对于安装了 Docker Desktop 的用户,Compose 已经包含在内。Linux 用户需要单独安装:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-composesudo chmod +x /usr/local/bin/docker-compose
-
创建 docker-compose.yml 文件
version: '3'services:web:build: .ports:- "5000:5000"depends_on:- dbdb:image: postgres:13environment:- POSTGRES_USER=postgres- POSTGRES_PASSWORD=postgres- POSTGRES_DB=mydbvolumes:- postgres_data:/var/lib/postgresql/datavolumes:postgres_data:
-
使用 Docker Compose 启动应用
# 启动所有服务 docker-compose up -d# 查看服务状态 docker-compose ps# 查看日志 docker-compose logs# 停止服务 docker-compose down# 停止服务并删除数据卷 docker-compose down -v
5. 数据持久化
Docker 容器默认是临时的,为了持久化数据,需要使用数据卷:
# 创建数据卷
docker volume create mydata# 查看数据卷
docker volume ls# 查看数据卷详情
docker volume inspect mydata# 使用数据卷运行容器
docker run -d -v mydata:/app/data --name myapp myimage# 挂载主机目录到容器
docker run -d -v /host/path:/container/path --name myapp myimage
五、总结
Docker 作为容器化技术的代表,已经成为现代软件开发和部署的重要工具。它通过容器化解决了环境一致性问题,简化了应用的部署和扩展流程。
虽然 Docker 有一定的学习曲线和局限性,但其优势在大多数场景下远大于劣势,特别是在微服务、云原生和 DevOps 实践中表现突出。
掌握 Docker 的基本使用是现代开发者的重要技能,通过本文介绍的步骤,你可以开始使用 Docker 并逐步深入探索其更多高级特性。