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 云服务器为例,通过官方脚本快速安装:
- 访问
get.docker.com获取安装步骤。 - 执行第一步命令配置环境变量,第四步命令下载并安装。
- 权限注意:如果当前用户不是 root(如 Ubuntu 默认用户),需在所有 Docker 命令前加
sudo。 - 国内网络建议配置镜像站以避免下载失败,修改配置文件
/etc/docker/daemon.json添加 registry mirrors,然后重启 Docker 服务 (systemctl restart docker)。
2.2 Windows 系统安装
- 开启功能:在任务栏搜索“启用或关闭 Windows 功能”,勾选
Virtual Machine Platform(虚拟机平台)和适用于 Linux 的 Windows 子系统(WSL)。 - 重启电脑:确保更改生效。
- 设置默认版本:打开管理员命令提示符(CMD),输入
wsl --set-default-version 2。 - 安装 WSL:运行
wsl --install,若在国内网络建议加上--web-download参数防止下载中断。 - 安装 Docker Desktop:根据 CPU 架构(通常是 AMD64)下载对应安装包,一路点击下一步即可。指定安装目录可使用命令行参数。
- 验证:运行
docker --version查看版本号,确保安装成功。
2.3 macOS 系统安装
Mac 是最简单的安装环境:
- 根据芯片架构(Intel 或 Apple Silicon)下载对应的
.pkg安装包。 - 直接拖拽安装至 Applications 文件夹。
- 启动 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 构建与推送流程
- 构建镜像:
- 命令:
docker build -t <镜像名>:<版本号> . - 注意:最后一个点
.代表当前构建上下文目录。
- 命令:
- 登录 Docker Hub:
- 命令:
docker login,按提示输入用户名和密码完成验证。
- 命令:
- 标记镜像:
- 为了推送到个人仓库,镜像名需带上用户名作为命名空间,如
username/nginx:latest。
- 为了推送到个人仓库,镜像名需带上用户名作为命名空间,如
- 推送镜像:
- 命令:
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 前端管理工具。
- 操作:
- 创建自定义网络:
docker network create network1。 - 启动 MongoDB 加入网络:
docker run --network network1 ...。 - 启动 Mongo Express 加入同一网络:
docker run --network network1 -e MONGO_HOST=mongodb ...。 - 结果: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 内核的两项原生功能实现容器化:
- Cgroups:限制和隔离进程的资源使用(CPU、内存、带宽),确保单个容器不影响宿主机或其他容器。
- Namespaces:隔离进程的视图(PID、网络、文件目录),使容器内部看起来像一个独立的操作系统。
容器本质上是特殊的进程,通过上述机制实现了轻量级的环境隔离。