先把实测边界写在最前面
这台写作环境当前没有 Docker CLI。因此下面会解释容器、镜像、Registry、Dockerfile 和 Compose,也会给出一条可以核对的学习路径,但不会出现“我刚刚在本机跑通”的结论。
示例命令来自 Docker 官方文档。安装器、系统要求和许可可能变化,真正操作时仍要打开当天的官方页面。
我宁愿把这条限制写清,也不愿放一张别人的终端截图冒充实测。教程是否可信,不取决于截图多不多,而取决于官方事实、示例命令和作者亲自验证的部分有没有被分开。
Docker 解决的是“运行环境怎样一起交付”
Docker 官方把它描述为开发、交付和运行应用的平台。它可以把应用和运行所需环境放进相对隔离的容器,让同一份交付单元在不同机器上更容易保持一致。
没有 Docker 时,一个项目的运行条件可能散落在很多地方:
- 需要哪个 Node.js 或 Python 版本。
- 要安装哪些系统库。
- 环境变量放在哪里。
- 启动哪个命令。
- 数据保存在哪。
- 哪个端口向外提供服务。
Docker 不会自动替你做对这些决定,但它迫使项目把它们写进镜像和运行配置。别人拿到的不是一句“我的电脑能跑”,而是一组可重复执行的说明。
容器不是一台小型虚拟机
容器和虚拟机都能隔离环境,但边界不同。
虚拟机通常包含完整客体操作系统;容器共享宿主机内核,并通过操作系统能力隔离进程、网络和文件系统。因此容器通常更轻量,但它不是天然安全区,也不是任何系统都完全相同。
对新手来说,不必先研究内核细节,只要记住:
- 容器不是普通文件夹。
- 容器也不是另一台完整电脑。
- 它是受配置约束的一组运行进程与文件系统视图。
- 挂载目录、开放端口和提高权限都会改变隔离边界。
四个词必须分开
镜像:创建容器的只读模板
镜像包含应用文件、依赖和构建步骤。官方文档把镜像描述为创建容器的只读模板。
镜像不是正在运行的程序,也不等于源码仓库。一个镜像可以创建多个容器。
容器:镜像的可运行实例
容器是镜像被启动后的实例。它可以启动、停止、移动或删除。
容器内部没有保存到持久存储的变化,在容器删除后可能消失。把数据库只留在容器可写层,是新手常见的数据丢失原因。
Registry:保存和分发镜像的仓库
Docker Hub 是常见公共 Registry。docker pull 会拉取镜像,docker push 会上传镜像。
公共仓库里的镜像不因为能下载就一定可信。使用前要看来源、维护状态、标签、签名或供应链信息。
Dockerfile 与 Compose:两种不同说明
Dockerfile 说明怎样构建一个镜像,例如使用哪个基础镜像、复制哪些文件、安装什么依赖和默认执行什么。
Compose 文件描述一组容器怎样一起运行,例如网页、数据库和缓存怎样连接、开放端口、挂载数据卷和读取环境变量。
Dockerfile 更像“怎样做出这个运行包”,Compose 更像“这些运行包怎样组成一个应用”。
一条 docker run 命令背后发生什么
Docker 官方示例使用下面的结构启动 Ubuntu 容器:
docker run -i -t ubuntu /bin/bash
根据官方说明,如果本地没有 ubuntu 镜像,Docker 会先从配置的 Registry 拉取;然后创建容器、分配可写层、配置网络、启动容器,并在其中执行 /bin/bash。
参数含义是:
- docker run:创建并启动容器。
- -i:保持标准输入。
- -t:分配交互终端。
- ubuntu:使用的镜像名。
- /bin/bash:容器启动后执行的命令。
输入 exit 后,命令结束,容器停止,但默认不会自动删除。这个例子帮助理解对象关系,不代表它适合直接部署生产服务。
第一次学习应该按什么顺序
1. 确认系统支持方式
从 Docker 官方安装页面确认 macOS、Windows 或 Linux 的当前要求。Apple Silicon、Intel、Windows 虚拟化设置和 Linux 发行版会影响安装路径。
不要从未知下载站获取安装器。
2. 确认客户端和引擎都能响应
安装后,先查看版本与系统信息:
docker version
docker info
docker 命令存在但引擎没有启动时,第一条可能只能显示部分信息。不要把“命令找得到”当成 Docker 已完整运行。
3. 跑一个可丢弃的官方入门示例
目标是看懂镜像拉取、容器创建、输出和停止,不是立刻部署数据库。
操作后学会查看:
docker ps
docker ps -a
docker images
它们分别帮助区分正在运行的容器、所有容器和本地镜像。
4. 再学习端口映射
容器内程序监听 80,不代表宿主机 80 自动开放。运行配置需要明确把宿主机端口映射到容器端口。
端口映射还不等于公网可访问;宿主机防火墙、云安全组和程序监听地址仍然会影响结果。
5. 最后学习持久数据
数据库和用户文件要存进命名卷或明确挂载目录。删除容器前,必须知道数据到底在哪。
先做一次“停止、删除容器、重新创建、数据仍然存在”的实验,再把真实数据放进去。
阅读第三方 Compose 文件时看哪里
运行 docker compose up 之前,至少检查:
- image:镜像来自哪里,标签是否固定。
- build:会执行哪个 Dockerfile。
- ports:哪些宿主机端口会开放。
- volumes:哪些本地目录会被读写。
- environment:是否读取密钥和内部地址。
- privileged:是否请求高权限。
- network_mode:网络隔离是否被改变。
- restart:程序是否会在后台持续重启。
- command:默认启动命令是否被覆盖。
Compose 文件是可执行配置,不是普通说明文档。来源不明时,不要因为教程说“复制运行”就直接交出主目录和 Docker Socket。
三类失败要分开
安装层
安装器打不开、系统不支持、虚拟化不可用。先确认系统和官方要求,不要改项目代码。
引擎层
docker 命令存在,但无法连接 daemon。检查 Docker Desktop 或系统服务是否启动、当前用户是否有权限。
容器层
镜像能拉取,容器却立即退出。查看容器状态和日志:
docker ps -a
docker logs CONTAINER_NAME_OR_ID
CONTAINER_NAME_OR_ID 是占位符。日志能告诉你应用进程为何结束。
访问层
容器显示运行,但浏览器打不开。检查端口映射、程序监听地址、宿主机端口占用和防火墙。不要先删除镜像重装。
Docker 没有替你解决什么
它不会自动:
- 修复应用 bug。
- 备份数据库。
- 隐藏写进镜像的密钥。
- 保护所有公开端口。
- 更新有漏洞的基础镜像。
- 让 Linux、macOS 和 Windows 行为完全相同。
- 判断第三方 Compose 是否安全。
- 替你监控生产服务。
容器让运行边界更明确,不代表运维消失。
什么时候暂时不需要 Docker
如果你只是运行一个简单脚本,官方已经提供清楚的本地安装方式,而且没有复杂依赖,Docker 可能增加一层学习成本。
如果项目本身没有 Dockerfile 或 Compose,你也不必为了“显得专业”强行容器化。
Docker 最有价值的场景,是环境需要被重复交付、多个服务需要一起运行,或者开发与部署之间需要更一致的边界。
第一次学习 Docker,不用背完命令。只要能把镜像、容器、Registry、数据卷和端口放到正确层级,再亲手验证一次“删容器但数据还在”,就已经够进入下一个项目。
SOURCE AND VERIFICATION
来源与核验边界
nbvil 链接仅作为选题入口;概念和安装边界以 Docker 官方文档为准。本机当前没有 Docker CLI,因此本文不伪造运行截图或成功结果。
- docs.docker.com/get-started/docker-overview/
- docs.docker.com/get-started/
- docs.docker.com/get-started/get-docker/
- blog.nbvil.com/blog/docker
核验状态:官方文档核验;本机未安装 Docker,不声称本地运行结果,核验日期 2026-08-11。
ONE PRACTICAL NEXT STEP
把你的真实流程带过来
如果你已经知道目标,却不知道应该先改工具、流程还是内容,把当前步骤和失败证据发来。我会先帮你判断最短路径。
带着你的安装卡点来判断