AI摘要
北海のAI

Docker 核心概念与实战指南

1. 基础概念体系

1.1 核心定义

  • Docker:一种依赖高效的软件部署技术,利用容器化技术封装独立的运行环境。
  • 宿主机 Host:承载容器运行的物理机或虚拟机。

1.2 核心三要素类比

概念 英文 类比对象 描述
镜像 Image 模具 / 游戏安装包 只读模板,是创建容器的基石。
容器 Container 糕点 / 运行中的游戏 基于镜像运行的实例,可读写,相互隔离。
仓库 Registry 商店 / 代码仓库 存放和分享镜像的场所,如 Docker Hub。

1.3 容器与虚拟机对比

  • Docker 容器:共享宿主机操作系统内核,启动秒级,资源占用极小(MB级)。
  • 虚拟机 VM:拥有完整的操作系统内核,启动慢(分钟级),资源占用大(GB级)。

2. 环境搭建与安装

2.1 Linux 环境安装 推荐方案

Linux 是 Docker 的原生环境,性能最好。

1
2
3
4
5
6
7
8
9
10
# 1. 自动下载并安装 官方脚本
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# 2. 启动 Docker 服务
sudo systemctl start docker
sudo systemctl enable docker

# 3. 验证安装
sudo docker version

2.2 Windows 环境安装

Windows 下 Docker 依赖 WSL2 即适用于 Linux 的 Windows 子系统。

  1. 启用系统功能:在“启用或关闭 Windows 功能”中勾选:
    • Hyper-V 部分版本需要
    • Virtual Machine Platform 虚拟机平台
    • Windows Subsystem for Linux
  2. 安装更新 WSL 管理员 CMD 中执行:
    1
    2
    wsl --update
    wsl --set-default-version 2
  3. 安装软件:下载并安装 Docker Desktop for Windows
  4. 注意:使用时需保持 Docker Desktop 软件在后台运行。

2.3 Mac 环境安装

  1. 确认芯片架构
    • Intel 芯片:下载 Mac with Intel chip 版本。
    • M1/M2/M3 芯片:下载 Mac with Apple silicon 版本。
  2. 安装:拖拽至 Applications 文件夹并启动即可。

3. 镜像管理与配置

对于需要的镜像可以直接去这个网站找去:https://hub.docker.com/

3.1 基础镜像命令

1
2
3
4
5
6
7
8
9
10
11
12
# 1. 下载镜像
# 格式: docker pull [registry/][namespace/]image_name[:tag]
docker pull nginx:latest # 下载官方最新版
docker pull mysql:5.7 # 下载指定版本

# 2. 查看本地镜像
docker images

# 3. 删除镜像
docker rmi <镜像ID或名称>
# 强制删除 如果镜像正在被使用
docker rmi -f <镜像ID或名称>

3.2 配置镜像加速器

由于 Docker Hub 服务器在国外,国内访问经常超时,必须配置国内镜像源

Linux 配置方法
编辑 /etc/docker/daemon.json 文件(若不存在则创建):

1
2
3
4
5
6
7
8
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://huecker.io",
"https://docker.nju.edu.cn",
"https://mirror.baidubce.com"
]
}

注意

  • 推荐源:南京大学 docker.nju.edu.cn、DaoCloud docker.m.daocloud.io 较为稳定。
  • 私人源:阿里云容器镜像服务(免费)会提供一个专属的加速地址(如 https://xxxx.mirror.aliyuncs.com),最为稳定,建议去阿里云官网申请。

生效命令

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

Windows 与 Mac 配置方法

  1. 打开 Docker Desktop 设置 Settings。
  2. 进入 Docker Engine 选项卡。
  3. 在 JSON 编辑框中添加 "registry-mirrors" 字段(内容同上)。
  4. 点击 Apply & Restart

3.3 CPU 架构兼容性

  • AMD64 x86_64:标准的 Windows/Linux 服务器架构。
  • ARM64:Mac M系列芯片和部分移动端架构。
  • 机制docker pull 会自动拉取匹配当前架构的镜像。Mac 上运行 AMD64 镜像时,Docker 会自动使用 QEMU 进行转译,但性能会有所损耗。

4. 容器生命周期管理

4.1 创建并启动容器 docker run

这是最高频使用的命令,参数极其重要。

1
2
3
4
5
6
7
8
9
10
# 语法模板
docker run [选项] 镜像名 [命令]

# 实战示例:启动一个 Nginx Web 服务器
docker run -d \
--name my-nginx \
-p 8080:80 \
-v /home/data:/usr/share/nginx/html \
--restart always \
nginx:latest

参数详解

  • -d Detached:后台静默运行。
  • --name:给容器起一个好记的名字。
  • -p Port:宿主机端口:容器端口。将访问宿主机的 8080 转发到容器的 80。
  • -v Volume:宿主机路径:容器路径。挂载数据卷,实现数据持久化。
  • -e Environment:设置环境变量(如数据库密码 -e MYSQL_ROOT_PASSWORD=123)。
  • --restart always:开机自启,或挂掉后自动重启。

4.2 数据卷挂载类型

类型 示例命令 特点
绑定挂载 Bind Mount -v /opt/data:/data 宿主机路径固定,适合开发调试。会覆盖容器内原有文件
命名卷 Named Volume -v my-vol:/data 由 Docker 自动管理路径。会保留容器内原有文件并同步,适合生产环境数据库存储。

卷管理命令

1
2
3
4
docker volume create my-vol  # 创建卷
docker volume ls # 查看所有卷
docker volume inspect my-vol # 查看卷在宿主机的真实路径
docker volume prune # 清理未使用的卷

4.3 容器调试与交互

1
2
3
4
5
6
7
8
9
10
# 1. 查看容器日志 排错必备
# -f 表示实时跟踪日志输出
docker logs -f <容器名或ID>

# 2. 进入容器内部 类似于 SSH 登录
# /bin/bash 或 /bin/sh 是容器内的 Shell 程序
docker exec -it <容器名或ID> /bin/bash

# 3. 查看容器详细信息 IP、配置等
docker inspect <容器名或ID>

4.4 容器状态控制

1
2
3
4
5
6
docker ps           # 查看运行中的容器
docker ps -a # 查看所有容器 含已停止
docker stop <ID> # 停止
docker start <ID> # 启动 保留之前的配置
docker restart <ID> # 重启
docker rm <ID> # 删除容器 需先停止

5. 镜像构建 Dockerfile

Dockerfile 是构建镜像的“施工图纸”。

5.1 核心指令解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 1. 指定基础镜像 必选
FROM node:14-alpine

# 2. 设置工作目录 后续命令都在此目录下执行
WORKDIR /app

# 3. 拷贝文件 宿主机 -> 镜像内
COPY package.json .

# 4. 构建时运行的命令 如安装依赖
RUN npm install

# 5. 拷贝源代码
COPY . .

# 6. 声明服务端口 仅作为文档说明
EXPOSE 3000

# 7. 容器启动时的入口命令
CMD ["npm", "start"]

5.2 构建与发布流程

1
2
3
4
5
6
7
8
9
# 1. 登录 Docker Hub
docker login

# 2. 构建镜像
# -t 指定名称:标签,最后的 . 代表 Dockerfile 所在目录
docker build -t my-username/my-app:v1.0 .

# 3. 推送至远程仓库
docker push my-username/my-app:v1.0

6. 网络模式详解

Docker 容器默认处于隔离网络中,需通过网络模式进行通信。

6.1 三大核心网络模式对比

模式名称 命令参数 特点描述 适用场景
Bridge 桥接模式 --network bridge 默认模式。容器拥有独立的 IP (如 172.17.x.x),与宿主机网络隔离,必须通过端口映射 (-p) 才能对外服务。 绝大多数单机容器应用。
Host 主机模式 --network host 容器直接共享宿主机的 IP 和网络栈。没有 IP 隔离,无需端口映射,容器端口直接占用宿主机端口。 对网络性能要求极高,或端口映射过于繁琐的场景。
None 无网络 --network none 容器只有 loopback 接口,无法联网。 安全性要求极高的离线任务或批处理作业。

6.2 自定义网络与服务发现

为什么需要自定义网络?
默认的 Bridge 网络虽然可以通信,但容器之间只能通过 IP 访问(IP 可能会变)。自定义网络的核心优势在于内置 DNS 服务发现,容器之间可以直接通过 “容器名” 进行通信。

实战操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1. 创建自定义网络
# 默认驱动为 bridge
docker network create my-net

# 2. 启动数据库容器并加入网络
docker run -d --name db --network my-net mysql:5.7

# 3. 启动 Web 容器并加入同一网络
docker run -d --name web --network my-net nginx:latest

# 4. 验证 DNS 解析
# 进入 web 容器,直接 ping 数据库容器的名字 "db"
docker exec -it web ping db
# 结果:PING db (172.18.0.2): 56 data bytes... (解析成功)

6.3 网络管理与排错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 列出所有网络
docker network ls

# 查看特定网络详情
# 包含子网段、网关、连接在此网络上的容器列表
docker network inspect my-net

# 断开容器与网络的连接
docker network disconnect my-net web

# 连接容器到网络
docker network connect my-net web

# 删除网络 只有未被使用的网络才能删除
docker network rm my-net

7. 容器编排 Docker Compose

7.1 核心作用与架构

Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。它解决了手动执行大量 docker run 命令的痛点。

  • 工程化:通过一个 YAML 文件配置应用的所有服务。
  • 一键管理:一条命令即可启动、停止、重启整个应用栈。
  • 服务依赖:可以定义容器启动的先后顺序。

7.2 配置文件详解 docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
version: '3.8'  # Compose 文件格式版本

services: # 定义服务集合
# 服务1: 前端 Web 应用
web-app:
image: nginx:latest
container_name: my-web # 指定容器名,不指定则自动生成
ports:
- "8080:80" # 端口映射
volumes:
- ./html:/usr/share/nginx/html # 挂载当前目录下的 html 文件夹
depends_on:
- redis-cache # 依赖声明:确保 Redis 启动后才启动 Web
networks:
- backend-net # 加入指定网络
environment:
- APP_ENV=production # 环境变量

# 服务2: Redis 缓存
redis-cache:
image: redis:alpine
command: redis-server --appendonly yes # 覆盖镜像默认启动命令
volumes:
- redis-data:/data # 使用命名卷
networks:
- backend-net
restart: always # 重启策略:总是自动重启

# 定义网络
networks:
backend-net:
driver: bridge

# 定义数据卷
volumes:
redis-data: # 自动创建持久化卷

7.3 环境变量管理 .env

在项目根目录创建 .env 文件,Compose 会自动读取,避免敏感信息硬编码在 YAML 中。

文件内容 (.env):

1
2
DB_PASSWORD=secret123
DB_PORT=3306

YAML 中调用:

1
2
environment:
- MYSQL_ROOT_PASSWORD=${DB_PASSWORD}

7.4 常用管理命令清单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 启动所有服务
# -d: 后台运行
docker compose up -d

# 查看当前工程下的容器状态
docker compose ps

# 查看服务日志
# -f: 实时刷新
docker compose logs -f [服务名]

# 进入某个服务的容器内部
docker compose exec [服务名] /bin/bash

# 停止并移除容器、网络
# 会保留数据卷
docker compose down

# 停止并移除容器、网络以及数据卷 (慎用,彻底清理)
docker compose down -v

# 重启单个服务
docker compose restart web-app

8. 总结

  • 重点掌握 docker rundocker psdocker logsdocker exec 这四个命令。
  • 理解 卷 Volume 的数据持久化机制和 网络 Network 的通信机制(特别是自定义网络的 DNS 解析)。
  • 学会编写 Dockerfile 定制专属镜像,并使用 Docker Compose 管理复杂的微服务架构。