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

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐