Skip to content

40 分钟 Docker 实战攻略笔记 ​

1. Docker 核心概念与原理 ​

1.1 容器化技术与虚拟机对比 ​

Docker 是目前最成熟高效的软件部署技术,其核心在于容器化。简单来说,它利用容器化技术为应用程序封装独立的运行环境,每个运行环境即为一个容器。运行容器的计算机被称为宿主机。

理解 Docker 的关键在于区分它与虚拟机的差异:

  • 内核共享:Docker 容器之间共用同一个系统内核。
  • 完整内核:每个虚拟机都包含一个操作系统的完整内核。
  • 性能优势:由于无需重复加载操作系统内核,Docker 容器比虚拟机更轻、更小,启动速度更快。

1.2 镜像与容器的关系 ​

镜像是容器的模板,可以类比为软件的安装包。容器则是安装出来的软件实例。

  • 模具与糕点比喻:镜像就像做糕点的模具,容器就像用模具做出来的糕点。
  • 复用性:使用一个模具(镜像)可以制作出许多个糕点(容器)。
  • 分享机制:我们可以将模具分享给他人使用,这就涉及到了Docker 仓库。

1.3 Docker 仓库与镜像注册表 ​

Docker 仓库是用来存放和分享镜像的地方,任何人都可以上传或下载。

  • Docker Hub:这是 Docker 的官方仓库,存储了大量社区分享的镜像。
  • Registry(注册表):指仓库地址,如 Docker.io。
  • Repository(镜像库):由“注册表 + 命名空间 + 镜像名”组成,存放同一个镜像的不同版本。例如 nginx 在 library 命名空间下。
  • Tag(标签):冒号后面的部分表示版本号(如 latest),不写默认为最新版。

“了解这些概念就足够使用 Docker 的了。” —— 视频核心观点


2. Docker 跨平台安装指南 ​

Docker 基于 Linux 容器化技术,Windows 和 Mac 本质上是通过虚拟化 Linux 子系统来运行 Docker。最佳实战环境推荐使用 Linux 宿主机。

2.1 Linux 系统安装 ​

以 Ubuntu 云服务器为例,通过官方脚本快速安装:

  1. 访问 get.docker.com 获取安装步骤。
  2. 执行第一步命令配置环境变量,第四步命令下载并安装。
  3. 权限注意:如果当前用户不是 root(如 Ubuntu 默认用户),需在所有 Docker 命令前加 sudo。
  4. 国内网络建议配置镜像站以避免下载失败,修改配置文件 /etc/docker/daemon.json 添加 registry mirrors,然后重启 Docker 服务 (systemctl restart docker)。

2.2 Windows 系统安装 ​

  1. 开启功能:在任务栏搜索“启用或关闭 Windows 功能”,勾选 Virtual Machine Platform(虚拟机平台)和 适用于 Linux 的 Windows 子系统(WSL)。
  2. 重启电脑:确保更改生效。
  3. 设置默认版本:打开管理员命令提示符(CMD),输入 wsl --set-default-version 2。
  4. 安装 WSL:运行 wsl --install,若在国内网络建议加上 --web-download 参数防止下载中断。
  5. 安装 Docker Desktop:根据 CPU 架构(通常是 AMD64)下载对应安装包,一路点击下一步即可。指定安装目录可使用命令行参数。
  6. 验证:运行 docker --version 查看版本号,确保安装成功。

2.3 macOS 系统安装 ​

Mac 是最简单的安装环境:

  1. 根据芯片架构(Intel 或 Apple Silicon)下载对应的 .pkg 安装包。
  2. 直接拖拽安装至 Applications 文件夹。
  3. 启动 Docker Desktop 即可使用。

3. 常用 Docker 命令详解 ​

3.1 镜像管理命令 ​

  • docker pull:从仓库拉取镜像。
    • 格式示例:docker pull nginx(默认从官方 library 拉取最新 tag)。
    • 完整格式:docker pull [registry]/[namespace]/[image]:[tag]。
    • 架构适配:某些特定架构(如树莓派的 ARM64)需确认镜像支持,否则可能无法运行。
  • docker images:列出本地所有下载的镜像。显示 ID、仓库名、标签等。
  • docker rmi:删除镜像。可接镜像 ID 或名称。强制删除正在运行的容器需用 docker rm -f <container_id>。

3.2 容器生命周期管理 ​

  • docker ps:查看正在运行的容器。
    • -a 参数:查看所有容器(包括已停止的)。
  • docker stop:停止容器运行。
  • docker start:重新启动已停止的容器。保留之前的端口映射、挂载卷和环境变量配置。
  • docker rm:删除容器。运行中的容器需加 -f 强制删除。
  • docker logs:查看容器日志。
    • -f 参数:实时滚动查看日志输出。

3.3 容器内部调试 ​

  • docker exec:在正在运行的容器内执行命令。
    • 交互模式:docker exec -it <container_name> bash 进入交互式 shell。
    • 非交互模式:docker exec <container_name> ps -ef 查看进程。
  • docker inspect:查看容器的详细元数据信息(JSON 格式),包括 IP 地址、挂载路径、端口映射等。复杂信息可直接发送给 AI 助手分析。
  • docker create:仅创建容器但不立即启动,后续需配合 docker start 使用。

4. Docker Run 关键参数实战 ​

docker run 是最重要的命令,用于基于镜像创建并运行容器。

4.1 基础运行参数 ​

  • -d (Detached):后台运行模式。容器不会占用当前终端窗口,适合长期服务。
  • --name:自定义容器名称。名称在宿主机上必须唯一,便于记忆和管理。
  • --restart:配置重启策略。
    • always:只要容器停止(包括崩溃或断电)则立即重启。
    • on-failure / unless-stopped:类似 always,但手动停止后不会自动重启,适合生产环境。
  • -it:交互式运行,常用于临时调试。通常配合 --rm 使用,退出时自动删除容器。

4.2 网络与端口映射 ​

  • -P:随机映射端口。
  • -p:指定端口映射。格式为 宿主机端口:容器端口。
    • 示例:-p 80:80 将宿主机的 80 端口转发到容器内的 80 端口。
    • 原因:容器网络与宿主机隔离,默认无法直接访问容器内部服务。

4.3 文件持久化与挂载 ​

容器删除后,内部数据会丢失。需使用挂载卷(Volume)实现数据持久化。

  • 绑定挂载 (-v):将宿主机目录直接映射到容器。
    • 格式:-v 宿主机路径:容器路径。
    • 风险:若宿主机目录为空,可能会覆盖容器内原有数据(如 Nginx 默认网页变为空导致 403 错误)。
  • 命名卷挂载:
    • 创建:docker volume create <volume_name>。
    • 挂载:-v <volume_name>:<container_path>。
    • 优势:Docker 会自动初始化目录内容,且独立于宿主机文件系统结构,更安全。
    • 管理命令:docker volume ls(列表)、docker volume rm(删除)、docker volume prune(清理未使用的卷)。

4.4 环境变量传递 ​

  • -e:向容器内传递环境变量。
    • 场景:数据库通常需要设置账号密码。
    • 示例:-e MYSQL_ROOT_PASSWORD=mysecret。
    • 查阅方式:参考 Docker Hub 文档或 GitHub 仓库说明。

5. Dockerfile 与镜像构建推送 ​

5.1 Dockerfile 编写规范 ​

Dockerfile 是制作镜像的图纸,包含一系列指令。

  • FROM:指定基础镜像(如 python:3.13-slim)。
  • WORKDIR:设置工作目录(类似 cd 命令)。
  • COPY:将本地文件复制到镜像中(. 代表当前目录)。
  • RUN:在镜像构建过程中执行命令(如 pip install)。
  • EXPOSE:声明容器提供的端口(仅为提示,实际映射仍靠 -p)。
  • CMD:容器启动时的默认执行命令。建议使用数组格式避免空格解析问题。
  • ENTRYPOINT:优先级高于 CMD,不易被覆盖。

5.2 构建与推送流程 ​

  1. 构建镜像:
    • 命令:docker build -t <镜像名>:<版本号> .
    • 注意:最后一个点 . 代表当前构建上下文目录。
  2. 登录 Docker Hub:
    • 命令:docker login,按提示输入用户名和密码完成验证。
  3. 标记镜像:
    • 为了推送到个人仓库,镜像名需带上用户名作为命名空间,如 username/nginx:latest。
  4. 推送镜像:
    • 命令:docker push username/image_name。
    • 成功后可在 Docker Hub 网页端搜索并下载该镜像。

6. Docker 网络模式解析 ​

Docker 容器默认连接在桥接网络(Bridge)上,可通过不同模式实现网络通信。

6.1 网络模式分类 ​

  • Bridge(桥接模式):默认模式。容器分配私有 IP(如 172.17.x.x),通过 NAT 访问外网,容器间可通过内部 IP 通信。
  • Host(主机模式):
    • 容器直接共享宿主机的网络栈。
    • 无需端口映射,直接使用宿主机 IP 和端口。
    • 优势:解决部分棘手网络问题,性能损耗最小。
  • None(无网络模式):容器完全断网,无网络接口。
  • Custom Network(自定义网络):
    • 使用 docker network create 创建子网。
    • 同一子网内的容器可通过容器名互相访问(内置 DNS 机制),无需硬编码 IP。

6.2 多容器通信实战 ​

  • 场景:MongoDB 数据库 + Mongo Express 前端管理工具。
  • 操作:
    1. 创建自定义网络:docker network create network1。
    2. 启动 MongoDB 加入网络:docker run --network network1 ...。
    3. 启动 Mongo Express 加入同一网络:docker run --network network1 -e MONGO_HOST=mongodb ...。
    4. 结果:Mongo Express 通过容器名 mongodb 即可解析并连接数据库,无需知道具体 IP。

7. Docker Compose 容器编排 ​

当应用包含多个模块(前端、后端、数据库)时,手动执行多条 docker run 命令效率低下且容易出错。Docker Compose 通过 YAML 文件管理多容器应用。

7.1 核心概念 ​

  • Services:对应一个个容器,类似于 docker run 的参数集合。
  • YAML 文件结构:
    • services:定义服务列表。
    • image:指定镜像。
    • ports:对应 -p 参数。
    • volumes:对应 -v 参数。
    • environment:对应 -e 参数。
    • networks:自动创建子网,容器默认互通,无需手动指定 IP。
    • depends_on:定义启动顺序依赖(如先启动 DB 再启动 Web)。

7.2 常用操作命令 ​

  • docker-compose up:启动文件中定义的所有容器。
    • -d:后台运行。
    • 首次执行会自动创建网络和容器。
    • 容器名默认带项目前缀(如 project_service_1)。
  • docker-compose down:停止并删除容器及关联资源。
  • docker-compose stop:仅停止容器,保留数据。
  • docker-compose start:启动已停止的容器。
  • 指定文件名:若非标准文件名 docker-compose.yml,可使用 -f 参数指定,如 docker-compose -f my-compose.yml up。

7.3 AI 辅助生成 ​

在 AI 时代,可以直接将想要的 Docker 运行命令告诉 AI,让其生成对应的 Docker Compose YAML 文件,降低编写门槛。


8. 技术原理补充 ​

Docker 利用了 Linux 内核的两项原生功能实现容器化:

  1. Cgroups:限制和隔离进程的资源使用(CPU、内存、带宽),确保单个容器不影响宿主机或其他容器。
  2. Namespaces:隔离进程的视图(PID、网络、文件目录),使容器内部看起来像一个独立的操作系统。

容器本质上是特殊的进程,通过上述机制实现了轻量级的环境隔离。

📖本文阅读--次|📊全站访问--次|👥访客--人