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 内存
安装步骤
  1. 启用 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
    
  2. 下载 Docker Desktop for Windows:访问 Docker 官网 下载安装包

  3. 安装:双击 .exe 安装包,安装时勾选“启用 WSL 2 集成”

  4. 启动并配置:启动 Docker Desktop → Settings → General → 勾选 “Use the WSL 2 based engine” → Apply & Restart

  5. 验证:在 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 以上内存
安装步骤
  1. 下载 Docker Desktop for Mac:访问 Docker 官网 下载 .dmg 安装包

  2. 安装:双击 .dmg 文件,将 Docker 图标拖入 Applications 文件夹

  3. 启动:从 Applications 中启动 Docker Desktop

  4. 配置(M1/M2 芯片):安装时勾选“使用 Rosetta 翻译”

  5. 验证:在终端中运行:

    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. 选择合适的基础镜像

  • 优先使用官方镜像
  • 选择精简版镜像(如 alpineslim)以减小体积

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 已从单纯的容器引擎发展为完整的云原生开发平台,值得持续关注和学习。

更多推荐